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} |