基于mcu固件反汇编逆向入门示例-stm32c8t6平台
本文目标:基于mcu固件反汇编逆向入门示例-stm32c8t6平台
按照本文的描述,应该可以在对应的硬件上通实验并举一反三。
先决条件:拥有C语言基础,集成的开发环境,比如:IDA 7.0
前言
机缘巧合之下,有使用固件反汇编的经历,所以写下此文用作学习笔记。
使用场景
嵌入式固件逆向的场景中会使用到,具体是获得产品固件的文件内容,进行反编译,从而继续研究和验证,获取产品的开发思路。在网络上下载IDA 7.0,进行安装。
新建工程
第一步:双击32bit的ida,选择new
第二步:找到需要进行分析的文件,最好是分析hex文件,找个工具把bin文件转成hex文件好一些,打开,选择小端模式(stm32是小端)分析
第三步:参考如下的配置进行配置工程
工程出来后,会在左边的窗口发现很多地址,这些地址就是函数,逆向工程的活就是分析这些函数是做啥的,理解函数的意图
函数分析
双击左边栏的一些函数可以看到详情,随便找个地址来进行分析一下,鼠标放在我下图的黄色函数地址上
按Ctrl + x,可以列出这个函数的调用,函数涉及地方。
在这个函数中按F5,会跳转到对应的伪c代码窗口
然后就是分析代码片段的意图了,经过现在的ai加持,已经能初步进行分析了。
// 原始代码
int __fastcall sub_8004770(int a1, int a2)
{
char v2; // 用来累加字节值的变量
int v3; // 当前处理的字节偏移量
int v4; // 需要处理的字节数
int v5; // 当前处理的字节在内存中的地址
v2 = 0; // 初始化累加变量
v3 = 0; // 初始化偏移量
v4 = a2 - 2; // 计算需要处理的字节数
while (v3 < v4)
{
// 计算当前字节的地址
v5 = a1 + v3;
// 更新偏移量
v3 = (unsigned __int16)(v3 + 1);
// 累加当前字节的值
v2 += *(_BYTE *)(v5 + 1);
}
// 返回累加结果经过计算后的值
return (unsigned __int8)(-85 - v2);
}
// 更容易理解的版本
int calculate_sum_and_offset(int base_address, int length)
{
char sum = 0; // 累加器,初始值为0
int offset = 0; // 偏移量,初始值为0
int target_length = length - 2; // 需要处理的字节数
// 遍历并累加从base_address开始的每个字节的值
while (offset < target_length)
{
sum += *(char *)(base_address + offset + 1); // 累加字节值
offset++; // 更新偏移量
}
// 返回计算结果
return (unsigned char)(-85 - sum);
}
经过耐心的分析之后,就可以分析出这个代码片段的意图是求一个校验和的功能。
总结
逆向分析相比于正向开发难度不是一个水平的,市场上有一些人专门从事逆向开发的工作,而且逆向开发需要懂汇编,不然逆向出来都是汇编代码,看不懂就没法还原代码了。逆向的人懂正向开发,正向开发的人不一定懂逆向开发,只有产品的价值性很高时才可能进行逆向开发,不然没必要逆向。毕竟逆向开发可能连固件都获取不到,main函数也找不到在哪,更别谈函数内的各种调用关系了。
笔者在逆向方面也只是小白,只能做到抛砖引玉。更多深层次的东西还需要静下心来研究。
本文完!!感谢阅读,感谢关注。