import
itertools
def
test():
table
=
map
(
ord
,
file
(
'table.bin'
,
'rb'
).read())
dst
=
[
0
]
*
8
a
=
0x21
i
=
0
dst[i]
=
table[i]
for
j
in
range
(
8
):
if
a &
1
:
dst[i]
+
=
1
else
:
dst[i]
=
table[dst[i]]
a >>
=
1
if
i
in
[
0
,
7
]:
dst[i]
-
=
1
print
dst[i]
def
crack_part2():
table
=
map
(
ord
,
file
(
'table.bin'
,
'rb'
).read())
dst
=
[
0
]
*
8
flag
=
'B4D682C8BF2DE13A'
check
=
[
0x47
,
0x6F
,
0x6F
,
0x64
,
0x4A
,
0x6F
,
0x62
,
0x7E
]
for
i
in
range
(
8
):
for
k
in
range
(
256
):
a
=
k
dst[i]
=
table[i]
for
j
in
range
(
8
):
if
a &
1
:
dst[i]
+
=
1
else
:
dst[i]
=
table[dst[i]]
a >>
=
1
if
i
in
[
0
,
7
]:
dst[i]
-
=
1
if
dst[i]
=
=
check[i]:
flag
+
=
'{:02X}'
.
format
(k)[::
-
1
]
break
print
'flag:'
+
flag
print
'flag:'
+
flag
def
crack_table(a1,a2,a3,a4,a5,a6,a7,a8):
byte_40400
=
table
=
map
(
ord
,
file
(
'table_ori.bin'
,
'rb'
).read())
byte_40400[
0
]
=
a1
byte_40400[
1
]
=
a2
byte_40400[
2
]
=
a3
byte_40400[
3
]
=
a4
byte_40400[
4
]
=
a5
byte_40400[
5
]
=
a6
byte_40400[
6
]
=
a7
byte_40400[
7
]
=
a8
i
=
0
dword_404100
=
[
0x00000002
,
0x00000004
,
0x00000008
,
0x00000010
,
0x00000020
,
0x00000040
,
0x00000080
,
0
]
v21
=
0
v22
=
0
v23
=
0
v24
=
0
byte_404220
=
[
0
]
*
512
byte_v25
=
[]
while
i<
256
:
byte_v25.append([
0
]
*
256
)
j
=
0
byte_404220[
0
]
=
byte_40400[i]
byte_404220[
1
]
=
(i
+
1
)
%
256
tt
=
2
v3
=
0
while
j<
7
:
tmp
=
dword_404100[j]
double
=
0
while
tmp:
byte_404220[tt]
=
byte_40400[byte_404220[v3]]
byte_404220[tt
+
1
]
=
(byte_404220[v3]
+
1
)
%
256
tt
+
=
2
v3
+
=
1
tmp
-
=
1
j
+
=
1
for
k
in
range
(
256
):
byte_v25[i][byte_404220[v3]]
+
=
1
v3
+
=
1
i
+
=
1
for
i
in
range
(
256
):
first
=
40
if
byte_v25[i][first
-
40
]:
v21
+
=
1
if
byte_v25[i][first
-
26
]:
v22
+
=
1
if
byte_v25[i][first]:
v23
+
=
1
if
byte_v25[i][first
+
0x27
]:
v24
+
=
1
if
v21
=
=
0xa9
and
v22
=
=
0xac
and
v23
=
=
0xa7
and
v24>
0xc8
:
print
(
"Got"
)
return
True
return
False
def
crack_part1():
t
=
[
0x1e
,
0x28
,
0x4b
,
0x6d
,
0x8c
,
0xa3
,
0xd2
,
0xfb
]
it
=
itertools.permutations(t)
for
i
in
it:
if
crack_table(
*
i):
print
'
'.join(map(lambda x:'
{:
02X
}'.
format
(x)[::
-
1
],i))
break
def
main():
crack_part2()
if
__name__
=
=
'__main__'
:
main()