XCTF 进阶 RE key、simple-check-100

XCTF 进阶 RE

    • key
    • simple-check-100

一天一道CTF题目,能多不能少

key

下载文件,运行,发现运行不动
直接用ida打开找主函数,太简洁不可能:
XCTF 进阶 RE key、simple-check-100_第1张图片
进入sub_401100:

int sub_401100()
{
  signed int v0; // esi
  signed int v1; // esi
  unsigned int v2; // edi
  void **v3; // ebx
  void **v4; // eax
  int v5; // ecx
  int v6; // ST04_4
  int v7; // ST08_4
  int v8; // ST0C_4
  int v9; // eax
  int v10; // ST0C_4
  char *v11; // esi
  int v12; // ecx
  void **v13; // eax
  int v14; // eax
  int v15; // ST0C_4
  int v16; // eax
  int v17; // ST0C_4
  int v18; // eax
  int v19; // ST0C_4
  int v20; // eax
  int v21; // ST0C_4
  int v22; // eax
  int v23; // ST0C_4
  int v24; // eax
  int v25; // ST0C_4
  int v26; // eax
  int v27; // ST0C_4
  int v28; // eax
  int result; // eax
  int v30; // [esp-4h] [ebp-13Ch]
  int Dst; // [esp+14h] [ebp-124h]
  char v32[4]; // [esp+20h] [ebp-118h]
  char v33; // [esp+24h] [ebp-114h]
  int v34; // [esp+5Ch] [ebp-DCh]
  char v35; // [esp+61h] [ebp-D7h]
  int v36; // [esp+64h] [ebp-D4h]
  int v37; // [esp+68h] [ebp-D0h]
  char v38; // [esp+6Ch] [ebp-CCh]
  FILE *File; // [esp+70h] [ebp-C8h]
  char v40; // [esp+84h] [ebp-B4h]
  void *v41; // [esp+CCh] [ebp-6Ch]
  int v42; // [esp+DCh] [ebp-5Ch]
  unsigned int v43; // [esp+E0h] [ebp-58h]
  void *v44; // [esp+E4h] [ebp-54h]
  int v45; // [esp+F4h] [ebp-44h]
  unsigned int v46; // [esp+F8h] [ebp-40h]
  void *Memory[4]; // [esp+FCh] [ebp-3Ch]
  int v48; // [esp+10Ch] [ebp-2Ch]
  unsigned int v49; // [esp+110h] [ebp-28h]
  __int128 v50; // [esp+114h] [ebp-24h]
  __int16 v51; // [esp+124h] [ebp-14h]
  char v52; // [esp+126h] [ebp-12h]
  int v53; // [esp+134h] [ebp-4h]

  v46 = 15;
  v45 = 0;
  LOBYTE(v44) = 0;
  v53 = 0;
  v43 = 15;
  v42 = 0;
  LOBYTE(v41) = 0;
  LOBYTE(v53) = 1;
  v0 = 0;
  v48 = 1684630885;
  LOWORD(v49) = 97;
  *(_OWORD *)Memory = xmmword_40528C;
  v51 = 11836;
  v52 = 0;
  v50 = xmmword_4052A4;
  do
  {
    sub_4021E0(1u, (*((_BYTE *)Memory + v0) ^ *((_BYTE *)&v50 + v0)) + 22);
    ++v0;
  }
  while ( v0 < 18 );
  v1 = 0;
  v49 = 15;
  v48 = 0;
  LOBYTE(Memory[0]) = 0;
  LOBYTE(v53) = 2;
  v2 = v43;
  v3 = (void **)v41;
  do
  {
    v4 = &v41;
    if ( v2 >= 0x10 )
      v4 = v3;
    sub_4021E0(1u, *((_BYTE *)v4 + v1++) + 9);
  }
  while ( v1 < 18 );
  memset(&Dst, 0, 0xB8u);
  sub_401620(v5, v6, v7, v8);
  LOBYTE(v53) = 3;
  if ( v32[*(_DWORD *)(Dst + 4)] & 6 )
  {
    v9 = sub_402A00(std::cerr, "?W?h?a?t h?a?p?p?e?n?", sub_402C50);
    std::basic_ostream>::operator<<(v9, v10);
    exit(-1);
  }
  sub_402E90(&Dst, &v44);
  v11 = &v33;
  if ( File )
  {
    if ( !(unsigned __int8)sub_4022F0(&v33) )
      v11 = 0;
    if ( fclose(File) )
      v11 = 0;
  }
  else
  {
    v11 = 0;
  }
  v38 = 0;
  v35 = 0;
  std::basic_streambuf>::_Init(&v33);
  v36 = dword_408590;
  File = 0;
  v37 = dword_408594;
  v34 = 0;
  if ( !v11 )
    std::basic_ios>::setstate((char *)&Dst + *(_DWORD *)(Dst + 4), 2, 0);
  v13 = Memory;
  if ( v49 >= 0x10 )
    v13 = (void **)Memory[0];
  if ( sub_4020C0(v12, v45, v13, v48) )
  {
    v28 = sub_402A00(std::cout, "=W=r=o=n=g=K=e=y=", sub_402C50);
  }
  else
  {
    v14 = sub_402A00(std::cout, "|------------------------------|", sub_402C50);
    std::basic_ostream>::operator<<(v14, v15);
    v16 = sub_402A00(std::cout, "|==============================|", sub_402C50);
    std::basic_ostream>::operator<<(v16, v17);
    v18 = sub_402A00(std::cout, "|==============================|", sub_402C50);
    std::basic_ostream>::operator<<(v18, v19);
    v20 = sub_402A00(std::cout, "|==============================|", sub_402C50);
    std::basic_ostream>::operator<<(v20, v21);
    v22 = sub_402A00(std::cout, "\\  /\\  /\\  /\\  /\\==============|", sub_402C50);
    std::basic_ostream>::operator<<(v22, v23);
    v24 = sub_402A00(std::cout, " \\/  \\/  \\/  \\/  \\=============|", sub_402C50);
    std::basic_ostream>::operator<<(v24, v25);
    v26 = sub_402A00(std::cout, "                 |-------------|", sub_402C50);
    std::basic_ostream>::operator<<(v26, v27);
    std::basic_ostream>::operator<<(std::cout, sub_402C50);
    v28 = sub_402A00(std::cout, "Congrats You got it!", sub_402C50);
  }
  std::basic_ostream>::operator<<(v28, v30);
  sub_401570(&v40);
  std::basic_ios>::~basic_ios>(&v40);
  if ( v49 >= 0x10 )
    sub_402630(Memory[0], v49 + 1);
  if ( v2 >= 0x10 )
    sub_402630(v3, v2 + 1);
  result = v46;
  if ( v46 >= 0x10 )
    result = sub_402630(v44, v46 + 1);
  return result;
}

直接查看字符串look一下:
XCTF 进阶 RE key、simple-check-100_第2张图片
发现奇怪的东西?这个目录下的flag.txt?
找到调用该处的函数:
XCTF 进阶 RE key、simple-check-100_第3张图片
最后发现,该函数在主函数的sub_401620中调用!
XCTF 进阶 RE key、simple-check-100_第4张图片
直接在这个目录下构建一下这个文件,看看有不有什么效果,文件中乱写一些东西
发现还是不能运行,,,,直接用OD看看能不能打开:
在这里插入图片描述
发现是输出错误的key???
那如果没有这个文件呢?
结果发现是:
在这里插入图片描述
像极了我现在的心情!what happen?
首先回到wrong的key那,说明肯定有比较,毕竟是有if的
在这里插入图片描述
应该是将文件内容与加密的字符比较,不过我们加密的字符我们不知道
就进行分析,最后发现,v13这个变量有问题!!!!
在这里插入图片描述
XCTF 进阶 RE key、simple-check-100_第5张图片
直接根据逻辑来
一开始是有两个字符串:
XCTF 进阶 RE key、simple-check-100_第6张图片
这两个字符串是知道的!!!:
XCTF 进阶 RE key、simple-check-100_第7张图片
这就好办了,直接根据逻辑来编写脚本,看看最后的v13等于什么东西:

s1 = "themidathemidathemida" 
s2 = ">----++++....<<<<."

flag1 = ""
flag=""

for i in range(len(s2)):
	flag1 += chr((ord(s1[i])^ord(s2[i]))+22)

for i in flag1:
	flag +=chr(ord(i)+9)
	
print(flag)

运行得到一串字符
在这里插入图片描述
这啥玩意啊,看着又不像字符串的~~
又想了一会,发现这个如果是加密后的字符串的话,那么这就是被比较的字符串
不管那么多了,直接提交试试看再说!
发现这就是flag,我也是服了!!!
最后觉得这个题用OD直接调不是更好???有比较
直接查看一下就好了???搞不懂搞不懂!!!!


simple-check-100

下载文件打开,发现存在三个文件~~
后来发现有elf的文件,还有exe的文件,不过内容基本都一样
只不过这三个文件只是运行环境不一样而已,这里我用的是elf文件:
XCTF 进阶 RE key、simple-check-100_第8张图片
首先输入一个字符串,然后进行check_key函数进行检查
如果不对则返回wrong
然后具体看了下interesting_function函数:
XCTF 进阶 RE key、simple-check-100_第9张图片
看上去有点复杂,,,取4个字节进行异或,后面又是一个循环,,,,
但是我们输入得字符也不能保证正确啊!
再看看check_key函数:
XCTF 进阶 RE key、simple-check-100_第10张图片
,,,,我看你是在为难我胖虎!
自己输入的为参数,,,,,,,
直接用gdb动态调试吧,,,,
(关于GDB调试指令,可借阅两位大佬的博文:GDB调试实用命令 | GDB调试入门)
输入命令:

gdb-peda$ ./task9_x86_64_46d01fe312d35ecf69c4ff8ab8ace75d080891dc
gdb-peda$ br main
gdb-peda$ r

然后执行到输入key的位置,发现check_key函数的比较(test指令)??
XCTF 进阶 RE key、simple-check-100_第11张图片
直接查看eax里面的值:
XCTF 进阶 RE key、simple-check-100_第12张图片
很显然,我们输入的key是错误的嘛,所以比较的值肯定是0嘛
所以我们就可以清楚看见eax中为0,
那我们就直接修改eax中的值为1
在这里插入图片描述
然后继续执行:
在这里插入图片描述
得到一串东西???直接提交,发现就是flag
看来这种检查机制还是有危险的,直接修改比较的值就能够绕过check
flag:flag_is_you_know_cracking!!!

你可能感兴趣的:(CTF题,一天一道CTF,XCTF)