软件全称:Easy Internet Sharing Proxy Server 2.2
因为有整数溢出,导致复制长度过长,覆盖SEH,导致任意代码执行
分析来源:de7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2W2P5s2m8D9L8$3W2@1i4K6u0V1k6r3u0Q4x3X3g2U0L8$3#2Q4x3V1k6W2P5s2m8D9L8$3W2@1M7#2)9J5c8U0b7H3y4K6j5H3i4K6u0r3
因为k0shl在i春秋讲这个,我也实践一下
欢迎大家交流,我的blog:c07K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0D9L8$3N6Q4x3X3g2U0M7$3c8F1i4K6u0W2L8X3g2@1i4K6u0r3N6e0l9I4x3U0M7$3x3K6M7&6y4q4)9J5c8R3`.`.
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:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课