首页
社区
课程
招聘
[原创]校验码-揭秘MD5算法
发表于: 2013-11-17 01:36 22848

[原创]校验码-揭秘MD5算法

2013-11-17 01:36
22848

PDF格式全文下载请点击:
http://www.purpleroc.com/html/382547.html

原文来自Tracy'Blog--【校园网那些事(八)

Chapter 5——校验码-揭秘MD5算法

     上章节中大概的分析了下我们所接收到的数据包。并单步跟踪了程序处理数据包的整个流程,之后我们发现,程序大概做了如下的事情:

     1、取第一位判定数据包功能类型。(以下所说的数据包,皆是指解密后的数据包)

     2、取第二位得到数据包总长度。

     3、取每个功能代码位(即我们上章节中分析出来的08、09、0A、0B、0C、0D),按相应的功能代码对其后跟随的内容进行处理。

          A、对08,跳转到时间判定处,对比数据包中包含的时间与拨号上网时间。若不同,则丢弃数据包。

          B、对其他的功能代码位大致都是,取其后跟随的字符减去2得到内容长度。再利用长度和起始地址将功能位对应的内容复制到内存其他位置,供程序调用。(如,将要弹出的消息保存到某一地址,调用时,直接先push此地址。)

     那么,所有的都分析完了后,我们发现,程序并没有对数据包的第3-18位进行任何操作。难道,这16个字符是没有用的?等等,16个字符,十六个字符你能想到哪些呢?

     嗯,反正,我的第一反应就是MD5(可能是早年拿站留下的阴影吧,注入后得到的大多是16位)。为了证实我们的想法,用peid对已脱壳的程序用算法分析插件进行分析,结果如下。



     那就是说,我们又猜对了,的确是MD5,但是,问题又来了,他是对什么内容进行的哈希呢?对整个数据包?但这16个字符原本就是在数据包里面的啊。对数据包中的某一个部分?还有就是,这16个字符是用来干嘛的呢?

     那么,我们还是首先来了解下MD5吧。

004090F8  |.  E8 D3190000   call 1_2_9破?0040AAD0                  
004090FD  |.  83C4 08       add esp,0x8 
00409100  |.  84C0          test al,al                               
00409102  |.  0F84 ED010000 je 1_2_9破?004092F5        
0040AAD0  /$  8B5424 04     mov edx,dword ptr ss:[esp+0x4]                   ;  数据包首地址edx 
0040AAD4  |.  81EC FC050000 sub esp,0x5FC                                    ;  抬高栈顶 
0040AADA  |.  85D2          test edx,edx 
0040AADC  |.  0F848F000000 je 1_2_9破?0040AB71 
0040AAE2  |.  53            push ebx 
0040AAE3  |.  56            push esi 
0040AAE4  |.  57            push edi 
0040AAE5  |.  B9 77010000   mov ecx,0x177 
0040AAEA  |.  33C0          xor eax,eax 
0040AAEC  |.  8D7C242C     lea edi,dword ptr ss:[esp+0x2C] 
0040AAF0  |.  F3:AB         rep stos dword ptr es:[edi]                      ;  清空堆栈 
0040AAF2  |.  8B8424 100600>mov eax,dword ptr ss:[esp+0x610]                 ;  数据包总长度放入eax 
0040AAF9  |.  8BF2          mov esi,edx 
0040AAFB  |.  8BC8          mov ecx,eax 
0040AAFD  |.  8D7C242C     lea edi,dword ptr ss:[esp+0x2C] 
0040AB01  |.  8BD9          mov ebx,ecx 
0040AB03  |.  83C2 02       add edx,0x2                                      ;  加2后,就可以从第3位开始 
0040AB06  |.  C1E9 02       shr ecx,0x2                                      ;  除4,ecx用作计数器。 
0040AB09  |.  F3:A5         rep movs dword ptr es:[edi],dword ptr ds:[esi]   ;  将内容复制到刚开辟的堆栈空间中去。用的是movs,这也是为什么上一步要将总长度除4、先给edx加2了。 
0040AB0B  |.  8BCB          mov ecx,ebx 
0040AB0D  |.  83E1 03       and ecx,0x3                                      ;  处理当长度不是2的整数倍的情况 
0040AB10  |.  F3:A4         rep movs byte ptr es:[edi],byte ptr ds:[esi] 
0040AB12  |.  8B0A          mov ecx,dword ptr ds:[edx] 
0040AB14  |.  894C240C     mov dword ptr ss:[esp+0xC],ecx                   ;  1 
0040AB18  |.  8B4A04       mov ecx,dword ptr ds:[edx+0x4] 
0040AB1B  |.  894C24 10     mov dword ptr ss:[esp+0x10],ecx                  ;  2 
0040AB1F  |.  8B4A08       mov ecx,dword ptr ds:[edx+0x8] 
0040AB22  |.  894C24 14     mov dword ptr ss:[esp+0x14],ecx                  ;  3 
0040AB26  |.  33C9          xor ecx,ecx 
0040AB28  |.  8B520C       mov edx,dword ptr ds:[edx+0xC] 
0040AB2B  |.  894C24 2E     mov dword ptr ss:[esp+0x2E],ecx                  ;  将保存到堆栈中的3-6位清零 
0040AB2F  |.  895424 18     mov dword ptr ss:[esp+0x18],edx                  ;  4,这四步刚好将数据包中3-18位保存到堆栈中 
0040AB33  |.  8D54241C     lea edx,dword ptr ss:[esp+0x1C] 
0040AB37  |.  52            push edx 
0040AB38  |.  894C24 36     mov dword ptr ss:[esp+0x36],ecx                  ;  将保存到堆栈中的7-10位清零 
0040AB3C  |.  50            push eax 
0040AB3D  |.  8D4424 34     lea eax,dword ptr ss:[esp+0x34]                  ;  堆栈中数据包的地址 
0040AB41  |.  894C24 3E     mov dword ptr ss:[esp+0x3E],ecx                  ;  将保存到堆栈中的11-14位清零 
0040AB45  |.  50            push eax 
0040AB46  |.  894C24 46     mov dword ptr ss:[esp+0x46],ecx                  ;  将保存到堆栈中的15-18位清零 
0040AB4A  |.  E8 C1AEFFFF   call 1_2_9破?00405A10 
0040AB4F  |.  83C40C       add esp,0xC 
0040AB52  |.  B9 04000000   mov ecx,0x4 
0040AB57  |.  8D7C240C     lea edi,dword ptr ss:[esp+0xC] 
0040AB5B  |.  8D74241C     lea esi,dword ptr ss:[esp+0x1C] 
0040AB5F  |.  33D2          xor edx,edx 
0040AB61  |.  F3:A7         repe cmps dword ptr es:[edi],dword ptr ds:[esi] 
0040AB63  |.  5F            pop edi 
0040AB64  |.  5E            pop esi 
0040AB65  |.  5B            pop ebx 
0040AB66  |.  75 09         jnz short 1_2_9破?0040AB71                        ;  这个跳转作为设置al的,可以作为去除MD5校验位处 
0040AB68  |.  B0 01         mov al,0x1 
0040AB6A  |.  81C4 FC050000 add esp,0x5FC 
0040AB70  |.  C3            retn 
0040AB71  |>  32C0          xor al,al 
0040AB73  |.  81C4 FC050000 add esp,0x5FC 
0040AB79  \.  C3            retn 
004064F0  /$  8BD1          mov edx,ecx 
004064F2  |.  57            push edi 
004064F3  |.  B9 10000000   mov ecx,0x10 
004064F8  |.  33C0          xor eax,eax 
004064FA  |.  8D7A04       lea edi,dword ptr ds:[edx+0x4] 
004064FD  |.  C702 B00D4300 mov dword ptr ds:[edx],1_2_9破?00430DB0 
00406503  |.  F3:AB         rep stos dword ptr es:[edi] 
00406505  |.  8942 48       mov dword ptr ds:[edx+0x48],eax 
00406508  |.  8942 44       mov dword ptr ds:[edx+0x44],eax 
0040650B  |.  C7424C01234>mov dword ptr ds:[edx+0x4C],0x67452301 
00406512  |.  C742 50 89ABC>mov dword ptr ds:[edx+0x50],0xEFCDAB89 
00406519  |.  C742 54 FEDCB>mov dword ptr ds:[edx+0x54],0x98BADCFE 
00406520  |.  C742 58 76543>mov dword ptr ds:[edx+0x58],0x10325476 
00406527  |.  8BC2          mov eax,edx 
00406529  |.  5F            pop edi 
0040652A  \.  C3            retn 
…… 
0040664F  |.  E8 7CF4FFFF   call 1_2_9破?00405AD0                             ; \1_2_9破?00405AD0
00406654  |.  8BFD          mov edi,ebp 
00406656  |.  8D753F       lea esi,dword ptr ss:[ebp+0x3F] 
00406659  |.  8B6C24 18     mov ebp,dword ptr ss:[esp+0x18] 
0040665D  |.  3BF5          cmp esi,ebp 
0040665F  |.  731A         jnb short 1_2_9破?0040667B 
00406661  |>  8B5424 14     /mov edx,dword ptr ss:[esp+0x14] 
00406665  |.  8BCB          |mov ecx,ebx 
00406667  |.  8D4432 C1     |lea eax,dword ptr ds:[edx+esi-0x3F] 
0040666B  |.  50            |push eax                                        ; /Arg1 
0040666C  |.  E8 5FF4FFFF   |call 1_2_9破?00405AD0                            ; \1_2_9破?00405AD0
00406671  |.  83C6 40       |add esi,0x40 
00406674  |.  83C7 40       |add edi,0x40 
00406677  |.  3BF5          |cmp esi,ebp 
00406679  |.^ 72 E6         \jb short 1_2_9破?00406661 
00405B2C  |.  8D8C0178A46A>lea ecx,dword ptr ds:[ecx+eax+0xD76AA478] 
00405A60  |.  E8 1B0B0000   call 1_2_9破?00406580                             ; \1_2_9破?00406580 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 5
支持
分享
最新回复 (16)
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
第一次离LZ这么近 老大来精吧
2013-11-17 02:30
0
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
这个头像今年很流行吗、。?
2013-11-17 08:17
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
留明观看。
2013-11-17 09:41
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看看什么是md5
2013-11-17 12:05
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
分析很详实,适合新手。
2013-11-17 12:25
0
雪    币: 124
活跃值: (469)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
看雪书上的我也是看得迷迷糊糊
2013-11-17 13:04
0
雪    币: 59
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
存档,仰望
2013-11-17 14:03
0
雪    币: 80
活跃值: (109)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
接着支持
2013-11-17 14:31
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
科班出身的楼主很是扎实
2013-11-17 21:36
0
雪    币: 9720
活跃值: (2531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
分析的很详细
2013-11-17 22:18
0
雪    币: 329
活跃值: (235)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
12
以前学电子 的,最近才转到计算机~也不算是科班吧。。。
2013-11-17 23:00
0
雪    币: 329
活跃值: (235)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
13
表示用了5-6年了
2013-11-17 23:49
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
描述得很详细,留个mark慢慢看
2013-11-19 00:44
0
雪    币: 190
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
描述得很详细,留个mark慢慢看
2013-11-19 02:42
0
雪    币: 42
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
16
标记下。以后看
2013-11-24 19:16
0
雪    币: 329
活跃值: (235)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
17
慢慢看~~~
2013-12-11 14:21
0
游客
登录 | 注册 方可回帖
返回
//