PWN_ROP——使用WRITE函数的一些注意的地方

博客围绕I春秋《ROP与Ret to Libc》视频展开,重点讲述ROP中WRITE函数的使用。详细说明了使用PLT跳转时与CALL指令的不同,以及如何维护栈平衡,如利用init函数中的POP和RET指令,还分析了WRITE函数读取puts@got地址及输出字节等情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在I春秋的《ROP与Ret to Libc》视频中,讲解的非常详细,但是在理解使用WRITE函数中刚刚想能一些地方。

 

ROP += pwn.p32(addr_1)  #write@plt  这里使用的是PLT是个JMP的,不像CALL指令中会把返回地址压入栈中

ROP += pwn.p32(addr_2) #pop_3 ret  在init函数的最后,找到3个POP和1个RET,因为使用WRITE的时候压入了3个参数,这个需要维护平衡

ROP += pwn.p32(1)    #WRITE函数的第一个参数

ROP += pwn.p32(addr_3) #puts@got的地址,WRITE函数的第二个参数

ROP += pwn.p32(4)    #WRITE函数的第三个参数,SIZE大小

 

ROP += pwn.p32(addr_4) #这里是呼应第二条POP_3 ret,返回的地址为程序的MAIN地址,让程序再执行一遍。

 

思考一下,就是使用WRITE函数读puts@got的地址,并会输出4个字节的地址。同时,在这个中间会PUSH返回地址,返回回来需要清除3个压入的参数,因此找到了INIT函数最后几句话作为返回地址。

这些全都是因为PLT是直接跳转过去的,在一般的主函数中使用CALL指令和ADD ESP来维护栈平衡。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值