点击此处获得更好的阅读体验
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。