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