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

在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来维护栈平衡。

 

PWN_ROP——使用WRITE函数的一些注意的地方_第1张图片

 

 

 

你可能感兴趣的:(PWN_ROP——使用WRITE函数的一些注意的地方)