本文为2016年alictf中LoopAndLoop的writeup。
LoopAndLoop writeup
首先点我下载题目。直接使用jeb反编译,当返回值为1835996258时,程序显示flag,故只需要分析check函数。
用IDA反汇编liblhm.so,F5看伪代码发现有问题:s值不变,chec循环执行check1且永不停止。这时需要看汇编代码,结果如下:
分析完程序流程后,题目的核心问题可归结为s的取值,分以下三种情况:
- 判断何时结束(s’ = s - 1,s’ <= 0);
- 判断是check1、check2或者check3(2 * s % 3);
- 确定checkX传入的s值(chec的s值即上轮checkX的s值)。
关于s的取值范围我通过动态调试得到s’取值[0,98],(2)取值[1,99],(3)取值[0,98]。
手写几轮即发现运算规律。
程序运行结果是答案:236492408。