原文链接:11bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2P5X3g2J5K9h3q4Q4x3X3c8D9j5h3u0K6i4K6u0W2j5$3!0E0i4K6u0r3N6%4u0A6N6r3W2F1k6#2)9J5k6r3q4J5L8g2)9J5k6r3q4K6M7$3g2E0j5X3I4&6i4K6u0V1M7r3q4J5N6q4)9J5k6o6q4Q4x3V1j5`.
最近在学IoT安全,这个教程挺不错的,边学边翻译出来,分享给大家。
原文链接: 1beK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2P5X3g2J5K9h3q4Q4x3X3c8D9j5h3u0K6i4K6u0W2j5$3!0E0i4K6u0r3N6%4u0A6N6r3W2F1k6#2)9J5k6r3q4J5L8g2)9J5k6r3q4K6M7$3g2E0j5X3I4&6i4K6u0V1M7r3q4J5N6q4)9J5k6o6q4Q4x3V1j5`.
翻译: ljcnaix
欢迎来到系列文章《 ARM 汇编基础教程》。这个系列是为后续的《 ARM 漏洞利用教程》(连载中)打基础而编写的。在我们深入用 ARM 汇编编写 shellcode 和构造 ROP 链之前,我们需要先掌握一些 ARM 汇编的基础知识。
我们会一步一步覆盖如下主题:
第一篇: ARM 汇编简介
第二篇: 数据类型和寄存器
第三篇: ARM 指令集
第四篇: 内存读写
第五篇: 高级内存读写
第六篇: 条件分支
第七篇: 栈和函数
为了执行本文后续的示例,你需要搭建一个学习 ARM 汇编的实验环境。如果你没有一台 ARM 设备(比如树莓派),你可以根据这个教程( 44aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2P5X3g2J5K9h3q4Q4x3X3c8D9j5h3u0K6i4K6u0W2j5$3!0E0i4K6u0r3k6h3#2#2L8r3q4@1k6g2)9J5k6s2u0S2M7%4m8T1k6i4u0J5P5g2)9J5k6s2m8A6i4K6u0V1N6$3W2@1K9q4)9J5k6s2q4W2L8i4g2Q4x3V1j5`. )使用 QEMU 模拟器创建一台虚拟设备来配置你的实验环境。如果你缺乏使用 GDB 调试程序的基础知识,你可以在这片教程中学习( 7d5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6S2P5X3g2J5K9h3q4Q4x3X3c8D9j5h3u0K6i4K6u0W2j5$3!0E0i4K6u0r3k6r3g2T1N6h3N6Y4K9h3&6Y4i4K6u0V1N6$3W2@1K9q4)9J5k6r3N6V1j5W2)9J5k6r3W2F1N6s2u0G2k6s2g2U0N6r3W2G2L8W2)9J5c8R3`.`. )。在本系列教程中,我们将关注 ARM 32-bit ,所有的例子将按照 ARMv6 指令集编译。
这篇教程是为有兴趣学习基础的 ARM 汇编知识的人而写的。尤其是那些想在 ARM 平台编写漏洞利用的人。你可能已经发现 ARM 处理器在你的生活中无处不在。当我环顾我的身边,我发现我身边的大多数设备使用着 ARM 处理器而不是 intel 。这些设备包括我的手机、路由器以及最近销售火爆的 IoT 设备。可以说, ARM 处理器已经成为了当世最广泛使用的 CPU 核心。随之而来的是和 PC 时代类似的问题, ARM 设备也易于受到缓冲区溢出之类的攻击。由于被广泛的使用和潜在的脆弱性,针对这些设备的攻击将变得越来越常见。
目前在二进制安全领域,比起 ARM 平台,我们对 x86/x64 平台有深入的多的研究,即使 ARM 汇编可能是主流 CPU 指令集中最易学的。那么,为什么没有更多的人来关注 ARM ,研究 ARM 呢?可能因为漏洞利用的学习资料,大多数是针对 Intel 平台的,而很少针对 ARM 平台的。比如著名的由 Corelan Team 编写的 Intel x86 漏洞利用教程( 2f0K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2U0L8%4u0W2L8r3q4F1i4K6u0W2j5X3g2Q4x3V1k6A6L8X3c8W2P5q4)9J5k6i4m8Z5M7q4)9J5c8U0t1H3x3o6W2Q4x3V1j5H3y4#2)9J5c8U0p5&6i4K6u0r3k6i4S2H3L8r3!0A6N6q4)9J5k6s2N6J5K9i4c8A6L8X3N6Q4x3X3c8@1N6i4c8G2M7X3W2S2L8q4)9J5k6s2m8S2M7Y4c8Q4x3X3b7I4i4K6u0V1M7%4c8S2j5$3E0Q4x3X3c8T1j5i4y4W2k6q4)9J5k6r3!0$3k6i4u0X3L8r3!0%4M7#2)9J5c8R3`.`. ),帮助了很多对二进制漏洞利用感兴趣的人,通过学习和实践这个教程包含的知识,进入这个领域。如果你对 x86 平台的漏洞利用感兴趣, Corelan Team 的教程是非常好的起点。在这篇教程中,我们将关注 ARM 汇编的基础知识以及如何在 ARM 平台下编写漏洞利用。
ARM 处理器和 Intel 处理器之间有很多的差异,其中最大的不同点就是它们的指令集。 Intel 是一个 CISC ( Complex Instruction Set Computing ,复杂指令集)处理器。因此它具有更庞大,功能更丰富的指令集,并且允许指令进行一些复杂的访存操作。它也因此具有支持更多的复杂操作和寻址方式,并且寄存器的数量比 ARM 要少的多。 CISC 处理器一般用在通用 PC ,工作站和服务器中。
ARM 是一个 RISC ( Reduced Instruction Set Computing ,精简指令集)处理器。因此它拥有一套精简的指令集( 100 个左右,甚至更少的指令)以及比 CISC 处理器更多的通用寄存器。与 Intel 处理器不同, ARM 指令只处理寄存器中的数据,并使用了 load/store 结构访问存储器,也就是说只有 load/store 指令可以访问存储器。所以如果我们要增加某个内存地址中保存的值,至少需要三种类型的指令( load 指令、加法指令和 store 指令),首先我们需要使用 load 指令将指定地址内存中的值加载到寄存器中,然后使用加法指令增加寄存器中的值,然后用 store 指令将寄存器中的值写回内存。
硬币有两面,精简指令集也有它的优势和劣势。其中一个重要的优势是指令可以被更快的执行( RISC 处理器通过引入流水线机制,减少每个指令的占用的 CPU 的时钟周期来缩短执行时间)。它的劣势也很明显,较少的指令增加了软件(事实上是编译器)的复杂性。另一个重要的事实是, ARM 具有两种运行模式(可以类比 x86 的实模式和保护模式), ARM 模式和 Thumb 模式。 Thumb 指令可以是 2 或 4 个字节的(更多的细节将在第三篇: ARM 指令集中介绍)。
ARM 和 x86/x64 之间更多的区别还包括:
· 在 ARM 中大多数指令可以用于分支跳转的条件判断。
· Intel 的 x86/x64 系列 CPU 是小端序的。
· ARM 架构在 ARMv3 之前是小端序的,在那之后, ARM 处理器提供一个配置项,可以通过配置在大端和小端之间切换。
事实上,不仅 ARM 平台和 Intel 平台之间存在差异, ARM 平台内部的不同版本之间也存在很多差别。我们努力让本系列教程尽可能通用,让你能对 ARM 平台有一个全面的了解。当你掌握了 ARM 基础之后,再去针对某个特定版本学习就轻松了。本教程的示例是在 32 bit ARMv6 (树莓派 1 代)上创建的,因此示例相关的讲解是针对这个版本的。
我们刚才谈到了 ARM 指令集有不同的版本,这可能使你感到困惑,我们用下表简单的表示 ARM 指令集版本和处理器版本之间的映射关系:
ARM 处理器家族
ARM 指令集架构
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2018-3-27 21:27
被ljcnaix编辑
,原因: 修正坛友指出的错误
上传的附件: