第一次固件逆向 —— cnss招新 IDA bao zha le

前言

第一次接触固件逆向,写题期间还是收获了许多东西,将这第一次逆向过程记录一下,方便日后补充学习相关东西,也希望能给第一次接触固件逆向的后人一定参考

设置IDA

最开始拿到这个固件时,以为是elf文件转换成了bin文件,然后根据题目的ARM傻乎乎的去配置Linux装了一个arm-linux-objdump把给的bin转换成了一个asm汇编文件…打开一看,整个人都不想写了,太长了…还全都是汇编…后续找到的有关资料发现IDA其实也可以进行固件的分析,只不过需要进行相关的设置

1.png

2.png

设置完后我们点ok即可,随后我们进入IDA会遇到这样的一个界面:

4.png

因为这个是一个固件需要我们手动进行加载对应固件程序的偏移,因为我们是第一次打开,没有获得相关的一些信息,所以此处我们直接点OK进入下一步即可

5.png

6.png

到此处我们的基本设置就已经完成了,接下来就是找到对应的程序加载基址和程序的入口点了

逆向分析

7.png

图片里的加载基质打错了应该是加载基址

设置完IDA我们对着开头的数据按几下d,将其数据类型进行转换,一般来说在固件arm中,前两个地址为RAM地址和程序入口点,随后双击程序入口进行跳转,随后按C进行构建函数

8.png

我们可以跳转到函数了,随后我们可以通过字符串来快速定位对应的加密函数块

9.png

10.png

可以发现程序下面的printf会输出对应的flag通过交叉引用我们可以发现对应flag的生成过程

11.png

12.png

可以看出来程序每一次对应的异或值会随着i的变化而变化,程序会根据i%6的值进行改变,简单分析可以写出对应的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
s = [0x00000052, 0x0000005F, 0x00000047, 0x00000046, 0x0000004A, 0x00000061, 0x0000006E, 0x00000042, 0x0000005C, 0x0000005A, 0x00000044, 0x00000058, 0x00000055, 0x0000006E, 0x0000005A, 0x0000005A, 0x00000045, 0x0000006B, 0x00000053, 0x00000054, 0x0000006B, 0x0000005D, 0x00000054, 0x00000046, 0x00000054, 0x00000010, 0x00000015, 0x00000014, 0x0000006E, 0x00000063, 0x00000059, 0x0000005E, 0x0000006B, 0x00000054, 0x00000043, 0x00000051, 0x0000006E, 0x00000064, 0x0000000B, 0x00000014, 0x00000010, 0x00000049]
flag = [0]*42
xor_data = 0
for i in range(42):
flag[i] = s[i]^xor_data
print(chr(flag[i]),end='')
if (i+1) % 6 == 0 or (i+1) % 6 == 1 or (i+1) % 6 == 4 :
xor_data = 49
if (i+1) % 6 == 2 or (i+1) % 6 == 5 :
xor_data = 52
if (i+1) % 6 == 3 :
xor_data = 53

# Rnss{U_should_not_be_here!!!_Who_are_U?!!}

程序处有一个小坑,第一次的异或值是'v',关于这个好像可以通过交叉引用进行查找?反正问题不大(flag头都反正已知)

至此程序的逆向工作就完成了,希望能对各位师傅们有所帮助。


第一次固件逆向 —— cnss招新 IDA bao zha le
https://equinox-shame.github.io/2022/08/13/第一次固件逆向 — cnss招新 IDA bao zha le/
作者
梓曰
发布于
2022年8月13日
许可协议