CTF

DDCTF

Re1

Posted by pic4xiu on May 5, 2019

Windows Reverse1

a windows reverse

本程序有upx壳,拿工具直接脱掉,程序较为简单,只是一个索引表转换,我们具体分析一下转换函数

Analysis

Let’s see it

unsigned int __cdecl sub_401000(const char *a1)
{
  _BYTE *v1; // ecx
  unsigned int v2; // edi
  unsigned int result; // eax
  int v4; // ebx

  v2 = 0;
  result = strlen(a1);
  if ( result )
  {
    v4 = a1 - v1;
    do
    {
      *v1 = byte_402FF8[(char)v1[v4]];
      ++v2;
      ++v1;
      result = strlen(a1);
    }
    while ( v2 < result );
  }
  return result;
}

我们看到byte_402FF8便是表的首地址

00402FF0  ?? ?? ?? ?? ?? ?? ?? ??  ?? ?? ?? ?? ?? ?? ?? ??  ????????????????
00403000  4E E6 40 BB B1 19 BF 44  FF FF FF FF FF FF FF FF  N鍬 槐 .緿 ........
00403010  FE FF FF FF 01 00 00 00  7E 7D 7C 7B 7A 79 78 77  ........~}|{zyxw
00403020  76 75 74 73 72 71 70 6F  6E 6D 6C 6B 6A 69 68 67  vutsrqponmlkjihg
00403030  66 65 64 63 62 61 60 5F  5E 5D 5C 5B 5A 59 58 57  fedcba`_^]\[ZYXW
00403040  56 55 54 53 52 51 50 4F  4E 4D 4C 4B 4A 49 48 47  VUTSRQPONMLKJIHG
00403050  46 45 44 43 42 41 40 3F  3E 3D 3C 3B 3A 39 38 37  FEDCBA@?>=<;:987
00403060  36 35 34 33 32 31 30 2F  2E 2D 2C 2B 2A 29 28 27  6543210/.-,+*)('
00403070  26 25 24 23 22 21 20 00  00 00 00 00 00 00 00 00  &%$#"! .........

分析一下循环

    do
    {
      *v1 = byte_402FF8[(char)v1[v4]];
      ++v2;
      ++v1;
      result = strlen(a1);
    }
    while ( v2 < result );

我们举例加以说明,例如我将Z输入,在循环中会索引找到Z的位置,之后得到一个数字即为距离byte_402FF8的偏移,得到90,即为D的ASCII码,根据输入将得到的字符串和 DDCTF{reverseME}进行比较,相同即为flag

现在来看本题关键即为索引表函数的逆向,算是一个较为基础的逆向