aRm

点击此处获得更好的阅读体验


WriteUp来源

来自官方发布

https://www.xctf.org.cn/library/details/5acdc1c31cf4935ac38fce445978888a5710cf11/

题目描述

easy aRm

题目考点

  • 32位ARM程序的逆向

  • ARM中的随机数生成

  • 多元方程组求解、异或加密

解题思路

题目给出了一个ARM32位程序和一个output.txt,使用qemu进行运行,使用IDA进行静态分析,根据字符串“flag{”的引用可以找到main函数在sub_10628。注意IDA对sub_17894函数(即printf)的解析有问题,会解析成noreturn类型的函数,可以手动把第一条指令改成BX LR就可以正常解析。

逆向程序逻辑,首先程序读取一个int类型的key和一个flag字符串,然后验证flag的长度为42,开头为flag{,结尾为},然后与一个常量数组进行异或。

接下来,程序将key的最低byte作为srand种子,生成随机系数构造了一个42元方程组,并将方程组计算结果通过16进制的形式打印。

因此我们需要爆破256个srand种子,求解方程后异或常量数组还原flag,根据还原的flag是否以flag{开头来判断是否为正确的flag。这里尤其要注意如果在不同环境下使用srand和rand生成随机数结果会有不同,因此可以在arm平台上运行解题脚本或使用qemu调试给出的程序来进行随机数的爆破。解题文件夹中的get_rand.c在arm平台下编译运行可以得到种子为0~255时随机的系数,然后导入sol.py中求解线性方程组再回复异或加密,即可得到flag。