NPUCTF2020_Baby_Obfuscation
[NPUCTF2020]Baby Obfuscation
ida64位打开

加了混淆,不过不算很长,直接分析
首先是FOX函数

FOX1是gcd
因此v3 = F0X1(A0X3[i_0], A0X3[i_0]);即为v3 = A0X3[i_0]
所以整体是一个for(int i = 1; i <= len; i++)的循环

第一个if
FOX5是求a的b次方,化简可得if(A0X3[i_0] + A0X3[i_0 + 1] >= 4)
结合A0X3数组的初始化

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

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

同理可得,条件恒真
A0X1[i_0] ^= A0X4[v16 % 4]
第四个if

当x>0时3^x > x + 1,因此v18 = 0,if条件恒假
分析完毕,写脚本
| 1 | enc = [ | 
| 1 | NPUCTF{0bfu5er} |