放入ida后我人懵了,这是我见过函数最多的一次。但是总归是要尝试的,打开strings window
ok,这里可以看出两个东西一个是base 64一个是you find me!这意味着flag位置找到了。点进去交叉引用。
第一步是静态分析,然后呢,修改函数名,其实这一步我老是忽略,但其实很重要,可以帮助分析,且有效避免眼瞎。
首先sub_410cc00很容易看出是输出可以看成puts.
然后sub_4406E0(0LL, v15, 37LL),
这个函数,第一个参数0,第二个参数,字符指针,第三个参数一个整型变量,这是我看别的师傅的wp才知道这样一般是read。
然后sub_400360这个函数看久了其实一眼就是strcmp
这样就基本改好了
然后偷懒,直接看对比的字符串
看上面的函数
这种一看就是标准base64的代码
进行解密
一遍出不来,看上面的代码也知道要多来几次,
激动以为flag要来了,点开网站。
这是什么鬼东西
然后我就陷入了沉思,发现上面的最常见的那一列数字还没用。回去写脚本
a=[73,111,100,108,62,81,110,98,40,111,99,121,127,121,46,105,127,100,96,51,119,125,119,101,107,57,123,105,121,61,126,121,76,64,69,67,255] flag='' for i in range (0,36): flag+=chr(a[i]^i) print(flag)
出来了这个Info:The first four chars are `flag`
啊这,你不说我也知道。
然后我就果断去看别的师傅的wp,才知道了答案真的很隐晦。
在这下面的sub_400D35里
两个异或,第一个是异或可以发现第0个和第3个字符是'f'和'g',他是由一个未知量异或6cc0a0得到,反向操作,知二求三,可以写出那个未知量,然后看下一个异或,Ok直接照着写
v 15= '' enc1 = 'flag' v2 = '' enc =[0x40,0x35,0x20,0x56,0x5D,0x18,0x22,0x45,0x17,0x2F,0x24,0x6E,0x62,0x3C,0x27,0x54,0x48,0x6C,0x24,0x6E,0x72,0x3C,0x32,0x45,0x5B] for i in range(4): v15 += chr(enc[i] ^ ord(enc1[i])) print (v15) for j in range(len(enc)): v2 += chr(enc[i] ^ ord(v15[j%4])) print(v2)
flag{Act1ve_Defen5e_Test}