下载地址:https://files.cnblogs.com/tk091/crackme1.7z
得到一个crackme,首先我们要对其进行分析,从而考虑如何下手,首先查壳,当然是无壳的了,然后运行程序,了解大致的情况。
发现这是一个控制台程序,载入OD运行,看下OD的注释,发现有
1 0040139E |. 52 push edx ; /pWSAData 2 0040139F |. 68 02020000 push 0x202 ; |RequestedVersion = 202 (2.2.) 3 004013A4 |. E8 07020000 call <jmp.&WS2_32.#115> ; \WSAStartup 4 004013A9 |. 6A 00 push 0x0 ; /Protocol = IPPROTO_IP 5 004013AB |. 6A 01 push 0x1 ; |Type = SOCK_STREAM 6 004013AD |. 6A 02 push 0x2 ; |Family = AF_INET 7 004013AF |. E8 F6010000 call <jmp.&WS2_32.#23> ; \socket 8 004013B4 |. 8985 60FAFFFF mov [local.360],eax 9 004013BA |. 66:C785 50FAF>mov word ptr ss:[ebp-0x5B0],0x2 10 004013C3 |. 68 BE150000 push 0x15BE ; /NetShort = 15BE 11 004013C8 |. E8 D7010000 call <jmp.&WS2_32.#9> ; \ntohs 12 004013CD |. 66:8985 52FAF>mov word ptr ss:[ebp-0x5AE],ax 13 004013D4 |. 68 54304200 push crackme1.00423054 ; /127.0.0.1 14 004013D9 |. E8 C0010000 call <jmp.&WS2_32.#11> ; \inet_addr 15 004013DE |. 8985 54FAFFFF mov [local.363],eax 16 004013E4 |. 6A 10 push 0x10 ; /AddrLen = 10 (16.) 17 004013E6 |. 8D85 50FAFFFF lea eax,[local.364] ; | 18 004013EC |. 50 push eax ; |pSockAddr 19 004013ED |. 8B8D 60FAFFFF mov ecx,[local.360] ; | 20 004013F3 |. 51 push ecx ; |Socket 21 004013F4 |. E8 9F010000 call <jmp.&WS2_32.#4> ; \connect
网络连接的函数,考虑是基于本地网络验证的,在本地验证中,肯定有一个发送注册码和接受验证码的情况。
我们只需要爆破接受的结果即可。
OD载入
1 00401D56 |. 52 push edx 2 00401D57 |. A1 F8654200 mov eax,dword ptr ds:[0x4265F8] 3 00401D5C |. 50 push eax 4 00401D5D |. 8B0D F4654200 mov ecx,dword ptr ds:[0x4265F4] 5 00401D63 |. 51 push ecx 6 00401D64 |. E8 A1F2FFFF call crackme1.0040100A ; 主函数入口
我们跟进去,单步
1 00401281 |. 50 push eax 2 00401282 |. 68 74304200 push crackme1.00423074 ; %s 3 00401287 |. E8 94090000 call crackme1.00401C20 ; 这里是scanf
走到scanf,输入key然后回车确定,中断后继续分析
1 0040128C 83C4 08 add esp,0x8 2 0040128F 8D8D 00FEFFFF lea ecx,dword ptr ss:[ebp-0x200] 3 00401295 51 push ecx 4 00401296 E8 05090000 call crackme1.00401BA0 5 0040129B 83C4 04 add esp,0x4 6 0040129E 83F8 10 cmp eax,0x10 ; 比较key的长度
这里我们发现有一个和注册码长度的对比,原来是看注册码是否满足16位,那我们就来修改代码,让程序无法验证长度
1 0040129E 83F8 10 cmp eax,0x10 ; 比较key的长度 2 004012A1 74 0C je crackme1.004012AF ; 关键跳 3 004012A3 E8 5DFDFFFF call crackme1.00401005 4 004012A8 33C0 xor eax,eax 5 004012AA E9 E5010000 jmp crackme1.00401494 ; 跳转到结束
我们把比较的地方修改为
1 0040129E |. 3BC0 cmp eax,eax
这样就OK 了,我们保存文件,重新载入,发现程序可以正常运行。
我们继续跟踪,一直到recv为止
1 00401437 |. 6A 00 |push 0x0 ; /Flags = 0 2 00401439 |. 68 FF000000 |push 0xFF ; |BufSize = FF (255.) 3 0040143E |. 8D85 00FFFFFF |lea eax,[local.64] ; | 4 00401444 |. 50 |push eax ; |Buffer 5 00401445 |. 8B8D 60FAFFFF |mov ecx,[local.360] ; | 6 0040144B |. 51 |push ecx ; |Socket 7 0040144C |. E8 3B010000 |call <jmp.&WS2_32.#16> ; \recv
继续向下,看有没有跳转
1 0040146A |. 52 push edx 2 0040146B |. 68 40304200 push crack.00423040 ; ASCII "Sycflowercompany" 3 00401470 |. E8 4B050000 call crack.004019C0 4 00401475 |. 83C4 08 add esp,0x8 5 00401478 |. 85C0 test eax,eax 6 0040147A |. 75 11 jnz crack.0040148D ; 关键跳 7 0040147C |. 68 28304200 push crack.00423028 ; ASCII "Congratulations!!! 8 "
这样,我们就可以爆破了。