软件全称:Easy Internet Sharing Proxy Server 2.2
因为有整数溢出,导致复制长度过长,覆盖SEH,导致任意代码执行
分析来源:https://www.exploit-db.com/exploits/40760/
因为k0shl在i春秋讲这个,我也实践一下
欢迎大家交流,我的blog:http://blog.csdn.net/u012763794/
Windows 7 Sp1 32位
metasploit
EPS 2.2
windbg
IDA
mona
首先我们的exp来源于exploitdb,我的话要改一下开头的类名称为Metasploit3才能用
我们直接上metasploit,由于我们用的是win7,所以我们target就默认让它是win10,故意让它崩掉
还有你会发现默认使用的payload是windows/meterpreter/reverse_tcp
看看崩溃信息,ecx的值非常大,edi所指向的地址是没有任何权限的,所以导致了异常
我们在ida定位一下崩溃的伪代码
也看看汇编吧
ecx来源于[esp+8370h+var_640B],那我们在00439720下断点
我们下面可以看到这里有个带符号扩展的mov指令,movsx,这是将90扩展成dword
由于0x90的最高位是1啊,那扩展后的前3个字节的二进制位都是1,即结果是0xFFFFFF90,不信看下面
我们看到复制大小3fffffe4 ,而目的地址申请的大小为
0x04350000 - 0x04347000= 0x9000
这样就会复制到不可写的内存(超越了栈顶)
那么对于的C语言或者说是C++代码是怎样的呢
可以看到是将字符型转化为整型可以这样
我们用wireshark抓包,tcp流跟随一下,看看metasploit发送了什么
我们再看看metasploit,win10利用代码发送的数据啊
那我们完全有理由相信,触发漏洞的90出自于开头的90的其中一个
我们上pwntools,自己搞一下(payload是mona生成的定位字符)
发送,我们看到这时movsx ebp,byte ptr [esp+1F65h]
中[esp+1F65h]的值是61(即’a’),这样看不出是哪个位置的小a的值
那我们将payload改一下
payload = "ABCDEFGH...."
那从下面我们看到只要发送的第二个字符的二进制位的最高位为1即可触发漏洞
比如我们payload是:
payload = "A\xffCD
那么就会下面这样
不包括前两个字符,我们定位到SEH位置为1032,NEXT SEH就是1028咯
我们看看当我们执行到我们覆盖的SEH的指令时的栈情况
我们可以注意到03e7ff80就是NEXT SEH的位置
Windows7一般默认只是Windows软件和服务才开了DEP,所以我们不用绕过DEP,exploitdb的作者在Windows7是使用了绕过dep的方法,seh覆盖成了0043ad38这个地址
但这里没开DEP,这里直接覆盖SEH为pop pop ret,
由于后面的栈地址不够了,所以我们的Shellcode要放在前面
最终exp:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!