2022-鹏城杯-rota
我们拿到题,我们可以直接发现我们最后的对比数据
跟踪我们输入的数据,我们可以很容易的识别这个是一个base64换表的加密
这里,我们会发现许多很花的伪代码,也不好分析是干什么的,这里,我们使用我们的动态调试
经分析这里的a2就是我们的前面加密后的数据,我们在这之前下一个断点。
我们输入24个A,动态调试之后,我们可以发现,我们的输入被加密成了如下样子,我们拿脚本解来看看。
1 | import base64 |
可以发现,就是通过换表的base64,进行加密的,我们可以再输入32个A,进行测试,通过两次调试结果我们可以发现,那一部分很花的代码,实现的效果就是将我们的输入补齐,补齐到32位,,由此,我们可以大致推测出,我们的flag的长度就是32位。
下面我们分析下面这两个函数,这两个函数需要联合分析。
点开上面的data函数,我们也会发现很花的代码,作者开的优化有点高,这里我们动态调试与分析,我们可以知道,a1生成的其实就是一个类似S盒的一个表,会在待会儿的加密中进行使用。
对于下面的加密函数,我们从整体来看,我们可以发现,用一个循环,一次循环有四个着相同的加密块,也就是说一次循环加密四个数据,因为加密块相同,我们就只需要分析一个加密块即可。
对于每个加密块的前面的一个循环,其逻辑就是实现一个查表,然后返回数据的索引功能
下面的这部分,对于a1中的128是不是很熟悉?就是上面生成a1时候,就使用了128,这里实现的逻辑就是将索引与循环相加,作为索引,取出a1前半部分的值,然后由此作为索引,有去找a1后半部分的值,将其作为索引,去找table里面的值。就是作者自定义的一个查表加密,开的优化有点高,造成分析相对变难了。
复原的逻辑就是这样
1 | for j in range(9): |
由此,我们逆向,我们可以写出脚本
1 | import base64 |
解出flag PCL{8cdd01062b7e90dd372c3ea9977be53e}