关于代码注入的EXC_BAD_INSTRUCTION(armv7 asm)

时间:2016-07-08 06:04:40

标签: assembly armv7 thumb

我不知道为什么下面的代码遇到BAD_INSTRUCTION错误,有人吗?

mov    r4, r0
movw   r0, #0xc70   ; injected code start here
movt   r0, #0x8bb3
movw   r3, #0x576
ldr    r1, [r7]
movs   r5, #0x1a
add    r5, pc       ; next instruction will jump over 9 instructions
bx     r5           ; injected code end here
ldr    r1, [r0]
ldr    r0, [r2]
blx    0x26e11c
movw   r1, #0x6442
movt   r1, #0x18
add    r1, pc
ldr    r1, [r1]
blx    0x26e11c
mov    r3, r1
movw   r1, #0x66a4  ; r1 has not been loaded
movt   r1, #0x15    ; with new value. Why?
mov    r2, r0
add    r1, pc       ; This instruction isn't getting called
mov    r0, r4       ; EXC_BAD_INSTRUCTION here
blx    __sprintf

1 个答案:

答案 0 :(得分:2)

在26字节偏移(即没有多个4字节ARM指令)和立即生成标志设置(movs r5, #0x1a)之间,我感觉这是Thumb代码。但是,bx r5是一个交互分支,由于r5的第0位没有被设置,它将与ARM状态交互到一些Thumb指令的中间并且变得非常不满意。由于我认为EXC_BAD_INSTRUCTION是iOS报告的未定义指令异常,所有这些都会加起来。

如果您处于Thumb状态并希望保持Thumb状态,请使用非互通分支(即mov pc, r5),或确保设置bx目标的位0(即偏移量为0x1b)。