[NPUCTF2020]Baby Obfuscation

发布时间 2023-08-18 15:12:14作者: h40vv3n

[NPUCTF2020]Baby Obfuscation

将该文件使用ida打开并直接查看main()函数

image-20230809183505135

发现程序的主要逻辑为判断用户的输入是否符合要求,推测用户的输入为flag

image-20230809183647856

image-20230809183658255

此时我们倒着分析来看,发现A0X1的值要与F0X4(A0X6[i_1], 1) / 10的值相等

image-20230809192927883

此时我们进入F0X4()函数分析

image-20230809193012386

该函数的功能是返回a - b的值,所以此时需要A0X1的值与(A0X6 - 1)/10的值相等,而A0X6的值是已知的,因此本地的关键要用A0X1的值逆向推出用户的输入

image-20230809193800365

此时我们可以看到有五处对A0X1进行操作的地方,因此我们需要逐一分析

首先查看第一处

image-20230809194036832

F0X1()函数的功能如下所示,查询资料得知该函数是求两数的最大公约数

image-20230809194148906

F0X5()函数的功能如下所示,发现该函数返回a的b次方

image-20230809194404745

根据不等式(x+y)×(x+y) >= 4xy,因此第一处的判断恒成立,所以第一处的操作会执行

执行的操作为A0X1[i] = input - A0X4[i%4],接下来分析第二处

image-20230809195034494

此时我们计算得知不等号两边的值都为1,因此此时if 的判断条件不成立,而接下来对A0X1的操作不会执行,然后我们再看第三处

image-20230809195301797

相关变量的值已经通过注释标出,此时if 的判断条件成立,因此第三处的操作会执行,所以此处执行的操作实际上为异或操作:A0X1 ^= A0X4[i%4]

我们继续查看第四处

image-20230809195629568

我们点进F0X3函数()进行查看

image-20230809195719683

发现还欠嵌套了一个F0X2()函数,我们继续查看

image-20230809195816055

综合分析得知只有当a == b == 1的时候F0X3()会返回true,因此此处的if 判断不会成立,操作不会执行

我们最后查看第5处

image-20230809200205451

此处没有判定条件,一定会执行,此处执行的操作为*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)

image-20230809200554294

最后可以得到本题的flag:

flag{0bfu5er}