CTF-Re-安恒杯第二题
下载文件 点击下载
首先把程序导入IDA进行分析,然后选中_main,然后F5大法
通过简单的分析我们知道了
1 | TRLT5amLBoLT5Z6Fa5LqN6mkTomqR66Da4LqX5mgBwkkP5wmTZ6D==== |
是真码,也就是我们需要逆向的密码。
在比较真码前一条代码进行F5
发现是一个循环,循环里面还有一个call,继续进入F5
经过简单的分析就是取出5个char,然后将前四个通过移位使得eax填满且恰好等于四个字符,比如31323334
然后将最后一个放到edx
然后将eax和0x1F进行与运算,运算完,右移2位,然后继续运算,edx也会进行运算,其实它的本质就是将5个字符的二进制模式下拆成5份,然后再5份5份的读出转化为数字,然后在一个密码表里当做序号的值转化为密文。
密码表如下
1 | NoPqRsTuVwXyZaBcDeFgHiJkLm765432 |
所以我们只需将真码先通过密码表逆运算,算出我们与运算之后数据,代码如下
1 | crypto_txt = "TRLT5amLBoLT5Z6Fa5LqN6mkTomqR66Da4LqX5mgBwkkP5wmTZ6D====" |
运行结果如下
但是这个并不是最终的结果,因为前面还有很多代码,我们继续探索
1 | sub_1161100(byte_1165018); |
上面那个call中,其实是对英文字母的偏移替换
将小写替换为 (原码 - 84) % 26 +97
将大写替换为 (原码 - 52) % 26 +65
所以我们只需要将替换后的字母表输出出来,然后对着修正就好了
代码如下
1 | #31306e373870706e33726f30306f373072326f706f70357333726f7171393337000000 |
效果如下
明显flag就是
10a78cca3eb00b70e2bcbc5f3ebdd937
验证一下
是正确的
总结:从这个Re中,我们学到了base的变种,还有字母表替换的灵活使用
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 咲夜南梦's 博客!
评论