今天到学校的线下CTF玩了一下,奥满教室的汉子心好碎T T
逆向只有两道题,一个apk的我就没看了,整理一下Reverse300的思路。
附件: 密码: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,0x3700401961 . 33C0 xor eax,eax00401963 . 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],cx0040197C . 8A15 4A304200 mov dl,byte ptr ds:[0x42304A]00401982 . 8895 0AFDFFFF mov byte ptr ss:[ebp-0x2F6],dl00401988 . 33C0 xor eax,eax0040198A . 8985 0BFDFFFF mov dword ptr ss:[ebp-0x2F5],eax00401990 . 66:8985 0FFDF>mov word ptr ss:[ebp-0x2F1],ax00401997 . 8885 11FDFFFF mov byte ptr ss:[ebp-0x2EF],al0040199D . 8D8D 14FDFFFF lea ecx,dword ptr ss:[ebp-0x2EC]004019A3 . 51 push ecx004019A4 . E8 77080000 call 5631a3f0.00402220004019A9 . 83C4 04 add esp,0x4004019AC . 50 push eax004019AD . 8D95 14FDFFFF lea edx,dword ptr ss:[ebp-0x2EC]004019B3 . 52 push edx004019B4 . 8D85 08FDFFFF lea eax,dword ptr ss:[ebp-0x2F8]004019BA . 50 push eax004019BB . E8 45F6FFFF call 5631a3f0.00401005 ;此处为解密函数
解密后的字符串:
6.接下来将上面得到两个字符串传到函数0040E570中,这个函数中分别对比两个字符串,相等验证通过。
;验证函数0040E570 /$ 55 push ebp0040E571 |. 8BEC mov ebp,esp0040E573 |. 57 push edi0040E574 |. 56 push esi0040E575 |. 53 push ebx0040E576 |. 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],0x00040E586 |. 75 3B jnz X5631a3f0.0040E5C30040E588 |. B0 FF mov al,0xFF0040E58A |. 8BFF mov edi,edi0040E58C |> 0AC0 /or al,al0040E58E |. 74 2E |je X5631a3f0.0040E5BE0040E590 |. 8A06 |mov al,byte ptr ds:[esi]0040E592 |. 46 |inc esi0040E593 |. 8A27 |mov ah,byte ptr ds:[edi]0040E595 |. 47 |inc edi0040E596 |. 38C4 |cmp ah,al0040E598 |.^ 74 F2 |je X5631a3f0.0040E58C0040E59A |. 2C 41 |sub al,0x410040E59C |. 3C 1A |cmp al,0x1A0040E59E |. 1AC9 |sbb cl,cl0040E5A0 |. 80E1 20 |and cl,0x200040E5A3 |. 02C1 |add al,cl0040E5A5 |. 04 41 |add al,0x410040E5A7 |. 86E0 |xchg al,ah0040E5A9 |. 2C 41 |sub al,0x410040E5AB |. 3C 1A |cmp al,0x1A0040E5AD |. 1AC9 |sbb cl,cl0040E5AF |. 80E1 20 |and cl,0x200040E5B2 |. 02C1 |add al,cl0040E5B4 |. 04 41 |add al,0x410040E5B6 |. 38E0 |cmp al,ah0040E5B8 |.^ 74 D2 \je X5631a3f0.0040E58C0040E5BA |. 1AC0 sbb al,al0040E5BC |. 1C FF sbb al,0xFF0040E5BE |> 0FBEC0 movsx eax,al0040E5C1 |. EB 34 jmp X5631a3f0.0040E5F70040E5C3 |> B8 FF000000 mov eax,0xFF0040E5C8 |. 33DB xor ebx,ebx0040E5CA |. 8BFF mov edi,edi0040E5CC |> 0AC0 /or al,al0040E5CE |. 74 27 |je X5631a3f0.0040E5F70040E5D0 |. 8A06 |mov al,byte ptr ds:[esi]0040E5D2 |. 46 |inc esi0040E5D3 |. 8A1F |mov bl,byte ptr ds:[edi]0040E5D5 |. 47 |inc edi0040E5D6 |. 38D8 |cmp al,bl0040E5D8 |.^ 74 F2 |je X5631a3f0.0040E5CC0040E5DA |. 50 |push eax0040E5DB |. 53 |push ebx0040E5DC |. E8 2F000000 |call 5631a3f0.0040E6100040E5E1 |. 8BD8 |mov ebx,eax0040E5E3 |. 83C4 04 |add esp,0x40040E5E6 |. E8 25000000 |call 5631a3f0.0040E6100040E5EB |. 83C4 04 |add esp,0x40040E5EE |. 38C3 |cmp bl,al0040E5F0 |.^ 74 DA \je X5631a3f0.0040E5CC0040E5F2 |. 1BC0 sbb eax,eax0040E5F4 |. 83D8 FF sbb eax,-0x10040E5F7 |> 5B pop ebx0040E5F8 |. 5E pop esi0040E5F9 |. 5F pop edi0040E5FA |. C9 leave0040E5FB \. C3 retn
7.分析到这里,我们知道两个字符串中,"c8837b23ff8aaa8a2dde915473ce0991"是不变的,由程序给出的"0kk`d1a`55k222k2a776jbfgd`06cjjb"和"S"逐个异或得到,需要验证的是另外一个字符串,那么这个字符串是从哪里来的呢?回到该字符串出现的地方,再次分析一下,发现该值为计算00428c54处存放的数据的MD5值,嘿嘿预感是对的。这时候我们MD5解密一下"c8837b23ff8aaa8a2dde915473ce0991",解密后为"123321",重新跑一下程序,将00428c54改为"313233333231"(ascii"123321"),往下运行,果然出现了flag~
ps:后来来了一个妹子,比赛结束之后就消失了,还木有要个电话,T Tnozuonodie