作者: ljcnaix 这篇教程中有一些示例程序,可以动手调试来加深理解。要调试 ARM 程序,我们需要能运行 ARM 程序的运行环境和支持 ARM 架构的调试器。本篇教程将基于 x86 平台的 Ubuntu 16.04 ,介绍如何搭建 ARM 的交叉编译、运行和调试环境。0x00 交叉编译环境Ubuntu 16.04 的源中提供了多个 arm-gcc 的软件包,以 gcc 5 为例可以通过“ apt search ”命令找到“ gcc-5-arm-linux-gnueabi ”和“ gcc-...
阅读全文>>
原文链接:azeria-labs.com/load-and-store-multiple-part-5/翻译:vvizz 有时候一次加载(或存储)多个值更有效率。为了达到这个目的,我们使用LDM(加载多个值 vvizz:LoaD Multiple)和STM(加载多个值 vvizz:STore Multiple)。这些指令的不同基本都是在初始地址访问方式上的变化。下面是我们这一节使用的示例代码,我们将会一步步的讲解每一个指令。.data array_buff: .word 0x00000000 ...
阅读全文>>
原文链接:https://azeria-labs.com/memory-instructions-load-and-store-part-4/翻译:vvizz ARM平台使用“加载-存储”模式进行内存访问,也就意味着只有加载/存储指令(LDR和STR)可以访问内存。在X86平台大多数指令都允许直接操作内存数据,但是在ARM平台,必须将内存数据存放到寄存器才可以操作。也就是说,将一个特定内存地址的32位数值进行值增加操作,必须经过三种类型的指令(加载,增加,存储):首先将特定内存地址...
阅读全文>>
原文链接:azeria-labs.com/arm-instruction-set-part-3/ 翻译:ljcnaix ARM和Thumb ARM处理器有两种工作状态ARM和Thumb(Jazelle此处先不考虑)。这两种工作状态和运行模式没有任何关系。比如不论是ARM还是Thumb状态的代码都可以运行在用户模式下。这两种工作状态之间最大的差异是指令集,ARM状态的指令长度是32位的,Thumb状态的指令长度是16位的(也可能为32位)。了解如何使用Thumb工作状态对于编写ARM平台的漏洞利用是至关重要的。当我们编...
阅读全文>>
原文链接:azeria-labs.com/arm-data-types-and-registers-part-2/翻译:ljcnaix数据类型这是ARM汇编基础教程的第二篇,包含了数据类型和寄存器的相关知识。和高级语言一样,ARM汇编语言支持对不同数据类型的操作。我们可以load(或store)的数据类型包括signed/unsigned words,halfwords或者bytes。我们用“-h”或“-sh”后缀表示half words,用“-b”或“-sb”表...
阅读全文>>
原文链接:https://azeria-labs.com/writing-arm-assembly-part-1/最近在学IoT安全,这个教程挺不错的,边学边翻译出来,分享给大家。 ARM汇编基础教程——ARM汇编简介 原文链接:https://azeria-labs.com/writing-arm-assembly-part-1/翻译:ljcnaix欢迎来到系列文章《ARM汇编基础教...
阅读全文>>