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

下载地址: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 "

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

原文地址:https://www.cnblogs.com/tk091/p/2479498.html