CTF--逆向---2

原题目下载地址:https://static2.ichunqiu.com/icq/resources/fileupload//CTF/JCTF2014/re200

网盘下载:https://pan.baidu.com/s/1kWuiAR9 密码:izen

首先丢到PEID查看特征码,提示不是有效的PE

CTF--逆向---2_第1张图片

用010Editor打开,应该是PE文件,只是头文件有点错误。

看一下e_lfanew,文件里面是00E9,由e_lfanew找到NT头,发现e_lfanew错误,应该为00E8,把E9改为E8,继续往下看

NT头应该为50 45 00 00,把FF改为00,保存。

CTF--逆向---2_第2张图片

关于PE文件结构可以看这一篇博文:http://blog.csdn.net/evileagle/article/details/11903197

IDA打开,Shift+f12查看字符串发现了Success字符,找到位置F5查看伪代码。

__int64 main_0()
{
  int v0; // eax
  __int64 v1; // rax
  int v2; // eax
  int v3; // ST08_4
  int v4; // eax
  int v5; // eax
  int v6; // eax
  int v7; // eax
  int v8; // eax
  int v9; // eax
  int v11; // [esp-10h] [ebp-170h]
  int v12; // [esp-Ch] [ebp-16Ch]
  char *v13; // [esp-8h] [ebp-168h]
  int v14; // [esp-4h] [ebp-164h]
  int *v15; // [esp+Ch] [ebp-154h]
  int k; // [esp+D4h] [ebp-8Ch]
  int j; // [esp+E0h] [ebp-80h]
  int i; // [esp+ECh] [ebp-74h]
  char v19; // [esp+FBh] [ebp-65h]
  int v20; // [esp+104h] [ebp-5Ch]
  int Dst; // [esp+108h] [ebp-58h]
  int v22; // [esp+10Ch] [ebp-54h]
  int v23; // [esp+110h] [ebp-50h]
  int v24; // [esp+114h] [ebp-4Ch]
  int v25; // [esp+118h] [ebp-48h]
  char Str1; // [esp+14Ch] [ebp-14h]
  int v27; // [esp+14Dh] [ebp-13h]
  int v28; // [esp+151h] [ebp-Fh]
  char v29; // [esp+155h] [ebp-Bh]

  v0 = sub_411154(std::cout, &Str);
  std::basic_ostream>::operator<<(v0, std::endl);
  Str1 = 0;
  v27 = 0;
  v28 = 0;
  v29 = 0;
  v20 = 0;
  j_memset(&Dst, 0, 0x3Cu);
  for ( i = 0; i < 9; ++i )
    std::basic_istream>::operator>>(std::cin, &v20 + i);
  if ( v22 * Dst * v20 / 11 != 106 )
    goto LABEL_31;
  if ( (Dst ^ v20) != v22 - 4 )
    goto LABEL_31;
  HIDWORD(v1) = (v22 + Dst + v20) % 100;
  if ( HIDWORD(v1) != 34 )
    goto LABEL_31;
  if ( v23 == 80 )
  {
    for ( j = 0; j < 3; ++j )
    {
      HIDWORD(v1) = (j + 1) % 3;
      for ( *(&Str1 + j) = *((_BYTE *)&v20 + 4 * HIDWORD(v1)) + *(&v20 + j % 3); ; *(&Str1 + j) /= 2 )
      {
        while ( *(&Str1 + j) < 33 )
        {
          HIDWORD(v1) = j;
          *(&Str1 + j) *= 2;
        }
        if ( *(&Str1 + j) <= 126 )
          break;
        v1 = *(&Str1 + j);
      }
    }
    if ( v24 == 94 && v25 == 98 )
    {
      for ( k = 3; k < 9; ++k )
      {
        for ( *(&Str1 + k) = *(&Str1 + (k + 1) % 3) + *(&Str1 + k % 3); ; *(&Str1 + k) /= 2 )
        {
          while ( *(&Str1 + k) < 33 )
            *(&Str1 + k) *= 2;
          if ( *(&Str1 + k) <= 126 )
            break;
        }
      }
      if ( !j_strcmp(&Str1, "*&8P^bP^b") )
      {
        v2 = sub_411154(std::cout, "success!");
        std::basic_ostream>::operator<<(v2, std::endl);
        v14 = std::endl;
        v13 = "abc}";
        v12 = v22;
        v11 = Dst;
        v3 = v20;
        v15 = &v11;
        v4 = sub_411154(std::cout, "jlflag{");
        v5 = std::basic_ostream>::operator<<(v4, v3);
        v6 = std::basic_ostream>::operator<<(v5, v11);
        v7 = std::basic_ostream>::operator<<(v6, v12);
        v8 = sub_411154(v7, v13);
        std::basic_ostream>::operator<<(v8, v14);
        sub_4112D0(std::cin, &v19);
        goto LABEL_32;
      }
LABEL_31:
      v9 = sub_411154(std::cout, "please try again!");
      std::basic_ostream>::operator<<(v9, std::endl);
      goto LABEL_32;
    }
  }
LABEL_32:
  v14 = HIDWORD(v1);
  v13 = 0;
  return *(_QWORD *)&v13;
}                    

应该是对v20-v29输入9个数字,如果正确则输出flag

python:

for i in range(1000):
    for j in range(1000):
        k = (i ^ j) + 4
        if ((k*i*j // 11 == 106)and((k + i + j)%100 == 34)):
            print (i , j , k)
// k=v22 i=v21 j=v22 v23=80 v24 == 94  v25 == 98

v26-v28随便输。

得到flag。

你可能感兴趣的:(CTF--逆向)