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

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

  • 串行通信:这是通常用于调试输入和输出的信号。一般来说,这需要将电缆连接到引脚上;然而,使用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挑战中,参赛者可能需要逆向工程一个二进制程序,以找到隐藏在其中的标志或秘密信息。

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取
程,涵盖了95%以上网络安全知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以点击这里获取

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值