Pwnable.kr leg
复制本地路径 | 在线编辑
本题可以给帮助我们进行 ARM 汇编初探
前言
要有x86和i386汇编基础,主要就是谈一下ARM汇编一些很"奇怪"的特点。
状态
ARM汇编有两种状态: arm && thumb,前者状态下字节长度为4,后者状态下字节长度为2。因此不同状态下同一个指令会有不同动作。
-
PC存储有区别
arm模式下PC = 当前地址 + 8,thumb模式下PC = 当前指令地址 + 4。 -
跳转指令有区别
这个下面会详细将跳转指令,反正时刻注意ARM汇编他要根据不同状态来做不同操作
跳转指令(B,对应jmp)
BL offset
这个offset是一个立即数,直接偏移地址为这个立即数的地方执行代码,返回地址会保存在lr中!
BX reg
我起初以为是比如bx r0,那就跳到[r0]处。不过有两点要注意的地方!
第一点,跳转地址并不是[r0],而是[r0] & 0xFFFE,也就是最后一位要先置0,再去跳转到对应位置。
第二点,这个命令可能会改变寄存器状态!!
第一点可以看到,最后一位没有用,所以用来作标志位。如果是0,那么状态变为arm;如果是1,那么状态变为thumb。
BX lr
为什么单独将这个呢,明明不就是上面的一个特例吗。的确如此,不过我想说的是,ARM是严格指令对齐,所以地址一定是4的倍数,所以很显然,当bx lr执行完成后,一定会变成arm状态!