2023-柏鹭杯-re1-imm
我们拿到这道题,判断输入,可以知道验证我们的输入为64个字节,存储在buffer中,下面有一个判断,我们可以知道我们输入的字符范围为0 ~ 9,A ~ F.
其实我们通过整体来看,我们可以发现,在这个大的while循环中就只对这个encode返回的值进行判断,然后break,然后通过后面的flag输出,我们可以推断出主要的逻辑就是,将我们的输入的64进行一系列的操作,与对比,之后再做一系列的操作运算出我们的flag.也就是说我们的加密与对比逻辑就在这个encode函数之中。
我们进入encode函数,我们会发现以下三段的汇编代码,如果学过一点点汇编,对1与3的汇编代码还是好理解,第一个mov,与xor,就是将我们的数据与上面的字符进行异或。
第三段汇编,cmp,mov,zero,很能看出,这里实现的操作就是将加密后的结果,与其上面的数据进行对比
对于第二段汇编,视乎X86体系并不常见,经过搜索,我们可以得知这个汇编实现的操作就是这样。
1 | for (int i = 0; i < 32; ++i) |
就是将上面的数据作为索引,然后去我们flag里面去寻找对于字符。实现就是将我们原来的数据进行打乱。
由此我们就将加密逻辑分析完了,开始写脚本。
1 |
|
可以得到:825A10C618D636A058AE633FAA539E70655FEB648697FF84A79F4589B5207027
放入程序输入,即可得到我们的flag
flag{ISEC-a49d6b847bdba62c5bfa0a43b69c8575}
评论