合天网安 ARM汇编教程一 学习笔记

今天开始学ARM

CTF实验室用着非常舒服,但是课程的讲解质量实在太差。全程念指导书,作为一个基础课很多东西甚至没有解释。。。

首先按部就班的安装树莓派,再用ssh链接它 (ssh是一种常用的网络协议)然后是安装gef,试验机已经安装过了所以不用管(gef是gdb的一个py插件,用于配置gdb读取的.gdbinit文件)

启动gdb,成功后按q退出并下载调试文件

这是一个zip,解压

完成后ls看一下,多了一个叫code的文件夹。进入找到了test1.s的汇编文件

看一下内容:

.section .test

.global _start

_start:

mov r0 , pc

mov r1 , #2

add r2 , r1 , r1

bkpt

 

 (.section .text是伪操作,表示代码段。_start是一个代表跳转的地址值的符号,.globl指示告诉汇编器_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号。)

 

编译它

(as 是汇编器,类似gcc)

(ld是GUN链接器,把一定量的目标文件跟档案文件连接起来,并重定位它们的数据,连接符号引用.一般,在编译一个程序时,最后一步就是运行'ld'生产可执行的镜像文件)

在gdb中打开test1,在_start处下一个断点,run

指针停在了start处,观察寄存器。PC值为0x10054

输入 nexti 执行mov r0 , pc(PC即R15,程序计数器,用于为cpu确定下一条指令的地址。一般在执行一条指令后指向下一条指令)

发现此时r0的值为5C,显然这时pc的值变成了5c即是上一条的后8位,第二条指令。

这是因为,老款的ARM处理器总是获取当前已经执行的指令的后两条指令的地址。ARM保留着这个定义的原因是为了保证和早期处理器的兼容性。

posted @ 2021-02-28 21:15  Zigzagggg  阅读(93)  评论(0)    收藏  举报