NPUCTF2020_Baby_Obfuscation

[NPUCTF2020]Baby Obfuscation

ida64位打开

image-20230110213330683

加了混淆,不过不算很长,直接分析

首先是FOX函数

image-20230110213453876

FOX1是gcd

因此v3 = F0X1(A0X3[i_0], A0X3[i_0]);即为v3 = A0X3[i_0]

所以整体是一个for(int i = 1; i <= len; i++)的循环

image-20230110213700390

第一个if

FOX5是求a的b次方,化简可得if(A0X3[i_0] + A0X3[i_0 + 1] >= 4)

结合A0X3数组的初始化

image-20230110213825280

i_0的最小值为1,也就是说A0X3[i_0] + A0X3[i_0 + 1]的最小值为2 + 3 = 5,因此这个if为恒真条件

再化简if里面的语句。因为-a = ~a + 1,因此~(~a + b) == ~(-a - 1 + b) == a + 1 - b - 1 == a - b

因此最后化简为A0X1[i_0] = input[i_0-1] - A0X4[(i_0-1) % 4]

第二个if

image-20230110214606125

对相邻两个整数gcd,v7恒为1,而且gcd的值最小为1,因此条件恒假

第三个if

image-20230110214753085

同理可得,条件恒真

A0X1[i_0] ^= A0X4[v16 % 4]

第四个if

image-20230110214914481

当x>0时3^x > x + 1,因此v18 = 0,if条件恒假

分析完毕,写脚本

1
2
3
4
5
6
7
8
9
10
11
12
enc = [
0x00001E79, 0x00001E79, 0x00002135, 0x0000170D, 0x00001F41, 0x00001901, 0x00002CED, 0x000011F9,
0x00002649, 0x00002581, 0x00002DB5, 0x000014B5, 0x000025E5, 0x00002A31, 0x000030D5,
]

key = [2, 3, 4, 5]

for i in range(15):
x = (enc[i] - 1) // 100
x ^= key[i%4]
x += key[i%4]
print(chr(x&0xff), end="")
1
NPUCTF{0bfu5er}