【项目简记】逆向工程裸机内核镜像

本教程将是裸机逆向工程系列的一部分。

自从拆解了几部安卓手机后,我对嵌入式系统的兴趣越来越大。

虽然手机本身并不是嵌入式系统,但我知道手机最终会取代计算机;因此,我想学习更多关于它们的知识。

就在那时,我开始学习ARM,并发现它们与嵌入式设备有许多相似之处。

从那以后,我就开始狂奔:我开始学习关于嵌入式设备的一切知识。

什么是嵌入式系统?

嵌入式系统是一种最有效、最经济地实现单一目的的设备。最常见的例子是物联网设备(如摄像头)。这通常需要只运行所需软件的软件;因此,需要嵌入式操作系统(例如嵌入式Linux)。

我首先决定探索的是树莓派,因为我之前已经有过一些经验(主要是针对基于黑客马拉松的项目,而不是逆向工程或二进制漏洞利用)。

而且这个系统的文档非常全面,使得了解它的某些方面(包括软件和硬件)的工作原理变得更容易。最后,找到开发工具也更容易,包括模拟器,这样我就可以在旅途中进行项目开发。

你也不一定非得从树莓派开始……还有其他的设备,比如Beaglebone设备、路由器、摄像头等等。然而,对于本教程来说,我将主要关注树莓派0。

在继续阅读之前,你需要了解的一些基础知识:

  • 串行通信:这是通常用于调试输入和输出的信号。一般来说,这需要将电缆连接到引脚上;然而,使用QEMU,我们可以模拟到stdin/stdout。
  • 引脚:这是嵌入式系统发送信号的方式(串行、JTAG等)。
  • 工具链:这是我们如何编译代码的。我们经常进行交叉编译(因为我们假设在本教程中我们没有任何ARM硬件)。你可能听到的工具链是eabi、gnueabi和gnueabi-hf。对于本教程,我们只考虑eabi,因为它是裸机工具链(例如没有操作系统)。要了解更多关于gnueabi和gnueabi-hf的信息,请点击这里。

https://stackoverflow.com/questions/26692065/difference-between-arm-eabi-arm-gnueabi-and-gnueabi-hf-compilers#:~:text=the%20eabi%20stands%20for%20the,compilation%20of%20code%20for%20linux

要开始,我们需要某种Linux平台。为此,我使用了Ubuntu 20.04,但你可以选择你想要兼容下面列出软件的任何发行版。在你的发行版中,我们需要安装以下软件:

  • GDB Multiarch —sudo apt install gcc-multiarch
  • qemu (I am using 5.2 in this demo) — https://www.qemu.org/download/#source
  • 逆向工程工具(我推荐Ghidra,但这是个人偏好)
  • Optional: gcc-arm-none-eabi — sudo apt install arm-none-eabi-gcc

对于这个,我们将使用qemu-system-arm(这也是qemu-system-aarch64的一部分)。

它默认支持许多不同的设备,其他设备则可以通过设置实现。在使用qemu-system-arm时,需要注意一些重要事项。

首先,您需要指定如何读取输出和写入输入(特别是对于串行)。

由于我们不是在处理实际的硬件,因此我们不能使用引脚来与设备交互。

例如,假设我们要模拟一个名为kernel.img的内核,我们需要运行以下命令来运行它:

- qemu-system-aarch64 -M raspi0 -kernel kernel.img -serial null -serial stdio

如果我们想做同样的事情,但是我们可以连接到GDB,我们可以运行以下命令:

- qemu-system-arm -M raspi0 -kernel kernel.img -serial null -serial stdio -S -gdb tcp::4269 -boot c

此命令具体打开一个GDB服务器,我们可以通过gdb-multiarch连接到它,并与之交互。要连接到它,我们运行以下命令。

- gdb-multiarch
- add-symbol-file kernel.elf <addr> — Run this command if you have an elf file for your kernel, otherwise, it is optional. 
- target remote localhost:<port>

我强烈建议将其制作成gdb脚本文件。这样,您也可以使gdb更易于管理。有关GDB脚本的优秀教程可以在这里找到:

  • https://www.adacore.com/gems/gem-119-gdb-scripting-part-1
  • https://www.adacore.com/gems/gem-120-gdb-scripting-part-2

您也可以使用GEF进行调试;然而,您需要运行以下命令:

gdb-gef-multiarch (or however you bring it up on the console)
set architecture arm 
add-symbol-file kernel.elf <addr>
gef-remote -q localhost:<port>

现在我们已经有了执行代码的环境,我们可以评估内核的几种方法。除了GDB,我们还需要一个反汇编器/反编译器,如Binary Ninja或Ghidra。这将在我们逆向工程内核时提供帮助,特别是对于裸机程序。

裸机软件是指直接在硬件上运行的软件,没有操作系统功能。有时甚至没有标准库,如stdio.h或stdlib.h。

因此,除非我们有ELF文件,否则我们不会有符号。即使如此,如果使用标准库,反编译器和反汇编器也可能无法识别它们。

最后,学习如何阅读ARM汇编代码至关重要。大多数嵌入式系统使用ARM架构;然而,一些仍然使用MIPS,而在极少数情况下使用Power PC。您需要熟悉的术语有:

  • Calling Conventions
  • Prolog
  • Epilog
  • Registers
  • Memory

在继续之前,您应该做的一个很好的教程是Azeria的教程。

它有七个部分,您将能够开始学习如何逆向和利用基于ARM的代码。完成所有部分!链接:

https://azeria-labs.com/writing-arm-assembly-part-1/

您可能要考虑的其他一些事情:

  • 开始学习一些Python,您将经常使用它来进行漏洞利用和逆向工程脚本(这将使您的生活变得更加轻松)。
  • 获取pwntools,这将帮助您进行漏洞利用,并支持arm和aarch64 -
https://docs.pwntools.com/en/latest/
  • 获取angr:这将帮助您找到漏洞并逆向工程重复任务 - https://docs.angr.io/

现在您准备好了!现在您应该尝试解决CTF挑战或逆向工程您感兴趣的内核。稍后,我将介绍一些您可能错过的重要概念(并且我是通过艰难的方式学习的)。

CTF(Capture The Flag)挑战是一种网络安全竞赛,参赛者需要在限定的时间内找到并提交目标程序中的隐藏标志。CTF挑战通常涉及到各种网络安全技术和技巧,包括逆向工程、漏洞利用、密码学、网络分析等。

逆向工程重复任务是指对已经编译的程序进行反编译,并对其代码进行逐行分析,以理解其功能、查找漏洞或进行修改在CTF挑战中,参赛者可能需要逆向工程一个二进制程序,以找到隐藏在其中的标志或秘密信息。


下一步工作:

现在我们的环境已经设置好了,我们准备好对二进制文件进行逆向工程了!

如何使用我为UMDCTF编写的CTF挑战Furor进行基本的ret2text漏洞利用。你可以在这里下载副本:https://github.com/UMD-CSEC/UMDCTF-2021-Public-Challenges/tree/master/Pwnables/furor

由于仅解决此CTF挑战就涉及很多概念,我们主要需要了解两个方面的内容:

  • 一专注于初始的高级逆向工程
  • 二专注于ARM的深入逆向工程和漏洞利用。

要做的事情:

  • 如何找到关于裸机固件映像的关键信息
  • 了解如何找到目标设备的信息
  • 如何设置Ghidra,以便它能够理解如何找到信息(例如,更容易找到我们的目标函数)

当你开始开始对任何东西进行逆向工程时,首先要确定它是什么。

虽然我们从文章的标题中对其有了很好的了解,但在大多数情况下,我们并没有这种上下文。

固件映像有点奇怪,因为它们可以包含其中的多个文件或是一个二进制blob。

为了对映像有一个大致的了解,我喜欢使用一些Linux实用程序,如file、Binwalk等。

一般来说,如果固件映像包含多个文件或是一个标准格式,它会给出输出细节。

不幸的是,Binwalk没有给我们提供太多信息。

逆向工程需要一定的技术功底和经验,涉及到汇编语言、计算机体系结构、操作系统等知识。在逆向工程过程中,常用的工具包括反汇编器、调试器、反编译器等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux 系统开始配置

文章目录 备份源为root 设置密码安装基本工具切换root 用户删除snap从 Ubuntu 移除 Snap 后使用 deb 文件安装软件商店和 Firefox在 Ubuntu 系统恢复到 Snap 软件包总结 删除 vim安装neovim在线安装neovim压缩安装neovim安装lazyvim安装剪切板 安装qt配置 Qt 环境不在sudoers文…

SAP 消息号 FAGL_CLOSING_ACT011

在S4当中&#xff0c;月末外币评估的时候&#xff0c;会出现如下报错&#xff1a; 解决方法是&#xff1a; “创建错误更正和暂记会计核算运行标识的编号范围、 在ECS中创建凭证编号范围” 给以上2个事务&#xff0c;添加号码范围即可。

关于破解IDEA后启动闪退的问题

问题描述&#xff1a;2023.1启动不了&#xff0c;双击桌面图标&#xff0c;没有响应。 解决办法&#xff1a; 打开C:\Users\c\AppData\Roaming\JetBrains\IntelliJIdea2023.1\idea64.exe.vmoptions 这个文件。 内容如下所示&#xff1a; 删除红框的数据以后&#xff0c;再登录…

使用 IDEA 开发一个简单易用的 SDK

目录 一、什么是 SDK 二、为什么要开发 SDK 三、开发 SDK 的详细步骤 四、导入 SDK 进行测试 附&#xff1a;ConfigurationProperties 注解的介绍及使用 一、什么是 SDK 1. 定义&#xff1a;软件开发工具包 Software Development Kit 2. 用于开发特定软件或应用程序的工…

LLM之Agent(十一)| 多智能体框架CrewAI与AutoGen相比

基于LLM构建的Agent中有一个明显的现象就是多智能体体系结构的表现要超越单智能体&#xff0c;即使单智能体使用无可挑剔的提示策略。本文将探索另一个有趣的多智能体框架——CrewAI。 一、CrewAI整体优势 CrewAI可以应用在生成环境中。它在发言人的反应和编排上牺牲了一点灵活…

【BIAI】Lecture 9-Motor system 1

Motor System 专业词汇 skeletal muscle 骨骼肌 smooth muscle 平滑肌 cardiac muscle 心肌 flexor reflex 屈曲反射 central pattern generators 中央模式生成器 bio-inspired bipedal robots 仿生双足机器人 myotatic stretch reflex 肌肉自伸展反射 Cortex optic nerve 视皮…

架构整洁之道-软件架构-概述、独立性、划分边界与边界剖析

6 软件架构 6.1 什么是软件架构 “架构”这个词给人的直观感受就是充满了权力和神秘感&#xff0c;因此谈论架构总让人有一种正在进行责任重大的决策或者深度技术分析的感觉。而软件架构师的工作内容究竟是什么呢&#xff1f; 软件架构师自身需要是程序员&#xff0c;并且必须…

C语言指针学习 之 指针变量

前言&#xff1a; 通过学习我们认识了什么是指针&#xff0c;就让我们一起来分析一个例子。 #include<stdio.h> int main() {int a100;int * hz; hz &a;printf("a%d \n",a);printf("*hz%d \n",*hz);return 0; }a100 *hz100 PS C:\csay\cyuya…

spring boot yaml文件中如何设置duration对象值

Spring Boot对表示持续时间有专门的支持。如果您公开java.time.Duration属性&#xff0c;则应用程序对应Duration类型的属性有以下格式可用: long类型的常规表示(使用毫秒作为默认单位&#xff0c;除非指定了DurationUnit)java.time.Duration 使用的标准ISO-8601格式其中值和单…

【巧用异或】单身狗2题解

✨✨欢迎大家来到Celia的博客✨✨ &#x1f389;&#x1f389;创作不易&#xff0c;请点赞关注&#xff0c;多多支持哦&#x1f389;&#x1f389; 所属专栏&#xff1a;【每日刷题】C语言 个人主页&#xff1a;Celias blog~ 题目 一个数组中只有两个数字是出现一次&#xff0c…

应对手机数据丢失的5大安卓数据恢复软件

我们都去过那里。您的手机上的数据丢失了&#xff0c;现在无法恢复。这尤其令人恐惧&#xff0c;因为我们的手机上都有如此多的信息。从图片、应用程序、个人信息&#xff0c;甚至是来自可能已不复存在的亲人的短信和语音邮件。这种情况确实发生了&#xff0c;而且也不仅仅是An…

【Java程序设计】【C00239】基于Springboot的漫画之家管理系统(有论文)

基于Springboot的漫画之家管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的漫画之家系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xff1a;在系统首页可以查看首页&a…

【Tomcat与网络3】Tomcat的整体架构

目录 1.演进1&#xff1a;将连接和处理服务分开 2演进2&#xff1a;Container的演进 3 再论Tomcat的容器结构 4 Tomcat处理请求的过程 5 请求的处理过程与Pipeline-Valve管道 在前面我们介绍了Servlet的基本原理&#xff0c;本文我们结合Tomcat来分析一下如何设计一个大型…

Flutter开发2:安装Flutter

在本篇博客中&#xff0c;我们将详细介绍如何安装Flutter开发环境。安装Flutter是开始使用Flutter进行跨平台移动应用开发的第一步。让我们开始吧&#xff01; 官方安装文档 步骤1&#xff1a;下载Flutter SDK 打开浏览器&#xff0c;访问Flutter官方网站&#xff1a;https://…

latex multirow学习

今天搞了一晚上的这个multirow&#xff0c;总算弄出来了几个比较好的例子&#xff0c;主要是这个multirow的语法我没看懂&#xff0c;这个逻辑我是没理解&#xff0c;就很尴尬&#xff0c;一改就报错&#xff0c;只能先弄几个例子&#xff0c;自己慢慢试 \documentclass{artic…

Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询

1概况 本文展示如何使用 Flink CDC Iceberg Doris 构建实时湖仓一体的联邦查询分析&#xff0c;Doris 1.1版本提供了Iceberg的支持&#xff0c;本文主要展示Doris和Iceberg怎么使用&#xff0c;大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。 2系统架构 我们整…

vscode实时预览markdown效果

安装插件 Markdown Preview Enhanced 上面是搜索框 启动预览 右键->Open Preview On the Side 效果如下&#xff1a; 目录功能 目录功能还是使用gitee吧 push后使用gitee&#xff0c;gitee上markdown支持侧边生成目录

深度学习环境配置:Anaconda 安装和 pip 源

conda是一种通用包管理系统&#xff0c;与pip的使用类似&#xff0c;环境管理则允许用户方便地安装不同版本的python并可以快速切换。 Anaconda则是一个打包的集合&#xff0c;里面预装好了conda、某个版本的python、众多packages、科学计算工具等等&#xff0c;就是把很多常用…

阿里云a10GPU,centos7,cuda11.2环境配置

Anaconda3-2022.05-Linux-x86_64.sh gcc升级 centos7升级gcc至8.2_centos7 yum gcc8.2.0-CSDN博客 paddlepaddle python -m pip install paddlepaddle-gpu2.5.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html 报错 ImportError: libssl.so…

【Java程序设计】【C00187】基于SSM的旅游资源网站管理系统(论文+PPT)

基于SSM的旅游资源网站管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游资源网站 本系统分为前台系统、用户和管理员3个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的就是…