Pwn入门笔记(五)ROP

本文对比介绍了32位和64位程序中的Return Oriented Programming (ROP)技术。在32位程序中,通过在返回地址上写入函数PLT地址实现跳转,参数在栈上。而在64位程序中,参数由寄存器存储,通过poprdi指令修改rdi寄存器并调用函数。文中还提到了利用ROPgadget工具寻找相关gadgets的方法,并展示了如何构造payload。

32位的ROP

这个在栈基础中提到过,此处写出是为了和64位的形成对比。通过在返回地址上写上函数PLT的地址来实现跳转到函数,调用函数时压入参数后会压入eip(返回地址),然后32位程序参数在栈上,所以结构如下图:

栈底-高地址->c
b
a
实际调用函数中的返回地址eipdddd
原返回地址(r)system的plt表地址
原ebp (s)aaaa
aaaaaaaaaaaaaaa…
栈顶-低地址->

system的参数为a处,所以构造为

payload = flat([cyclic(0xn),p32(system_addr),cyclic(0x4),p32(binsh_addr)])

64位的ROP

而在64位程序中,参数由rdi,rsi,rdx,rcx,r8,r9来寄存前六个参数,多的才会存放到栈上,而当我们执行汇编指令pop rdi时,就会将栈顶的值赋给赋给rdi,所以只需要我们将我们需要修改的参数值写在pop rdi上面(靠近栈底的方向),再加上函数,即可实现给rdi赋值并且调用函数使用这个值。

栈底-高地址->
函数地址
参数
原返回地址(r)pop rdi;ret的地址
原rbp (s)aaaaaaaa
aaaaaaaaaaaaaaa…
栈顶-低地址->

在虚拟机中有工具ROPgadget可以直接进行搜索,如下图
在这里插入图片描述在图中搜索的是$0,这个在linux中相当于/bin/sh
也就是system("$0") == system("/bin/sh")

ROPgadget --binary 文件名 | grep '需要的汇编指令'
ROPgadget --binary 文件名 --string '\字符串'

即构造为

flat([cyclic(0xn),p64(pop_rdi_addr),p64(binsh_addr),p64(system_addr)])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值