百越杯 Reverse (crazy write up)

拿到程序后,先常规跑一跑:

然后我就把它扔到IDA看看

IDA SHIFT + F12

看到flag关键字,于是我就点击进去,并查看交叉引用

由此分析可以得出,flag可能是在if判断正确后输出的

于是,接下来我们分析一下判断函数 getSerial()

可以看出,大概就是对this所指向的字符进行逐个对比验证。

扫描二维码关注公众号,回复: 4545765 查看本文章

即 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

本人是小白,希望各位大佬多多指导。 

猜你喜欢

转载自blog.csdn.net/qq742762377/article/details/84872553