RoarCTF2019_polyre

[RoarCTF2019]polyre

ida64位

image-20221123225019843

ollvm 混淆控制流,完全平坦化了

D-810反混淆

image-20221123225207637

分析程序

image-20221123225226574

单纯的在尾部加\0

image-20221123225307086

CRC校验后比较

要注意的有两个地方

一个是如何判断正负

image-20221123225511189

首先左移的末尾是0

又因为负数异或上的是0xB0004B7679FA26B3,也就是说,如果被操作数是负数,那么它的末尾一定为1,如果是偶数,则为零。

另一个方面,逆向的时候要右移,那么开头一定为0。所以当被操作数是负数的时候,

异或加右移后要补上缺失的负号,所以要|0x8000000000000000

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
flag = [
0xBC8FF26D43536296, 0x520100780530EE16,
0x4DC0B5EA935F08EC, 0x342B90AFD853F450,
0x8B250EBCAA2C3681, 0x55759F81A2C68AE4
]

for i in range(6):
enc = ""
x = flag[i]
for k in range(64):
if x & 1:
x = (x ^ 0xB0004B7679FA26B3) >> 1
x = x | 0x8000000000000000
else:
x = x >> 1

flag[i] = x
for i in range(8):
enc += chr(x & 0xff)
x = x >> 8
print(enc, end="")
1
flag{6ff29390-6c20-4c56-ba70-a95758e3d1f8}