[NPUCTF2020]Baby Obfuscation
将该文件使用ida打开并直接查看main()函数
发现程序的主要逻辑为判断用户的输入是否符合要求,推测用户的输入为flag
此时我们倒着分析来看,发现A0X1的值要与F0X4(A0X6[i_1], 1) / 10的值相等
此时我们进入F0X4()函数分析
该函数的功能是返回a - b的值,所以此时需要A0X1的值与(A0X6 - 1)/10的值相等,而A0X6的值是已知的,因此本地的关键要用A0X1的值逆向推出用户的输入
此时我们可以看到有五处对A0X1进行操作的地方,因此我们需要逐一分析
首先查看第一处
F0X1()函数的功能如下所示,查询资料得知该函数是求两数的最大公约数
F0X5()函数的功能如下所示,发现该函数返回a的b次方
根据不等式(x+y)×(x+y) >= 4xy,因此第一处的判断恒成立,所以第一处的操作会执行
执行的操作为A0X1[i] = input - A0X4[i%4],接下来分析第二处
此时我们计算得知不等号两边的值都为1,因此此时if 的判断条件不成立,而接下来对A0X1的操作不会执行,然后我们再看第三处
相关变量的值已经通过注释标出,此时if 的判断条件成立,因此第三处的操作会执行,所以此处执行的操作实际上为异或操作:A0X1 ^= A0X4[i%4]
我们继续查看第四处
我们点进F0X3函数()进行查看
发现还欠嵌套了一个F0X2()函数,我们继续查看
综合分析得知只有当a == b == 1的时候F0X3()会返回true,因此此处的if 判断不会成立,操作不会执行
我们最后查看第5处
此处没有判定条件,一定会执行,此处执行的操作为*A0X1[i] = 10
综上所述,可以逆向三处操作的顺序来得到正确用户输入,解题脚本如下:
A0X6 = [0x00, 0x00, 0x00, 0x00, 0x79, 0x1E, 0x00, 0x00, 0x79, 0x1E,
0x00, 0x00, 0x35, 0x21, 0x00, 0x00, 0x0D, 0x17, 0x00, 0x00,
0x41, 0x1F, 0x00, 0x00, 0x01, 0x19, 0x00, 0x00, 0xED, 0x2C,
0x00, 0x00, 0xF9, 0x11, 0x00, 0x00, 0x49, 0x26, 0x00, 0x00,
0x81, 0x25, 0x00, 0x00, 0xB5, 0x2D, 0x00, 0x00, 0xB5, 0x14,
0x00, 0x00, 0xE5, 0x25, 0x00, 0x00, 0x31, 0x2A, 0x00, 0x00,
0xD5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x70, 0x57, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
A0X4 = [2,3,4,5]
num1 = []
flag = ''
for i in range(len(A0X6)):
if i%4 == 0:
temp = ''
if A0X6[i+3] !=0:
if len(hex(A0X6[i+3])[2:]) == 1:
temp = '0'+hex(A0X6[i+3])[2:]
else:
temp = hex(A0X6[i+3])[2:]
if A0X6[i+2] !=0:
if len(hex(A0X6[i+2])[2:]) == 1:
temp = temp + '0'+hex(A0X6[i+2])[2:]
else:
temp = temp + hex(A0X6[i+2])[2:]
if A0X6[i+1] !=0:
if len(hex(A0X6[i+1])[2:]) == 1:
temp = temp + '0'+hex(A0X6[i+1])[2:]
else:
temp = temp + hex(A0X6[i+1])[2:]
if A0X6[i] !=0:
if len(hex(A0X6[i])[2:]) == 1:
temp = temp + '0'+hex(A0X6[i])[2:]
else:
temp = temp + hex(A0X6[i])[2:]
if temp == '':
temp = '00'
num1.append(int(('0x'+temp), 16))
print(num1)
for i in range(1,16):
A0X1 = (num1[i] -1) / 10
A0X1 = int(A0X1 / 10)
A0X1 = A0X1 ^ A0X4[(i-1)%4]
flag += chr(A0X1 + A0X4[(i-1)%4])
print(flag)
最后可以得到本题的flag:
flag{0bfu5er}
标签:Obfuscation,temp,hex,0x00,A0X6,flag,A0X1,Baby,NPUCTF2020 From: https://www.cnblogs.com/h40vv3n/p/17617901.html