system无内含bin/sh解法
32位的分布:
返回地址+下一次的返回地址+参数1+参数2+…
eg:p32(system_adder)+p(0)+p(bin/sh_adder)
64位的分布
首先覆盖掉buf和rbp,然后是pop rdi; ret指令的地址,再接着是’/bin/sh’字符串的地址,最后是system()函数的地址。
流程为:子函数返回到pop rdi; ret处,该指令会将当前栈顶的元素(’/bin/sh’字符串的地址)出栈并存入rdi中,并返回到下一条指令处。此时栈中就只有system()函数的地址了,所以下一条指令正是system(),而它需要的参数正好就在rdi寄存器中,这样就执行了system(‘/bin/sh’)
write函数参数含义
stdin,stdout,stderr是随着计算机系统的开启默认打开的,
其中0就是stdin表示输入流,指从键盘输入,1代表stdout,2代表stderr,1,2默认是显示器
payload=b’a’*(offset+8)+ p64(rdi) + p64(sh) + p64(ret) + p64(sys)
payload2=b’a’*offset+ p64(ret)+ p64(rdi) + p64(sh) + p64(sys)
ROP链实现execve系统调用,这里我们可以借助ROPgadget工具自动生成ropchain,命令行如下:ROPgadget --binary 文件名 --ropchain
ROPgadget –binary pwn | grep “pop rdi“