拿到程序后,先常规跑一跑:
然后我就把它扔到IDA看看
IDA SHIFT + F12
看到flag关键字,于是我就点击进去,并查看交叉引用
由此分析可以得出,flag可能是在if判断正确后输出的
于是,接下来我们分析一下判断函数 getSerial()
可以看出,大概就是对this所指向的字符进行逐个对比验证。
即 this[16 + i] 与 this[80 + i] 进行对比 ,而 this 就是 v23传进来的。
接下来我们看看v23的值是怎么得到的
由IDA可以看出 v23在声明后,第一次出现在HighTemplar()里面,第二次出现在calculate()里面
我们分析一下HighTemplar()
a1对应v23
a2对应v18
也就是把v18的内容放到v23里面。
再分析calculate()
这里是对v23进行加密
看到这里有想起什么吗?
v18放进(v23+16)这个位置,“327a6c4304ad5938eaf0efb6cc3e53dc”放到(v23+80)这个位置,对(v23+16)这个位置的字符串进行加密,v23[16 + i] 与 v23[80 + i] 进行对比,得出结果
我们接来下看看v18是怎么来的:
可以看出v18是通过cin输入得到的。
那么我们就可以整理出程序判断的流程:
cin -> v18 -> v23 -> 加密 -> 判断密文 -> 得出结果
解题思路:
我们根据加密算法,对密文解密即可:
payload:
code = list("327a6c4304ad5938eaf0efb6cc3e53dc")
for i in range(32):
code[i] = chr((ord(code[i])-11)^0x13)
for i in range(32):
code[i] = chr((ord(code[i])-23)^0x50)
print("".join(code))
运行结果:tMx~qdstOs~crvtwb~aOba}qddtbrtcd
本人是小白,希望各位大佬多多指导。