成都信息工程学院第八届信息安全技术大赛--crackme1爆破分析

下载地址:http://files.cnblogs.com/tk091/crackme1.7z
得到一个crackme,首先我们要对其进行分析,从而考虑如何下手,首先查壳,当然是无壳的了,然后运行程序,了解大致的情况。
发现这是一个控制台程序,载入OD运行,看下OD的注释,发现有

1 0040139E|.52push edx; /pWSAData 2 0040139F|.68 02020000push 0x202; |RequestedVersion = 202 (2.2.) 3 004013A4|.E8 07020000call ; \WSAStartup 4 004013A9|.6A 00push 0x0; /Protocol = IPPROTO_IP 5 004013AB|.6A 01push 0x1; |Type = SOCK_STREAM 6 004013AD|.6A 02push 0x2; |Family = AF_INET 7 004013AF|.E8 F6010000call ; \socket 8 004013B4|.8985 60FAFFFF mov [local.360],eax 9 004013BA|.66:C785 50FAF>mov word ptr ss:[ebp-0x5B0],0x2 10 004013C3|.68 BE150000push 0x15BE; /NetShort = 15BE 11 004013C8|.E8 D7010000call ; \ntohs 12 004013CD|.66:8985 52FAF>mov word ptr ss:[ebp-0x5AE],ax 13 004013D4|.68 54304200push crackme1.00423054; /127.0.0.1 14 004013D9|.E8 C0010000call ; \inet_addr 15 004013DE|.8985 54FAFFFF mov [local.363],eax 16 004013E4|.6A 10push 0x10; /AddrLen = 10 (16.) 17 004013E6|.8D85 50FAFFFF lea eax,[local.364]; | 18 004013EC|.50push eax; |pSockAddr 19 004013ED|.8B8D 60FAFFFF mov ecx,[local.360]; | 20 004013F3|.51push ecx; |Socket 21 004013F4|.E8 9F010000call ; \connect

网络连接的函数,考虑是基于本地网络验证的,在本地验证中,肯定有一个发送注册码和接受验证码的情况。
【成都信息工程学院第八届信息安全技术大赛--crackme1爆破分析】我们只需要爆破接受的结果即可。
OD载入
1 00401D56|.52push edx 2 00401D57|.A1 F8654200mov eax,dword ptr ds:[0x4265F8] 3 00401D5C|.50push eax 4 00401D5D|.8B0D F4654200 mov ecx,dword ptr ds:[0x4265F4] 5 00401D63|.51push ecx 6 00401D64|.E8 A1F2FFFFcall crackme1.0040100A; 主函数入口

我们跟进去,单步
1 00401281|.50push eax 2 00401282|.68 74304200push crackme1.00423074; %s 3 00401287|.E8 94090000call crackme1.00401C20; 这里是scanf

走到scanf,输入key然后回车确定,中断后继续分析
1 0040128C83C4 08add esp,0x8 2 0040128F8D8D 00FEFFFFlea ecx,dword ptr ss:[ebp-0x200] 3 0040129551push ecx 4 00401296E8 05090000call crackme1.00401BA0 5 0040129B83C4 04add esp,0x4 6 0040129E83F8 10cmp eax,0x10; 比较key的长度

这里我们发现有一个和注册码长度的对比,原来是看注册码是否满足16位,那我们就来修改代码,让程序无法验证长度
1 0040129E83F8 10cmp eax,0x10; 比较key的长度 2 004012A174 0Cje crackme1.004012AF; 关键跳 3 004012A3E8 5DFDFFFFcall crackme1.00401005 4 004012A833C0xor eax,eax 5 004012AAE9 E5010000jmp crackme1.00401494; 跳转到结束

我们把比较的地方修改为
1 0040129E|.3BC0cmp 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 ; \recv

继续向下,看有没有跳转
1 0040146A|.52push edx 2 0040146B|.68 40304200push crack.00423040; ASCII "Sycflowercompany" 3 00401470|.E8 4B050000call crack.004019C0 4 00401475|.83C4 08add esp,0x8 5 00401478|.85C0test eax,eax 6 0040147A|.75 11jnzcrack.0040148D; 关键跳 7 0040147C|.68 28304200push crack.00423028; ASCII "Congratulations!!! 8 "

这样,我们就可以爆破了。

    推荐阅读