2015_NJUPT_CTF_Reverse300

今天到学校的线下CTF玩了一下,奥满教室的汉子心好碎T T

逆向只有两道题,一个apk的我就没看了,整理一下Reverse300的思路。

附件:http://pan.baidu.com/s/1c0qeDdm   密码:2id4

1. 查看一下字符串,发现可疑字符串

 

 

 

2.向上回溯,观察跳到这里的条件,经过图中两个断点处的跳转可以跳到可疑字符串,F9运行程序,断在第一个断点处,但跳转未实现,强制跳转一下。004016C9处也强制跳转一下。

 

 

 

 

 

 

 

 

 

3.程序来到了这里,这里是一个很关键的地方,我们记下这个地址00428c54,往下看就知道这里的关键了。

4.004018B8处强制跳转一下,004018DA处强制不跳转,00401930处的函数执行完后,00428c54处的内容变了,变成了一个32位字符串,小vi第一反应是个md5值。

5.接下来又来了一个新的字符串 "0kk`d1a`55k222k2a776jbfgd`06cjjb",并且在004019BB处解密,解密算法为取出该字符串的每个字符和"S"异或,将解密后的字符串放到0012F3F8处。

0040194E   .  BE 4C304200   mov esi,5631a3f0.0042304C                ;  ASCII "0kk`d1a`55k222k2a776jbfgd`06cjjb"
00401953   .  8DBD 14FDFFFF lea edi,dword ptr ss:[ebp-0x2EC]
00401959   .  F3:A5         rep movs dword ptr es:[edi],dword ptr ds>
0040195B   .  A4            movs byte ptr es:[edi],byte ptr ds:[esi]
0040195C   .  B9 37000000   mov ecx,0x37
00401961   .  33C0          xor eax,eax
00401963   .  8DBD 35FDFFFF lea edi,dword ptr ss:[ebp-0x2CB]
00401969   .  F3:AB         rep stos dword ptr es:[edi]
0040196B   .  66:AB         stos word ptr es:[edi]
0040196D   .  AA            stos byte ptr es:[edi]
0040196E   .  66:8B0D 48304>mov cx,word ptr ds:[0x423048]
00401975   .  66:898D 08FDF>mov word ptr ss:[ebp-0x2F8],cx
0040197C   .  8A15 4A304200 mov dl,byte ptr ds:[0x42304A]
00401982   .  8895 0AFDFFFF mov byte ptr ss:[ebp-0x2F6],dl
00401988   .  33C0          xor eax,eax
0040198A   .  8985 0BFDFFFF mov dword ptr ss:[ebp-0x2F5],eax
00401990   .  66:8985 0FFDF>mov word ptr ss:[ebp-0x2F1],ax
00401997   .  8885 11FDFFFF mov byte ptr ss:[ebp-0x2EF],al
0040199D   .  8D8D 14FDFFFF lea ecx,dword ptr ss:[ebp-0x2EC]
004019A3   .  51            push ecx
004019A4   .  E8 77080000   call 5631a3f0.00402220
004019A9   .  83C4 04       add esp,0x4
004019AC   .  50            push eax
004019AD   .  8D95 14FDFFFF lea edx,dword ptr ss:[ebp-0x2EC]
004019B3   .  52            push edx
004019B4   .  8D85 08FDFFFF lea eax,dword ptr ss:[ebp-0x2F8]
004019BA   .  50            push eax
004019BB   .  E8 45F6FFFF   call 5631a3f0.00401005             ;此处为解密函数

解密后的字符串:

6.接下来将上面得到两个字符串传到函数0040E570中,这个函数中分别对比两个字符串,相等验证通过。

;验证函数
0040E570  /$  55            push ebp
0040E571  |.  8BEC          mov ebp,esp
0040E573  |.  57            push edi
0040E574  |.  56            push esi
0040E575  |.  53            push ebx
0040E576  |.  8B75 0C       mov esi,[arg.2]
0040E579  |.  8B7D 08       mov edi,[arg.1]
0040E57C  |.  8D05 44904200 lea eax,dword ptr ds:[0x429044]
0040E582  |.  8378 08 00    cmp dword ptr ds:[eax+0x8],0x0
0040E586  |.  75 3B         jnz X5631a3f0.0040E5C3
0040E588  |.  B0 FF         mov al,0xFF
0040E58A  |.  8BFF          mov edi,edi
0040E58C  |>  0AC0          /or al,al
0040E58E  |.  74 2E         |je X5631a3f0.0040E5BE
0040E590  |.  8A06          |mov al,byte ptr ds:[esi]
0040E592  |.  46            |inc esi
0040E593  |.  8A27          |mov ah,byte ptr ds:[edi]
0040E595  |.  47            |inc edi
0040E596  |.  38C4          |cmp ah,al
0040E598  |.^ 74 F2         |je X5631a3f0.0040E58C
0040E59A  |.  2C 41         |sub al,0x41
0040E59C  |.  3C 1A         |cmp al,0x1A
0040E59E  |.  1AC9          |sbb cl,cl
0040E5A0  |.  80E1 20       |and cl,0x20
0040E5A3  |.  02C1          |add al,cl
0040E5A5  |.  04 41         |add al,0x41
0040E5A7  |.  86E0          |xchg al,ah
0040E5A9  |.  2C 41         |sub al,0x41
0040E5AB  |.  3C 1A         |cmp al,0x1A
0040E5AD  |.  1AC9          |sbb cl,cl
0040E5AF  |.  80E1 20       |and cl,0x20
0040E5B2  |.  02C1          |add al,cl
0040E5B4  |.  04 41         |add al,0x41
0040E5B6  |.  38E0          |cmp al,ah
0040E5B8  |.^ 74 D2         \je X5631a3f0.0040E58C
0040E5BA  |.  1AC0          sbb al,al
0040E5BC  |.  1C FF         sbb al,0xFF
0040E5BE  |>  0FBEC0        movsx eax,al
0040E5C1  |.  EB 34         jmp X5631a3f0.0040E5F7
0040E5C3  |>  B8 FF000000   mov eax,0xFF
0040E5C8  |.  33DB          xor ebx,ebx
0040E5CA  |.  8BFF          mov edi,edi
0040E5CC  |>  0AC0          /or al,al
0040E5CE  |.  74 27         |je X5631a3f0.0040E5F7
0040E5D0  |.  8A06          |mov al,byte ptr ds:[esi]
0040E5D2  |.  46            |inc esi
0040E5D3  |.  8A1F          |mov bl,byte ptr ds:[edi]
0040E5D5  |.  47            |inc edi
0040E5D6  |.  38D8          |cmp al,bl
0040E5D8  |.^ 74 F2         |je X5631a3f0.0040E5CC
0040E5DA  |.  50            |push eax
0040E5DB  |.  53            |push ebx
0040E5DC  |.  E8 2F000000   |call 5631a3f0.0040E610
0040E5E1  |.  8BD8          |mov ebx,eax
0040E5E3  |.  83C4 04       |add esp,0x4
0040E5E6  |.  E8 25000000   |call 5631a3f0.0040E610
0040E5EB  |.  83C4 04       |add esp,0x4
0040E5EE  |.  38C3          |cmp bl,al
0040E5F0  |.^ 74 DA         \je X5631a3f0.0040E5CC
0040E5F2  |.  1BC0          sbb eax,eax
0040E5F4  |.  83D8 FF       sbb eax,-0x1
0040E5F7  |>  5B            pop ebx
0040E5F8  |.  5E            pop esi
0040E5F9  |.  5F            pop edi
0040E5FA  |.  C9            leave
0040E5FB  \.  C3            retn

 

7.分析到这里,我们知道两个字符串中,"c8837b23ff8aaa8a2dde915473ce0991"是不变的,由程序给出的"0kk`d1a`55k222k2a776jbfgd`06cjjb"和"S"逐个异或得到,需要验证的是另外一个字符串,那么这个字符串是从哪里来的呢?回到该字符串出现的地方,再次分析一下,发现该值为计算00428c54处存放的数据的MD5值,嘿嘿预感是对的。这时候我们MD5解密一下"c8837b23ff8aaa8a2dde915473ce0991",解密后为"123321",重新跑一下程序,将00428c54改为"313233333231"(ascii"123321"),往下运行,果然出现了flag~

 

ps:后来来了一个妹子,比赛结束之后就消失了,还木有要个电话,T Tnozuonodie

posted on 2015-11-11 19:15  -Vi  阅读(1354)  评论(0编辑  收藏  举报

导航