CTF

远古时期

小逆向

Posted by pic4xiu on May 26, 2019

Windows Reverse1

a windows reverse

本程序有upx壳,拿工具直接脱掉,在做本程序时遇到了一些问题,在这里记录一下

Analysis

Let’s see it

其实本题就是麻烦,必须用好多flag碎片拼凑,我在第一处和第三处遇到了问题,直接贴出来,其中第三处的base64我愣是看不出来,最后通过peid小插件才发现是,(我真是。。

if ( strlen(input) == 29 )
  {
    if ( input[28] == 125 )
    {
      v7 = 0;
      v4 = input;
      v5 = 8;
      do
      {
        if ( (*v4 ^ dword_40803C[&v4[3 - input] % 8]) == v4[aMwwCTw - input] )
          ++v7;
        ++v4;
        --v5;
      }
      while ( v5 );
      if ( v7 == 8 )
        sub_401170(input);
      else
        sub_4012E0(aHereIsGxnnctf);
      result = 0;
    }
    else
    {
      sub_4012E0(aUnlikeFlag);
      result = 0;
    }
  }

这个if语句贼奇怪,根本看不懂,后来动态调试的时候了然了,我们要做的便是让v7为8,这样必须让if全成立

.data:0040803C word_40803C     dw 14h                  ; DATA XREF: _main+7B↑r
.data:0040803E                 db    0
.data:0040803F                 db    0
.data:00408040                 dw 12h
.data:00408042                 db    0
.data:00408043                 db    0
.data:00408044                 dw 0Ch
.data:00408046                 db    0
.data:00408047                 db    0
.data:00408048                 dw 0Ah
.data:0040804A                 db    0
.data:0040804B                 db    0
.data:0040804C                 dw 0Fh
.data:0040804E                 db    0
.data:0040804F                 db    0
.data:00408050                 dw 19h
.data:00408052                 db    0
.data:00408053                 db    0
.data:00408054                 dw 31h
.data:00408056                 db    0
.data:00408057                 db    0

dword_40803C处的几个16进制数

.data:00408030 byte_408030     db 6Dh                  ; DATA XREF: _main+4E↑o
.data:00408031                 db  77h ; w
.data:00408032                 db  77h ; w
.data:00408033                 db  5Fh ; _
.data:00408034                 db  63h ; c
.data:00408035                 db  60h ; `
.data:00408036                 db  74h ; t
.data:00408037                 db  77h ; w
.data:00408038                 db    0
.data:00408039                 align 4

byte_408030处的字符

我们直接动态跑一下,毕竟还搞不清为啥是dword,直接上od撸汇编

00401268  |> \0FBE28        |movsx ebp,byte ptr ds:[eax]
0040126B  |.  8B1C9D 3C8040>|mov ebx,dword ptr ds:[ebx*4+0x40803C]
00401272  |.  33DD          |xor ebx,ebp
00401274  |.  0FBE2C02      |movsx ebp,byte ptr ds:[edx+eax]
00401278  |.  3BDD          |cmp ebx,ebp
0040127A  |.  75 04         |jnz short SMC.00401280
0040127C  |.  FF4424 10     |inc dword ptr ss:[esp+0x10]

关键代码如上,我们可以看到,在ebp处是我们的输入,程序把某些字符(ds:[ebx*4+0x40803C])取出放入ebx中,然后两者异或又与某些数(ds:[edx+eax])比较

这么看直接每次按f8把得到的字符搞出来就行,但是我们看看ida到底是怎么想的(手动滑稽

我不太清楚为什么ida把dword_40803C认成dw?应该是dd才对,很奇怪,还有发现它控制%8的时候思路很清奇,是利用与0x80000007进行and运算,感觉很强,所以我们何止直接导出来ida的值也可以跑

Summary

Assembly language is the best

这几天通过看各种题终于发现汇编才是王道,真的不能太依赖ida了