基于mcu固件反汇编逆向入门示例-stm32c8t6平台

基于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; // 累加器,初始值为0int offset = 0; // 偏移量,初始值为0int target_length = length - 2; // 需要处理的字节数// 遍历并累加从base_address开始的每个字节的值while (offset < target_length){sum += *(char *)(base_address + offset + 1); // 累加字节值offset++; // 更新偏移量}// 返回计算结果return (unsigned char)(-85 - sum);
}

经过耐心的分析之后,就可以分析出这个代码片段的意图是求一个校验和的功能。

总结

逆向分析相比于正向开发难度不是一个水平的,市场上有一些人专门从事逆向开发的工作,而且逆向开发需要懂汇编,不然逆向出来都是汇编代码,看不懂就没法还原代码了。逆向的人懂正向开发,正向开发的人不一定懂逆向开发,只有产品的价值性很高时才可能进行逆向开发,不然没必要逆向。毕竟逆向开发可能连固件都获取不到,main函数也找不到在哪,更别谈函数内的各种调用关系了。

笔者在逆向方面也只是小白,只能做到抛砖引玉。更多深层次的东西还需要静下心来研究。

本文完!!感谢阅读,感谢关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6及ESNext规范

1、let 和 const 而let引入了块级作用域的概念, 创建setTimeout函数时&#xff0c;变量i在作用域内。对于循环的每个迭代&#xff0c;引用的i是i的不同实例。 暂时性死区&#xff1a;不允许变量提升 const就很简单了, 在let的基础上, 不可被修改 js 代码解读 for(var i0;i<…

《背包乱斗》为什么好玩 苹果电脑怎么玩《背包乱斗》游戏 mac怎么玩steam windows游戏

在当今竞争激烈的游戏市场中&#xff0c;《背包乱斗》以其独特的魅力在众多作品中脱颖而出&#xff0c;吸引了大量玩家的关注和喜爱。其创新的游戏机制和不断迭代的内容&#xff0c;加之出色的视觉效果和社区建设&#xff0c;使其成为了游戏界的一股清流。 一、《背包乱斗》为…

Hadoop学习记录一

HDFS&#xff08;Hadoop Distributed File System&#xff09;是Hadoop项目的一部分&#xff0c;用于存储海量数据。HDFS设计为可以在廉价硬件上运行&#xff0c;同时提供高容错性。HDFS主要由三个关键角色组成&#xff1a;NameNode、DataNode和SecondaryNameNode。下面我用大白…

《绝区零》是一款什么类型的游戏,Mac电脑怎么玩《绝区零》苹果电脑玩游戏怎么样

米哈游的《绝区零》最近在网上爆火呀&#xff0c;不过很多人都想知道mac电脑能不能玩《绝区零》&#xff0c;今天麦麦就给大家介绍一下《绝区零》是一款什么样的游戏&#xff0c;Mac电脑怎么玩《绝区零》。 一、《绝区零》是一款什么样的游戏 《绝区零》是由上海米哈游自主研发…

Web前端-Web开发HTML基础1-input

一. 基础 1. 写一个输入框代码&#xff0c;类型为密码&#xff1b; 2. 写一个输入框代码&#xff0c;类型为密码&#xff1b; 3. 写一个输入框代码&#xff0c;类型为密码&#xff0c;名称为"password"&#xff1b; 4. 写一个输入框代码&#xff0c;类型为密码&#…

ES快速开发,ElasticsearchRestTemplate基本使用以及ELK快速部署

最近博主有一些elasticsearch的工作&#xff0c;所以更新的慢了些&#xff0c;现在就教大家快速入门&#xff0c;并对一些基本的查询、更新需求做一下示例&#xff0c;废话不多说开始&#xff1a; 1. ES快速上手 es下载&#xff1a;[https://elasticsearch.cn/download/]()这…

Spring Boot集成Activity7实现简单的审批流

由于客户对于系统里的一些新增数据&#xff0c;例如照片墙、照片等&#xff0c;想实现上级逐级审批通过才可见的效果&#xff0c;于是引入了Acitivity7工作流技术来实现&#xff0c;本文是对实现过程的介绍讲解&#xff0c;由于我是中途交接前同事的这块需求&#xff0c;所以具…

uniapp开发钉钉小程序流程

下载开发工具 1、小程序开发工具 登录钉钉开发平台&#xff0c;根据自己的需求下载合适的版本&#xff0c;我这里下载的是Windows &#xff08;64位&#xff09;版本 小程序开发工具 - 钉钉开放平台 2、HBuilder X HBuilderX-高效极客技巧 新建项目及相关配置 新建项目 …

Llama - Prompting

本文翻译整理自&#xff1a;Prompting https://llama.meta.com/docs/how-to-guides/prompting/ 文章目录 制作有效的提示明确说明风格化格式化限制 提示使用 Zero- and Few-Shot 学习Zero-Shot PromptingFew-Shot Prompting 基于角色的提示思维链技术Self-Consistency检索-增强…

单臂路由组网实验,单臂路由的定义、适用情况、作用

一、定义 单臂路由是指通过在路由器的一个接口上配置许多子接口,从而实现原来相互隔离的不同VLAN之间的互通。 子接口:把路由器上的实际的物理接口划分为多个逻辑上的接口,这些被划分的逻辑接口就是子接口。 二、适用情况 用在没有三层交换机,却要实现不同VLAN之间的互…

Github07-16 Python开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-16统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10C++项目1AutoGPT: 人工智能革命的先锋 创建周期:486 天开发语言:Python协议类型:MIT LicenseStar数量:164105 个Fork数量:435…

axios 下载大文件时,展示下载进度的组件封装——js技能提升

之前面试的时候&#xff0c;有遇到一个问题&#xff1a;就是下载大文件的时候&#xff0c;如何得知下载进度&#xff0c;当时的回复是没有处理过。。。 现在想到了。axios中本身就有一个下载进度的方法&#xff0c;可以直接拿来使用。 下面记录一下处理步骤&#xff1a; 参考…

深度学习 | CNN 基本原理

目录 1 什么是 CNN2 输入层3 卷积层3.1 卷积操作3.2 Padding 零填充3.3 处理彩色图像 4 池化层4.1 池化操作4.2 池化的平移不变性 5 全连接层6 输出层 前言 这篇博客不够详细&#xff0c;因为没有介绍卷积操作的具体计算&#xff1b;但是它介绍了 CNN 各层次的功能…

golang AST语法树解析

1. 源码示例 package mainimport ("context" )// Foo 结构体 type Foo struct {i int }// Bar 接口 type Bar interface {Do(ctx context.Context) error }// main方法 func main() {a : 1 }2. Golang中的AST golang官方提供的几个包&#xff0c;可以帮助我们进行A…

[杂谈] 关于 Mac 电脑使用 Logitech 鼠标导致 Vscode 侧键无法进行代码前进、回退的问题

我个人使用的是一台 14 寸的 Mac_Apple_M1&#xff0c;外接键盘显示器罗技的 MX Master 3 for Mac 的鼠标。 之前一直使用的 GoLand 开发&#xff0c;查看代码时进行代码跳转就很方便&#xff0c;滚轮键 进入函数方法&#xff0c;鼠标侧键进行前进、后退。看代码完全可以右手单…

【大模型入门】LLM-AI大模型介绍

大语言模型 (LLM) 背景 &#x1f379;大语言模型 (Large Language Model) 是一种人工智能模型, 它们通常包含数千亿甚至更多的参数&#xff0c;并在大规模数据集上进行训练。大语言模型可以处理多种自然语言任务&#xff0c;如文本分类、问答、翻译、对话等等。 自然语言模型…

qt explicit 啥意思

explicit 在 Qt 和 C 中是一个关键字&#xff0c;主要用于修饰类的构造函数。其含义和用法可以归纳为以下几点&#xff1a; 意义&#xff1a; explicit 英文直译为“明确的”、“显式的”。在 C 中&#xff0c;当一个构造函数只接受一个参数时&#xff0c;它可能会被编译器用于…

【Nail it】ROS1 ROS2 通信(ros2/ros1_bridge)

情况说明&#xff1a;目标是实现ros2容器和ros1主机的通信&#xff0c;可以起一个ros1容器作为桥梁&#xff08;若是在一个主机同时包含ros1&ros2&#xff0c;配置更加方便&#xff09;. 1.起一个 noetic 的容器 docker run -it --network host --name my_bridge ros:noe…

Java中的成员内部类

Java中的成员内部类&#xff08;也称为非静态内部类&#xff09;是定义在另一个类&#xff08;外部类&#xff09;内部的类。 这种内部类与它的外部类之间有着紧密的联系&#xff0c;主要体现在几个方面&#xff1a;它可以访问外部类的所有成员&#xff08;包括私有成员&#…

C++小白Python选手2小时入门C++

学习链接&#xff1a;C入门/2小时从C到C快速入门&#xff08;2018&#xff0c;C教程&#xff09; C在C语言的基础上增加了面向对象和通用算法语言特征。 C头文件不必是.h结尾&#xff0c;C头文件举例&#xff1a;cmath、cstdio注释&#xff1a;单行//、多行/**/为了防止名字冲…