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
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)