今天突然看到这个文件,总觉得让它发霉太委屈了,如文中所说,共有三个重要的数据包,这里是以前整理到前面两个的,一直没有兴趣去把最后一个也整理一下,等什么时候再说吧,反正都是重复的东西
================================================
【文章标题】: 联创上网助手2.310.0不完全协议分析
【文章作者】: the0crat
【作者邮箱】: the0crat.cn_at_gmail.com
【作者主页】: http://the0crat.spaces.live.com
【生产日期】: 20070408
【软件名称】: 联创上网助手2.310.0
【作者声明】: 本文仅供研究学习,本人对因这篇文章而导致的一切后果,不承担任何法律责任。本文中的不足之处请各位多多指教
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
--------------------------------------------------------------------------------
(注:"不完全协议分析"指的是所需要构造的三个数据包中此文只写到前面两个,作者中间搁置了很久,重新拿起来的时候不想继续分析第三个了,至于第叁个数据包的结构都是重复的东西大家可以参照第二个数据包)
这个程序是用来连接网络的,江苏的很多高校都用它来上网计费,相信很多人都不会陌生.它用的是802.1x协议验证,FS5208交换机
简要介绍一下这个软件,用winpcap,通过检测ip地址的数量和nat等来实现防代理,一旦检测到立马断线,使用户不能通过一台电脑共享上网,太黑了.上次的那个老版本还限制网卡数量,大于1也断线.
这样就使得上网费用比较高,每小时0.6元,我习惯了不管做什么都经常连着网,每个月基本上上网费用就在80左右,根本没有一点大学该有的样子,很多同学学校都是可以包月.所以很是不爽.
多人共享上网是个好方案,那就首先要解除这个软件对多ip和nat的限制,或者分析协议重写一个。废话不说,进入正题。
关于802.1x的认证流程,参考图1,考虑到网上能够找到很多介绍802.1x的资料,而且这东西比较简单但是太长,所以本文跳过。更加详细的内容请各位自行参考802.1x的相关资料以明白认证流程。
客户端在认证过程中一共有五个包,其中客户端发送的一共有EAPoL-Start和EAP-Response/Identity和EAP-Response/Challenge三个包,限于文章长度,本文分析的是前两个
用Ethernet抓包可以看到Start包很清晰,并且802.1x的数据包在Ethernet里也很直观,能看到清晰的结构,没有什么多说的
0000 ff ff ff ff ff ff xx xx xx xx xx xx 88 8e 01 01 ........ ..C.....
0010 00 00 6c 69 6e 6b 61 67 65 00 00 00 00 00 ..linkag e.....
(本文中一些敏感的数据做了处理)
[Start数据包结构]
目标MAC 6字节
源MAC 6字节
类型 2字节 0x888e
802.1x
版本 1字节 1
类型 1字节 1
长度 2字节 0
Trailer 12字节
标记字符 7字节 必须是"linkage"
空 5字节
我们关心的是后面两个包的内容
先看一下Response/Identity
0000 xx xx xx xx xx xx xx xx xx xx xx xx 88 8e 01 00 ..S.......C.....
0010 00 1a 02 04 00 1a 01 xx xx xx xx xx xx xx xx xx .......xxxxxxxxx
0020 xx xx xx 40 69 6e 74 65 72 6e 65 74 6c 69 6e 6b [EMAIL="xxx@internetlink"]xxx@internetlink[/EMAIL]
0030 61 67 65 00 f4 1d af e2 dd 9f 48 a1 00 00 00 00 age.......H.....
[Response/Identity数据包结构]
目标MAC 6字节
源MAC 6字节
类型 2字节 0x888e
802.1x
版本 1字节 1
类型 1字节 0
长度 2字节 0x1a
扩展信息
Code 1字节 2
id 1字节 必须和Resquest/Identity包中的一样
长度 26字节 0x1a
类型 1字节 1
用户名 21字节
Trailer 20字节
标记字符 8字节 必须是"linkage"
IdentityCode 8字节
空 4字节
如果是上edu,区别只在于用户名的长度和包的总长度分别相应减小5个长度
还有Request/Identity中一个很重要的是返回一个Identity number(多次观察推测可能是个时间截吧~)
从协议流程来看,其中IdentityCode的值应该是Identity number经过某些运算后的得出的.废话不说,逆向一下
查壳,ASProtect 2.3 SKE build 04.26 Beta [3]
脱壳可以写好几篇文章了,跑太远了,本文重点讲的是逆向的过程,所以直接飞过,不会手脱的话可以试试VolX的脚本Aspr2.XX_unpacker_v1.0SC.
脱了以后什么东西都光光的了,这软件也没有什么其他的保护
bp wpcap_sendpacket,点验证后第二次断下来,return就是Response/Identity的处理过程,多return几个可以到这里
00408ED0 /$ 55 push ebp
00408ED1 |. 8BEC mov ebp, esp
00408ED3 |. 83E4 F8 and esp, FFFFFFF8
00408ED6 |. 81EC 48060000 sub esp, 648
00408EDC |. A1 A0984100 mov eax, dword ptr [4198A0]
00408EE1 |. 66:8B0D A4984100 mov cx, word ptr [4198A4]
00408EE8 |. 53 push ebx
00408EE9 |. 55 push ebp
00408EEA |. 56 push esi
00408EEB |. 57 push edi
00408EEC |. 894424 78 mov dword ptr [esp+78], eax
00408EF0 |. 66:894C24 7C mov word ptr [esp+7C], cx
00408EF5 |. E8 E686FFFF call 004015E0
00408EFA |. 8B10 mov edx, dword ptr [eax] ; //////////////////////////////////////////
00408EFC |. 895424 7E mov dword ptr [esp+7E], edx ; 往缓冲区里填包的数据
00408F00 |. 66:8B40 04 mov ax, word ptr [eax+4]
00408F04 |. 66:898424 820000>mov word ptr [esp+82], ax
00408F0C |. C68424 84000000 >mov byte ptr [esp+84], 88
00408F14 |. C68424 85000000 >mov byte ptr [esp+85], 8E
00408F1C |. C68424 87000000 >mov byte ptr [esp+87], 0
00408F24 |. C68424 86000000 >mov byte ptr [esp+86], 1
00408F2C |. C68424 8A000000 >mov byte ptr [esp+8A], 2
00408F34 |. E8 B783FFFF call 004012F0 ; mov eax,PacketID
00408F39 |. 888424 8B000000 mov byte ptr [esp+8B], al
00408F40 |. C68424 8E000000 >mov byte ptr [esp+8E], 1
00408F48 |. E8 F38CFFFF call 00401C40 ; mov eax,用户名指针
00408F4D |. 8D50 01 lea edx, dword ptr [eax+1]
00408F50 |> 8A08 mov cl, byte ptr [eax]
00408F52 |. 40 inc eax
00408F53 |. 84C9 test cl, cl
00408F55 |.^ 75 F9 jnz short 00408F50
00408F57 |. 2BC2 sub eax, edx
00408F59 |. 8BE8 mov ebp, eax
00408F5B |. 0FB7DD movzx ebx, bp
00408F5E |. E8 DD8CFFFF call 00401C40 ; mov eax,用户名指针
00408F63 |. 8BCB mov ecx, ebx
00408F65 |. 8BD1 mov edx, ecx
00408F67 |. C1E9 02 shr ecx, 2
00408F6A |. 8BF0 mov esi, eax
00408F6C |. 8DBC24 8F000000 lea edi, dword ptr [esp+8F]
00408F73 |. F3:A5 rep movs dword ptr es:[edi], dword p>
00408F75 |. 8BCA mov ecx, edx
00408F77 |. 83E1 03 and ecx, 3
00408F7A |. 83C5 05 add ebp, 5
00408F7D |. F3:A4 rep movs byte ptr es:[edi], byte ptr>
00408F7F |. 55 push ebp ; /NetShort
00408F80 |. 8D73 17 lea esi, dword ptr [ebx+17] ; |
00408F83 |. E8 FA3D0000 call 0040CD82 ; \ntohs
00408F88 |. 55 push ebp ; /NetShort
00408F89 |. 66:898424 8C0000>mov word ptr [esp+8C], ax ; |
00408F91 |. E8 EC3D0000 call 0040CD82 ; \ntohs
00408F96 |. 66:898424 8C0000>mov word ptr [esp+8C], ax
00408F9E |. 0FB68424 8B00000>movzx eax, byte ptr [esp+8B]
00408FA6 |. 50 push eax
00408FA7 |. 8D4C24 14 lea ecx, dword ptr [esp+14]
00408FAB |. 68 B0634100 push 004163B0 ; ASCII "SEND : RSP/ID ID(%d)",LF
00408FB0 |. 51 push ecx
00408FB1 |. E8 B73F0000 call 0040CF6D ; 将包的id填入"...ID(%d)"
00408FB6 |. 8D5424 1C lea edx, dword ptr [esp+1C]
00408FBA |. 68 08000088 push 88000008
00408FBF |. 52 push edx
00408FC0 |. E8 4B0B0000 call 00409B10
00408FC5 |. E8 16F5FFFF call 004084E0
00408FCA |. 8D8434 8C000000 lea eax, dword ptr [esp+esi+8C]
00408FD1 |. 6A 00 push 0
00408FD3 |. 50 push eax
00408FD4 |. E8 07FDFFFF call 00408CE0 ; 填trailer都在这里了!
00408FD9 |. 03F0 add esi, eax
00408FDB |. 8D8C24 94000000 lea ecx, dword ptr [esp+94]
00408FE2 |. 56 push esi
00408FE3 |. 51 push ecx
00408FE4 |. E8 E72F0000 call 0040BFD0 ; sendpacket()
00408FE9 |. A1 10B24100 mov eax, dword ptr [41B210]
00408FEE |. 83C4 24 add esp, 24
00408FF1 |. 40 inc eax
00408FF2 |. 5F pop edi
00408FF3 |. A3 10B24100 mov dword ptr [41B210], eax
00408FF8 |. B8 01000000 mov eax, 1
00408FFD |. 5E pop esi
00408FFE |. 5D pop ebp
00408FFF |. 5B pop ebx
00409000 |. 8BE5 mov esp, ebp
00409002 |. 5D pop ebp
00409003 \. C3 retn 跟入00408FD4 |. E8 07FDFFFF call 00408CE0 00408CE0 $ 55 push ebp
00408CE1 . 8BEC mov ebp, esp
00408CE3 . 81EC A4000000 sub esp, 0A4
00408CE9 . 8B0D E8624100 mov ecx, dword ptr [4162E8]
00408CEF . 53 push ebx
00408CF0 . 56 push esi
00408CF1 . 8B75 08 mov esi, dword ptr [ebp+8]
00408CF4 . 8BC6 mov eax, esi
00408CF6 . 8908 mov dword ptr [eax], ecx
00408CF8 . 8B15 EC624100 mov edx, dword ptr [4162EC]
00408CFE . 57 push edi
00408CFF . 8950 04 mov dword ptr [eax+4], edx
00408D02 . C745 EC F8624>mov dword ptr [ebp-14], 004162F8 ; ASCII "hello"
00408D09 . C745 08 D45C4>mov dword ptr [ebp+8], 00415CD4 ; ASCII "info"
00408D10 . 74 03 je short 00408D15
00408D12 . 75 01 jnz short 00408D15
00408D14 E8 db E8
00408D15 > 8D45 EC lea eax, dword ptr [ebp-14]
00408D18 . 8D5D 08 lea ebx, dword ptr [ebp+8]
00408D1B . 8B45 08 mov eax, dword ptr [ebp+8]
00408D1E . 8B4D EC mov ecx, dword ptr [ebp-14]
00408D21 . 50 push eax
00408D22 . 51 push ecx
00408D23 . 68 F0624100 push 004162F0 ; ASCII "%s,%s"
00408D28 . E8 48480000 call 0040D575 ; 格式化
00408D2D . 83C4 0C add esp, 0C
00408D30 . E8 CBF7FFFF call 00408500 ; 自身hash
hash值影响IdentityCode,跟入后一路进入到这里
hash运算的函数过程
004084A0 /$ 8B5424 08 mov edx, dword ptr [esp+8] ; 文件长度,nLen
004084A4 |. 8B4C24 04 mov ecx, dword ptr [esp+4] ; 指向文件数据,pData
004084A8 |. 83C8 FF or eax, FFFFFFFF
004084AB |. 85D2 test edx, edx
004084AD |. 74 21 je short 004084D0
004084AF |. 56 push esi
004084B0 |. 57 push edi
004084B1 |> 0FB639 /movzx edi, byte ptr [ecx]
004084B4 |. 8BF0 |mov esi, eax
004084B6 81E6 FF000000 and esi, 0FF
004084BC |. 33F7 |xor esi, edi
004084BE |. 8B3CB5 889441>|mov edi, dword ptr [esi*4+419488]
004084C5 |. C1E8 08 |shr eax, 8
004084C8 |. 33C7 |xor eax, edi
004084CA |. 41 |inc ecx
004084CB |. 4A |dec edx
004084CC |.^ 75 E3 \jnz short 004084B1
004084CE |. 5F pop edi
004084CF |. 5E pop esi
004084D0 |> F7D0 not eax
004084D2 \. C3 retn
也就是
int sum=0xFFFFFFFF;
int i;
for(i=0;i<nLen;i++)
{
sum=(sum>>=8)^((sum&0xFF)^*pData)*4+0x419488;
pData++;
}
hash值是0x34DEB678,脱壳以后要将整个函数改一下,比如改成
mov eax,34DEB678
retn
解决了自效验后返回到刚才那里继续
00408D35 . 8BF8 mov edi, eax
00408D37 . A1 60B64100 mov eax, dword ptr [41B660]
00408D3C . 33DB xor ebx, ebx
00408D3E . 3BC3 cmp eax, ebx
00408D40 . 75 06 jnz short 00408D48
00408D42 . 893D 60B64100 mov dword ptr [41B660], edi
00408D48 > E8 93F7FFFF call 004084E0
00408D4D . 57 push edi ; /HostLong
00408D4E . E8 29400000 call <jmp.&ws2_32.htonl> ; \htonl(自身hash)
00408D53 . 8946 08 mov dword ptr [esi+8], eax ; 压入包的"linkage."后面
00408D56 . E8 15F7FFFF call 00408470
00408D5B . E8 80F7FFFF call 004084E0
00408D60 . E8 0BF7FFFF call 00408470
00408D65 . 90 nop
00408D66 . EB 00 jmp short 00408D68
00408D68 /> 55 push ebp
00408D69 |. 8BEC mov ebp, esp
00408D6B |. 41 inc ecx
00408D6C |. 52 push edx
00408D6D |. 90 nop
00408D6E |. 5A pop edx
00408D6F |. 49 dec ecx
00408D70 |. 5D pop ebp
00408D71 |. 41 inc ecx
00408D72 |. 68 E700E700 push 0E700E7 ; /NetLong = E700E7
00408D77 |. E8 00400000 call <jmp.&ws2_32.htonl> ; \htonl(0xE700E7);
00408D7C |. 8946 0C mov dword ptr [esi+C], eax ; 这个也压入包后面
00408D7F |. 33C0 xor eax, eax
00408D81 |. 889D 5CFFFFFF mov byte ptr [ebp-A4], bl
00408D87 |. B9 1F000000 mov ecx, 1F
00408D8C |. 8DBD 5DFFFFFF lea edi, dword ptr [ebp-A3]
00408D92 |. F3:AB rep stos dword ptr es:[edi]
00408D94 |. 66:AB stos word ptr es:[edi]
00408D96 |. AA stos byte ptr es:[edi]
00408D97 |. 33D2 xor edx, edx
00408D99 |. 33C0 xor eax, eax
00408D9B |. 8955 F1 mov dword ptr [ebp-F], edx
00408D9E |. 8945 DD mov dword ptr [ebp-23], eax
00408DA1 |. 8955 F5 mov dword ptr [ebp-B], edx
00408DA4 |. 8945 E1 mov dword ptr [ebp-1F], eax
00408DA7 |. 8955 F9 mov dword ptr [ebp-7], edx
00408DAA |. 8945 E5 mov dword ptr [ebp-1B], eax
00408DAD |. 66:8955 FD mov word ptr [ebp-3], dx
00408DB1 |. 66:8945 E9 mov word ptr [ebp-17], ax
00408DB5 |. 885D F0 mov byte ptr [ebp-10], bl
00408DB8 |. 8855 FF mov byte ptr [ebp-1], dl
00408DBB |. 8845 EB mov byte ptr [ebp-15], al
00408DBE |. 8BFF mov edi, edi
00408DC0 |> 8A88 F0984100 /mov cl, byte ptr [eax+4198F0]
00408DC6 |. 888C05 5CFFFF>|mov byte ptr [ebp+eax-A4], cl
00408DCD |. 40 |inc eax
00408DCE |. 3ACB |cmp cl, bl
00408DD0 |.^ 75 EE \jnz short 00408DC0
00408DD2 |. B8 F0984100 mov eax, 004198F0 ; ASCII "0123456789012345678901234567890123456789"
00408DD7 |. 8D50 01 lea edx, dword ptr [eax+1] ; 记这个字符串为strMagic
00408DDA |. 8D9B 00000000 lea ebx, dword ptr [ebx]
00408DE0 |> 8A08 /mov cl, byte ptr [eax]
00408DE2 |. 40 |inc eax
00408DE3 |. 3ACB |cmp cl, bl
00408DE5 |.^ 75 F9 \jnz short 00408DE0
00408DE7 |. 2BC2 sub eax, edx ; strMagic长度n
00408DE9 |. 8BF8 mov edi, eax
00408DEB |. 55 push ebp
00408DEC |. 8BEC mov ebp, esp
00408DEE |. 6A FF push -1
00408DF0 |. 68 07B20100 push 1B207
00408DF5 |. 68 0E640300 push 3640E ; SE handler installation
00408DFA |. 64:A1 0000000>mov eax, dword ptr fs:[0]
00408E00 |. 50 push eax
00408E01 |. 64:8925 00000>mov dword ptr fs:[0], esp
00408E08 |. 58 pop eax
00408E09 |. 64:A3 0000000>mov dword ptr fs:[0], eax
00408E0F |. 58 pop eax
00408E10 |. 58 pop eax
00408E11 |. 58 pop eax
00408E12 |. 58 pop eax
00408E13 |. 8BE8 mov ebp, eax
00408E15 |. E8 8683FFFF call 004011A0 ; 跟得太阳升起又落下了,终于又将服务器返回的identity number取出来了
00408E1A |. 50 push eax ; /NetLong
00408E1B |. E8 5C3F0000 call 0040CD7C ; \ntohl(identity number)
00408E20 |. 8B55 E0 mov edx, dword ptr [ebp-20]
00408E23 |. 8D8C3D 5CFFFF>lea ecx, dword ptr [ebp+edi-A4]
00408E2A |. 8901 mov dword ptr [ecx], eax
00408E2C |. 8B45 E4 mov eax, dword ptr [ebp-1C]
00408E2F |. 8951 04 mov dword ptr [ecx+4], edx
00408E32 |. 8B55 E8 mov edx, dword ptr [ebp-18]
00408E35 |. 8941 08 mov dword ptr [ecx+8], eax
00408E38 |. 8951 0C mov dword ptr [ecx+C], edx ; 在strMagic后面附加16个字节的长度,用ntohl(identity number)接到后面,其余填0
00408E3B |. E8 A0F6FFFF call 004084E0
00408E40 |. 83C7 10 add edi, 10
00408E43 |. 57 push edi ; strMagic现在的长度n=40+16
00408E44 |. 8D85 5CFFFFFF lea eax, dword ptr [ebp-A4]
00408E4A |. 50 push eax ; 指向strMagic头的指针
00408E4B |. 8D4D F0 lea ecx, dword ptr [ebp-10]
00408E4E |. 51 push ecx ; 指向输出的地址,字符长度16字节
00408E4F |. E8 DC180000 call 0040A730 ; 关键HashFunction(&array_hash,&strMagic,56);
00408E54 |. 8A4E 09 mov cl, byte ptr [esi+9] ; /////////////////////
00408E57 |. 8A45 F1 mov al, byte ptr [ebp-F] ; 得出最终trailer
00408E5A |. 8A5E 08 mov bl, byte ptr [esi+8]
00408E5D |. 8A55 F0 mov dl, byte ptr [ebp-10]
00408E60 |. 32C8 xor cl, al
00408E62 |. 8A46 0A mov al, byte ptr [esi+A]
00408E65 |. 884E 09 mov byte ptr [esi+9], cl
00408E68 |. 8A4D F2 mov cl, byte ptr [ebp-E]
00408E6B |. 32C1 xor al, cl
00408E6D |. 8A4E 0C mov cl, byte ptr [esi+C]
00408E70 |. 32DA xor bl, dl
00408E72 |. 8A55 F3 mov dl, byte ptr [ebp-D]
00408E75 |. 8846 0A mov byte ptr [esi+A], al
00408E78 |. 8A45 F4 mov al, byte ptr [ebp-C]
00408E7B |. 32C8 xor cl, al
00408E7D |. 8A46 0D mov al, byte ptr [esi+D]
00408E80 |. 885E 08 mov byte ptr [esi+8], bl
00408E83 |. 8A5E 0B mov bl, byte ptr [esi+B]
00408E86 |. 884E 0C mov byte ptr [esi+C], cl
00408E89 |. 8A4D F5 mov cl, byte ptr [ebp-B]
00408E8C |. 32DA xor bl, dl
00408E8E |. 8A55 F6 mov dl, byte ptr [ebp-A]
00408E91 |. 32C1 xor al, cl
00408E93 |. 8A4E 0F mov cl, byte ptr [esi+F]
00408E96 |. 885E 0B mov byte ptr [esi+B], bl
00408E99 |. 8A5E 0E mov bl, byte ptr [esi+E]
00408E9C |. 8846 0D mov byte ptr [esi+D], al
00408E9F |. 8A45 F7 mov al, byte ptr [ebp-9]
00408EA2 |. 83C4 0C add esp, 0C
00408EA5 |. 32DA xor bl, dl
00408EA7 |. 32C8 xor cl, al
00408EA9 |. 884E 0F mov byte ptr [esi+F], cl
00408EAC |. 8B4D 0C mov ecx, dword ptr [ebp+C]
00408EAF |. 885E 0E mov byte ptr [esi+E], bl
00408EB2 |. 5F pop ; ediarray_trailer_num的末8位是identity number和0x00e700e7
00408EB3 |. 894E 10 mov dword ptr [esi+10], ecx ; array_trailer_new的前8位分别为array_trailer的对应位与array_hash的对应位的xor,后8位为0
00408EB6 |. 5E pop esi ; /////////////////////
00408EB7 |. B8 14000000 mov eax, 14
00408EBC |. 5B pop ebx
00408EBD |. 8BE5 mov esp, ebp
00408EBF |. 5D pop ebp
00408EC0 \. C3 retn
跟进call 0040A730
0040A730 /$ 83EC 58 sub esp, 58
0040A733 |. 8B4C24 60 mov ecx, dword ptr [esp+60]
0040A737 |. 33C0 xor eax, eax
0040A739 |. 894424 14 mov dword ptr [esp+14], eax
0040A73D |. 894424 10 mov dword ptr [esp+10], eax
0040A741 |. 8B4424 64 mov eax, dword ptr [esp+64]
0040A745 |. 50 push eax
0040A746 |. 51 push ecx
0040A747 |. 8D5424 08 lea edx, dword ptr [esp+8]
0040A74B |. 52 push edx
0040A74C |. C74424 0C 012>mov dword ptr [esp+C], 67452301
0040A754 |. C74424 10 89A>mov dword ptr [esp+10], EFCDAB89
0040A75C |. C74424 14 FED>mov dword ptr [esp+14], 98BADCFE
0040A764 |. C74424 18 765>mov dword ptr [esp+18], 10325476
0040A76C |. E8 4FFEFFFF call 0040A5C0 ; 将strMagic复制到另一个位置
; 取一块内存初始化为0123456...54321,末尾加上38h*8=1C0h,8个字节(这个是最初用来md5的)
0040A771 |. 8B4C24 68 mov ecx, dword ptr [esp+68]
0040A775 |. 8D4424 0C lea eax, dword ptr [esp+C]
0040A779 |. 50 push eax
0040A77A |. 51 push ecx
0040A77B |. E8 00FFFFFF call 0040A680 ; 跟进
0040A780 |. 83C4 6C add esp, 6C
0040A783 \. C3 retn
进来call 0040A680
0040A680 /$ 83EC 08 sub esp, 8
0040A683 |. 56 push esi
0040A684 |. 57 push edi
0040A685 |. 8B7C24 18 mov edi, dword ptr [esp+18]
0040A689 |. 33C9 xor ecx, ecx
0040A68B |. 8D47 12 lea eax, dword ptr [edi+12]
0040A68E |. 8BFF mov edi, edi
0040A690 |> 8A50 FE /mov dl, byte ptr [eax-2] ; /*
0040A693 |. 88540C 08 |mov byte ptr [esp+ecx+8], dl
0040A697 |. 8A50 FF |mov dl, byte ptr [eax-1]
0040A69A |. 88540C 09 |mov byte ptr [esp+ecx+9], dl
0040A69E |. 8A10 |mov dl, byte ptr [eax]
0040A6A0 |. 88540C 0A |mov byte ptr [esp+ecx+A], dl
0040A6A4 |. 8A50 01 |mov dl, byte ptr [eax+1]
0040A6A7 |. 88540C 0B |mov byte ptr [esp+ecx+B], dl
0040A6AB |. 83C1 04 |add ecx, 4
0040A6AE |. 83C0 04 |add eax, 4
0040A6B1 |. 83F9 08 |cmp ecx, 8
0040A6B4 |.^ 72 DA \jb short 0040A690 ; */38h*8=1C0h,将其复制一份到别处,长度8个字节
0040A6B6 |. 8B4F 10 mov ecx, dword ptr [edi+10] ; ecx=此1C0h
0040A6B9 |. C1E9 03 shr ecx, 3 ; ecx>>=3
0040A6BC |. 83E1 3F and ecx, 3F ; ecx&=3Fh
0040A6BF |. 83F9 38 cmp ecx, 38
0040A6C2 |. B8 38000000 mov eax, 38
0040A6C7 |. 72 05 jb short 0040A6CE
0040A6C9 |. B8 78000000 mov eax, 78
0040A6CE |> 2BC1 sub eax, ecx ; ecx小于38h则eax=0(即错误),否则eax=78h-38h=40h。(缓冲区按标准的4个字节对齐,所以分配40h的长度)
0040A6D0 |. 50 push eax
0040A6D1 |. 68 B0984100 push 004198B0
0040A6D6 |. 57 push edi
0040A6D7 |. E8 E4FEFFFF call 0040A5C0 ; 这里才是重要的md5
0040A6DC |. 6A 08 push 8
0040A6DE |. 8D4424 18 lea eax, dword ptr [esp+18]
0040A6E2 |. 50 push eax
0040A6E3 |. 57 push edi
0040A6E4 |. E8 D7FEFFFF call 0040A5C0 ; 再次md5,得到array_hash
0040A6E9 |. 8B4C24 2C mov ecx, dword ptr [esp+2C] ; 指向准备复制到的地址
0040A6ED |. 83C4 18 add esp, 18
0040A6F0 |. 41 inc ecx
0040A6F1 |. 8D47 02 lea eax, dword ptr [edi+2]
0040A6F4 |. BE 04000000 mov esi, 4
0040A6F9 |. 8DA424 000000>lea esp, dword ptr [esp]
0040A700 |> 8A50 FE mov dl, byte ptr [eax-2] ; //////////////////
0040A703 |. 8851 FF mov byte ptr [ecx-1], dl
0040A706 |. 8A50 FF mov dl, byte ptr [eax-1]
0040A709 |. 8811 mov byte ptr [ecx], dl
0040A70B |. 8A10 mov dl, byte ptr [eax]
0040A70D |. 8851 01 mov byte ptr [ecx+1], dl
0040A710 |. 8A50 01 mov dl, byte ptr [eax+1]
0040A713 |. 8851 02 mov byte ptr [ecx+2], dl
0040A716 |. 83C0 04 add eax, 4
0040A719 |. 83C1 04 add ecx, 4
0040A71C |. 4E dec esi ; 复制
0040A71D |.^ 75 E1 jnz short 0040A700 ; //////////////////
0040A71F |. B9 16000000 mov ecx, 16
0040A724 |. 33C0 xor eax, eax
0040A726 |. F3:AB rep stos dword ptr es:[edi]
0040A728 |. 5F pop edi
0040A729 |. 5E pop esi
0040A72A |. 83C4 08 add esp, 8
0040A72D \. C3 retn
[现在内存中Response/Identity数据包的结构]
目标MAC 6字节
源MAC 6字节
类型 2字节 0x888e
802.1x
版本 1字节 1
类型 1字节 0
长度 2字节 "internet":0x1a "edu":0x15
扩展信息
Code 1字节 2
id 1字节 必须和Resquest/Identity包中的一样
长度 26字节 "internet":0x1a "edu":0x15
类型 1字节 1
用户名 "internet":21字节 "edu":16字节
Trailer 20字节
标记字符 8字节 必须是"linkage"
自效验码 4字节 必须是0x78B6DE34
标量 4字节 0xE700E7
空 4字节
流程总结
strMagic[]="0123456789012345678901234567890123456789";
strcat(strMagic,(char*)ntohl(服务器返回的identity number));
MagicNum=0x67452301EFCDAB8998BADCFE10325476;
//////////////关键HashFunction(&array_hash,&strMagic,56);
MagicNum=算法x(strMagic,MagicNum); //算法x太大但十分明了,所以单独放于文件"FuncX.txt"中,略微修改即可提取
array_hash=算法x(strMagic,MagicNum);
看看包中trailer的结构:
"linkage" 8字节
自效验码 4字节 必须是0x78B6DE34
标量0xE700E7 4字节
空 4字节
从trailer中的自效验码开始8个字节每个字节与array_hash的对应位进行异或
//////////////
大功告成,此即为所求的Response/Identity包了 附加数据
0040C335 |. 83C4 2C add esp, 2C ; /////////////////////////////////////////////////
0040C338 |> A1 ECB84100 mov eax, dword ptr [41B8EC] ; 本机MAC
0040C33D |> 8A13 mov dl, byte ptr [ebx] ; Request,Identity包
0040C33F |. 3A10 cmp dl, byte ptr [eax]
0040C341 |. 0F85 A5080000 jnz 0040CBEC
0040C347 |. 8A4B 01 mov cl, byte ptr [ebx+1]
0040C34A |. 3A48 01 cmp cl, byte ptr [eax+1]
0040C34D |. 0F85 99080000 jnz 0040CBEC
0040C353 |. 8A53 02 mov dl, byte ptr [ebx+2]
0040C356 |. 3A50 02 cmp dl, byte ptr [eax+2]
0040C359 |. 0F85 8D080000 jnz 0040CBEC
0040C35F |. 8A4B 03 mov cl, byte ptr [ebx+3]
0040C362 |. 3A48 03 cmp cl, byte ptr [eax+3]
0040C365 |. 0F85 81080000 jnz 0040CBEC
0040C36B |. 8A53 04 mov dl, byte ptr [ebx+4]
0040C36E |. 3A50 04 cmp dl, byte ptr [eax+4]
0040C371 |. 0F85 75080000 jnz 0040CBEC
0040C377 |. 8A4B 05 mov cl, byte ptr [ebx+5]
0040C37A |. 3A48 05 cmp cl, byte ptr [eax+5] ; 这一段对比收到的包中的本地的mac地址是否正确
0040C37D |. 0F85 69080000 jnz 0040CBEC ; /////////////////////////////////////////////////
0040C383 |. 8A43 0C mov al, byte ptr [ebx+C]
0040C386 |. 3C 88 cmp al, 88
0040C388 |. 0F85 1B060000 jnz 0040C9A9
0040C38E |. 807B 0D 8E cmp byte ptr [ebx+D], 8E ; 这一段判断是不是802.1x认证方式
0040C392 |. 0F85 11060000 jnz 0040C9A9 ; /////////////////////////////////////////////////
0040C398 |. 8B15 88B14100 mov edx, dword ptr [41B188]
0040C39E |. 833A 01 cmp dword ptr [edx], 1 ; 判断协议版本
0040C3A1 |. 0F85 02060000 jnz 0040C9A9
0040C3A7 |. 0FB64B 12 movzx ecx, byte ptr [ebx+12]
0040C3AB |. 8BC1 mov eax, ecx
0040C3AD |. 48 dec eax ; 从Extensible Authentication Protocol的标志位判断当前数据包是哪一个步骤的。这里有四个步骤; Switch (cases 1..4)
0040C3AE |. 0F84 D8020000 je 0040C68C ; Request(code=1)
0040C3B4 |. 83E8 02 sub eax, 2
0040C3B7 |. 0F84 80010000 je 0040C53D
0040C3BD |. 48 dec eax
0040C3BE |. 74 32 je short 0040C3F2
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)