import
ctypes
from
capstone
import
*
from
keystone
import
*
from
pwn
import
*
context.arch
=
'amd64'
from
pwn
import
*
fuckTable
=
[
0x00412F5E
,
0xFFFFFA22
,
0x14252652
,
0xFFFFF9AC
,
0x66CEF8EC
,
0x0251D934
,
0x0000009F
,
0xC56FBF59
,
0xFFFFFF61
,
0xAA4D5B7C
,
0x02745896
,
0xFFFFFB7F
,
0x34B6D31E
,
0xFFFFFBB0
,
0x302CC828
,
0x02AC5992
,
0xFFFFF524
,
0x67CC4064
,
0xFFFFF483
,
0x8A5D9B26
,
0x046254D0
,
0xFFFFFC37
,
0x074AB936
,
0xFFFFFC7F
,
0xB8EA37F7
,
0x0CACD9FE
,
0x0000007F
,
0x6112F222
,
0x00000002
,
0x47A72561
,
0x0F0FE6EB
,
0xFFFFFBAE
,
0x0A1411E7
,
0xFFFFFC85
,
0x3BE88B46
,
0x0FC59DC2
,
0xFFFFF72F
,
0x7D12A5EF
,
0xFFFFF691
,
0xE67393D6
,
0x10B1EBCA
,
0x000001CF
,
0x473A1295
,
0x0000022E
,
0x7BC15385
,
0x1565D41D
,
0xFFFFFDC4
,
0x05D337BE
,
0xFFFFFE7E
,
0xE12982E4
,
0x18909E40
,
0x000005EB
,
0xAE2337AF
,
0x000005B1
,
0x8E0AB2ED
,
0x1AE7593A
,
0xFFFFF3BC
,
0x23E9058D
,
0xFFFFF40B
,
0xDFA6CF3E
,
0x1B47DA81
,
0xFFFFF8C3
,
0x349CC616
,
0xFFFFF7E9
,
0x70C290D0
,
0x1D816435
,
0x00000002
,
0x43F999C9
,
0xFFFFFFD8
,
0xAB0BCA16
,
0x1DACC905
,
0xFFFFFF54
,
0x5C129962
,
0xFFFFFD06
,
0xE4515A41
,
0x1E03B13C
,
0xFFFFFF80
,
0x7E763806
,
0xFFFFF36A
,
0xA25F3D93
,
0x22FEFC06
,
0xFFFFFCDD
,
0xB94E0C2F
,
0xFFFFFCB6
,
0xF023033D
,
0x26B1E690
,
0xFFFFFDAB
,
0xD0C7ED0C
,
0xFFFFFE9B
,
0xD49872C6
,
0x2A652084
,
0x000001EA
,
0xDF9B65EE
,
0x00000051
,
0x5CC5AB90
,
0x2FBEBD25
,
0x0000048F
,
0x60A4E9F2
,
0x000009AF
,
0x42FE8B0D
,
0x34F12D90
,
0x000004C0
,
0xF6257D94
,
0x00000480
,
0x5227DE21
,
0x35F591D0
,
0xFFFFFCA1
,
0xDA83E113
,
0xFFFFF998
,
0x805C7ECB
,
0x37EB0B72
,
0xFFFFF3EC
,
0x7480201A
,
0xFFFFF903
,
0xAC977E11
,
0x389A58A8
,
0x00000189
,
0xE4005CD7
,
0xFFFFFDEC
,
0xB043695F
,
0x3CB24155
,
0x0000084C
,
0x8ACB6FF1
,
0x00000899
,
0xACB471A5
,
0x3DCBCDE3
,
0x000007A8
,
0xA84E3072
,
0x00000384
,
0xB2624259
,
0x3F5290DE
,
0xFFFFFE25
,
0x8AC11F92
,
0xFFFFFD8A
,
0x44ACCD78
,
0x47FF9B7E
,
0x00000A81
,
0x9833BF9C
,
0x00000B35
,
0x9B7199CD
,
0x4C7867E6
,
0x0000011C
,
0x68BB4F80
,
0x0000002E
,
0x75B675CD
,
0x53ADCD80
,
0x000004E8
,
0x6AA4F705
,
0x00000452
,
0xBA7C314B
,
0x566E1640
,
0x00000C8E
,
0x203E3737
,
0x00000C38
,
0xF9367ED9
,
0x5EDBB130
,
0x000004FF
,
0xD4F71A40
,
0x000002AA
,
0x35DC4141
,
0x6C29C83A
,
0x00000013
,
0xBEAD8A76
,
0xFFFFFFB5
,
0x7A8A43EF
,
0x6E036C9C
,
0x00000BD5
,
0x225F81E0
,
0x00000D89
,
0x3C25944D
,
0x6FDCCE50
,
0x00000605
,
0xD3126740
,
0x000003D5
,
0xA3DA544C
,
0x7132D345
,
0x0000064E
,
0x00915A5A
,
0x000006DD
,
0x5BCB6B22
,
0x720DBD5C
,
0x000008C3
,
0x64DCFDF6
,
0x00000858
,
0x190B20BB
,
0x7A035AD4
,
0x00000424
,
0x4DD955FB
,
0x000004BF
,
0xF65150B5
,
0x7CBAED22
,
0x00000AA1
,
0x62CC154B
,
0xFFFFFC58
,
0x8DD5CEDB
,
0x7EBF8EA8
,
0x00000458
,
0xCE844A0E
,
0xFFFFF734
,
0x9079D6BA
,
0x804885CD
,
0x000007BB
,
0x89A8DA66
,
0x00000136
,
0x7185B813
,
0x82190F37
,
0xFFFFF58C
,
0x013FA7D4
,
0xFFFFF4AB
,
0x7518093D
,
0x83F7826A
,
0x00000917
,
0x2F33C3DD
,
0xFFFFFBF0
,
0x02A289B1
,
0x8481BFD5
,
0xFFFFF927
,
0x72EED2D1
,
0xFFFFF80A
,
0xF46FD351
,
0x85A69D6E
,
0x000000B4
,
0x27A3BB0F
,
0x00000181
,
0x49235BC0
,
0x85F73150
,
0x00000259
,
0xA300692F
,
0x000009BD
,
0x5A3E46A9
,
0x86E2497A
,
0xFFFFFB53
,
0xE7614707
,
0xFFFFFBB3
,
0xFA190B2A
,
0x8B261F60
,
0xFFFFF323
,
0x97B9CC33
,
0xFFFFFAB7
,
0x2CB73BF0
,
0x8B42B00C
,
0x00000871
,
0xA57A2DE3
,
0x00000797
,
0xA73082D6
,
0x8E4C5C94
,
0x000000FE
,
0xEE4B594B
,
0xFFFFF999
,
0xDCE3B74D
,
0x913A9FDB
,
0xFFFFFE1C
,
0x1BFFA329
,
0xFFFFFD31
,
0x49B21C95
,
0x922BFB96
,
0xFFFFF61B
,
0x4FAFD829
,
0xFFFFFBBA
,
0x6BD5D317
,
0x9F4B8702
,
0xFFFFFEC1
,
0xB691AD49
,
0xFFFFFEF2
,
0xCE6C6FE9
,
0xA2CEAAA6
,
0xFFFFFD89
,
0x60E52701
,
0xFFFFFCB2
,
0x25AD9A9D
,
0xAA970D72
,
0xFFFFF2BB
,
0xC1F58CAC
,
0xFFFFF2AB
,
0x20B8FE22
,
0xABC02B72
,
0xFFFFF94B
,
0xFF6EA5A6
,
0xFFFFFA6A
,
0x1CD46647
,
0xAE535E9E
,
0x000003EC
,
0x31246F6B
,
0x0000035B
,
0x50E2A20A
,
0xB7337941
,
0xFFFFF856
,
0xD1A79AD7
,
0xFFFFF955
,
0x14673B75
,
0xBB8DB95E
,
0xFFFFFEEB
,
0x6A7F1E5A
,
0xFFFFF3B3
,
0x1EF2F3AA
,
0xBC1EDA22
,
0xFFFFFB90
,
0xE247955F
,
0xFFFFFCE6
,
0xA0351A85
,
0xBCD91FE8
,
0x0000008C
,
0x71A348B9
,
0x00000030
,
0x821754EF
,
0xBD38E305
,
0xFFFFFF59
,
0xE694333F
,
0xFFFFFEF9
,
0x436B1A45
,
0xBE1AA65A
,
0xFFFFF93D
,
0x8761A810
,
0xFFFFFEEB
,
0xB2DB19FA
,
0xC052453C
,
0x000009B5
,
0xB05027D7
,
0x000009C5
,
0xBCA91679
,
0xC4A2D780
,
0x000008B9
,
0xE42FD068
,
0x000007C1
,
0x9F8B2B83
,
0xC6A236BA
,
0xFFFFFDBB
,
0x20649A12
,
0xFFFFFD09
,
0x5F73FD94
,
0xC6BB5160
,
0xFFFFFE90
,
0x0ED42674
,
0xFFFFFF4B
,
0xA76699CC
,
0xCB74E940
,
0x000003E3
,
0x7DA194FF
,
0xFFFFFCDA
,
0xB23E5B15
,
0xD027B387
,
0xFFFFF701
,
0x880BCC4F
,
0xFFFFF785
,
0xFEA3D685
,
0xD1127D6B
,
0xFFFFFAC0
,
0xDF3D499A
,
0x00000362
,
0x84B7777D
,
0xD6F5F913
,
0xFFFFFCCD
,
0xA5D89DB8
,
0xFFFFFCAB
,
0xF69BAE29
,
0xDD04F828
,
0xFFFFF705
,
0xE18F3BA0
,
0xFFFFF64D
,
0xEBC799B0
,
0xDDF22CB8
,
0x0000075D
,
0x47F7B857
,
0x000001B3
,
0x5C1CDEA9
,
0xDF34D0A8
,
0x0000014D
,
0xBFE2CAD5
,
0x00000201
,
0x1F0C8A89
,
0xE146EA40
,
0x0000046D
,
0x189EB8F9
,
0xFFFFF6FB
,
0x4CA1090D
,
0xE231C560
,
0x00000710
,
0x2E586529
,
0xFFFFFF17
,
0x0E9AA776
,
0xE2FC6838
,
0x00000733
,
0xB73DDD7A
,
0x00000753
,
0x14A1BDE4
,
0xE44AE35D
,
0x000002C8
,
0x46B1F3D1
,
0xFFFFFA2D
,
0xD2295816
,
0xE5AF4AB1
,
0x00000DB0
,
0x0AFF4FF9
,
0x00000D91
,
0xB17A4340
,
0xE7E3CF21
,
0x00000656
,
0x9FC50924
,
0x00000658
,
0x31615022
,
0xE8815965
,
0x00000BCB
,
0x6F51A655
,
0x00000C0A
,
0x72F5680C
,
0xEBDF0F14
,
0xFFFFF2B1
,
0xD36EC5D4
,
0xFFFFF239
,
0x3B711343
,
0xEC12E59B
,
0x00000270
,
0x3A38D2E8
,
0x0000023D
,
0x68D07674
,
0xF4013920
,
0x00000703
,
0xD83CCFAA
,
0x000007BA
,
0x46891EEB
,
0xF6847EC1
,
0xFFFFFE62
,
0x6D4BAAFC
,
0xFFFFFD92
,
0x5E6F5A94
]
size_table
=
[
0x02F73020
,
0x00000015
,
0x09D3473A
,
0x00000051
,
0x0EF87B55
,
0x0000000D
,
0x147CB028
,
0x00000023
,
0x15F833AA
,
0x00000030
,
0x17086780
,
0x00000018
,
0x1733A9D4
,
0x00000014
,
0x17D61EE8
,
0x00000051
,
0x1D52F19E
,
0x00000011
,
0x1F732DE0
,
0x0000000D
,
0x1FBECFAD
,
0x0000001B
,
0x245BD7C8
,
0x00000055
,
0x25E7ABEE
,
0x00000009
,
0x2882C190
,
0x000000A2
,
0x2A2084A0
,
0x00000075
,
0x326AA6AE
,
0x00000036
,
0x33074A36
,
0x00000024
,
0x3440BD69
,
0x0000002C
,
0x362A1FC3
,
0x0000002C
,
0x3C0450D0
,
0x0000000D
,
0x3CB575FD
,
0x00000011
,
0x41B3B26E
,
0x0000004E
,
0x46005120
,
0x00000011
,
0x465A72CF
,
0x00000002
,
0x492145A0
,
0x0000000D
,
0x49AA4CE0
,
0x0000002D
,
0x4BD63647
,
0x0000004E
,
0x4BF84A87
,
0x0000000D
,
0x4D102445
,
0x00000033
,
0x4D4D3C55
,
0x0000001B
,
0x53723232
,
0x0000000A
,
0x5809B5CB
,
0x000000A2
,
0x5B12FFCE
,
0x00000015
,
0x5B1F3000
,
0x00000051
,
0x5D9FBD20
,
0x00000027
,
0x6219EED9
,
0x0000008A
,
0x65D82D17
,
0x0000004C
,
0x67F5671A
,
0x00000063
,
0x6CE2CBC1
,
0x00000033
,
0x718A739C
,
0x0000000B
,
0x71A62DD7
,
0x00000015
,
0x7693A1F6
,
0x00000014
,
0x7A473FB0
,
0x00000047
,
0x7AEFEDDC
,
0x00000011
,
0x7AF2CF90
,
0x0000004F
,
0x7BE0B8B0
,
0x0000001B
,
0x80EB3E88
,
0x0000000A
,
0x8213506A
,
0x0000000C
,
0x82468114
,
0x00000011
,
0x86B872A2
,
0x0000001C
,
0x87FBD296
,
0x00000019
,
0x88719339
,
0x00000016
,
0x89E2630A
,
0x00000024
,
0x8CB6536E
,
0x0000004E
,
0x92316E00
,
0x00000015
,
0x9415A51E
,
0x0000004F
,
0x94D658E0
,
0x0000002B
,
0x97E8DFCD
,
0x00000036
,
0x992E3874
,
0x0000002A
,
0x9B06958D
,
0x00000030
,
0x9B36B480
,
0x0000000D
,
0xA03CEFAD
,
0x0000005A
,
0xA39F47E6
,
0x0000004E
,
0xA946DEC4
,
0x000000B4
,
0xAE6173DC
,
0x00000051
,
0xB044A68D
,
0x0000008C
,
0xB29E36A8
,
0x0000000B
,
0xB82781F4
,
0x0000000D
,
0xC14DFAF8
,
0x00000011
,
0xC3F42E20
,
0x0000001E
,
0xC5E0065E
,
0x00000067
,
0xCAD68B21
,
0x00000039
,
0xCBF29AC7
,
0x00000011
,
0xCE8729BC
,
0x0000001B
,
0xD2A85A94
,
0x00000004
,
0xD34FA4F3
,
0x00000011
,
0xD64611B0
,
0x00000058
,
0xD814FD56
,
0x00000018
,
0xDD386A80
,
0x0000000A
,
0xDE82DFAC
,
0x00000011
,
0xEC68D16F
,
0x0000001B
,
0xEEDE845B
,
0x0000003F
,
0xF235F260
,
0x0000008D
,
0xF9AA1F0B
,
0x00000087
,
0xFC200887
,
0x00000011
,
0xFED657A3
,
0x0000000C
,
0x00000000
]
zf_0_jmp
=
0
zf_0_key
=
1
zf_1_jmp
=
2
zf_1_key
=
3
code_bin
=
open
(
"code.bin"
,
"rb"
).read()
print
(
"code size: "
,
hex
(
len
(code_bin)))
def
get_size(key):
for
i
in
range
(
85
):
if
size_table[i
*
2
]
=
=
key:
return
size_table[i
*
2
+
1
]
return
None
def
get_jmps(key):
for
i
in
range
(
85
):
base
=
i
*
5
if
fuckTable[base]
=
=
key:
return
fuckTable[base
+
1
: base
+
5
]
print
(
"not found2: "
,
hex
(key))
return
None
def
fuck(prev_key, rip):
return
rip ^ prev_key ^ ((rip
*
prev_key) &
0xffffffff
) ^ (prev_key
+
rip)
def
deXor(data, key):
key
=
p32(key)
data
=
bytearray(data)
for
i
in
range
(
len
(data)):
data[i] ^
=
key[i
%
4
]
return
data
def
decrypt_block(key, rip):
key2
=
fuck(key, rip)
blockSize
=
get_size(key2)
if
blockSize
is
None
:
print
(
"Not found1: rip:%x key:%x"
%
(rip, key2))
return
None
,
None
,
None
offset
=
rip
-
0x1000
code_data
=
code_bin[offset: offset
+
blockSize]
code_data
=
deXor(code_data, key)
next_rip
=
rip
+
blockSize
-
2
key2
=
fuck(key, next_rip)
jmps
=
get_jmps(key2)
return
code_data, jmps, next_rip
class
Node:
def
__init__(
self
, data, rip):
self
.code_data
=
data
self
.child1
=
0
self
.child2
=
0
self
.end_rip
=
None
self
.rip
=
rip
def
disasm(data, baseaddr):
md
=
Cs(CS_ARCH_X86, CS_MODE_64)
ins
=
''
for
i
in
md.disasm(data, baseaddr):
asm_code
=
"%s\t%s"
%
(i.mnemonic, i.op_str)
ins
+
=
asm_code
+
"\n"
return
ins
def
buildNode(key_, rip_):
work_queue
=
[(key_, rip_)]
log_map
=
{}
while
len
(work_queue) >
0
:
T
=
work_queue[
0
]
work_queue.remove(T)
key, rip
=
T
if
rip
in
log_map:
continue
if
rip
=
=
0x10A3
:
key
-
=
0x2B09B990
rip
=
0x1EEC
code_data, jmps, next_rip
=
decrypt_block(key, rip)
if
code_data
is
None
:
continue
node_cur
=
Node(code_data, rip)
node_cur.end_rip
=
next_rip
log_map[rip]
=
node_cur
if
jmps
is
None
:
continue
asm_text
=
disasm(node_cur.code_data, rip)
newrip
=
next_rip
+
ctypes.c_int32(jmps[zf_0_jmp]).value
node_cur.child1
=
newrip
if
newrip
not
in
log_map:
work_queue.append(((key
+
jmps[zf_0_key]) &
0xffffffff
, newrip))
if
'qword ptr fs:['
in
asm_text.splitlines()[
-
1
]:
continue
newrip
=
next_rip
+
ctypes.c_int32(jmps[zf_1_jmp]).value
node_cur.child2
=
newrip
if
newrip
not
in
log_map:
work_queue.append(((key
+
jmps[zf_1_key]) &
0xffffffff
, newrip))
jmptables
=
{}
for
i
in
sorted
(log_map.keys()):
if
log_map[i].child1
is
None
:
log_map[i].child1
=
0
if
log_map[i].child2
is
None
:
log_map[i].child2
=
0
jmptables[
hex
(log_map[i].end_rip)]
=
(
hex
(log_map[i].rip),
hex
(log_map[i].child1),
hex
(log_map[i].child2))
print
(
"len:"
,
len
(jmptables))
print
(jmptables)
all_asm
=
''
for
i
in
sorted
(log_map.keys()):
print
(
hex
(i))
node
=
log_map[i]
if
i
=
=
0x1EEC
:
all_asm
+
=
"_0x10a3:\n"
all_asm
+
=
"_"
+
hex
(i)
+
":\n"
all_asm
+
=
disasm(node.code_data, i)
if
node.child1 !
=
0
and
node.child2 !
=
0
:
jmp_code
=
"jz _"
+
hex
(node.child2)
+
"\n"
jmp_code
+
=
"jmp _"
+
hex
(node.child1)
+
"\n"
elif
node.child1
=
=
0
and
node.child2 !
=
0
:
jmp_code
=
"jmp _"
+
hex
(node.child2)
+
"\n"
elif
node.child2
=
=
0
and
node.child1 !
=
0
:
jmp_code
=
"jmp _"
+
hex
(node.child1)
+
"\n"
else
:
jmp_code
=
'\n'
all_asm
+
=
jmp_code
all_asm
=
all_asm.replace(
"endbr64"
,
"nop\n"
*
4
)
code_bin
=
asm(all_asm)
open
(
'1.bin'
,
'wb'
).write(code_bin)
print
(all_asm)
print
(
"all nodes: "
,
len
(log_map))
buildNode(
0x3265B1F5
,
0x1000
)