本文主要讨论 pc 寄存器的一些行为。
我们使用前文编译的 arm32 程序来做实验,由于 arm64 里面已经没有了 mov pc r0 这样的指令,无法直接对 pc 寄存器进行读写操作,所以只能采用 arm32 来演示。
PC寄存器的读写 - arm模式
#include <stdio.h>
int main()
{
while (1)
{
getchar();
printf("hello\n");
}
return 0;
}
在 IDA 上调试程序,我们测试一下写入 PC 的值:

此时,调试窗口与寄存器窗口的 PC值为0xE9DAF4E0。
我们 patch 程序,将断点位置的指令改为 mov pc, r0 ,在这之前给 r0 赋值 0xE9DAF4EC,也就是往下数3条指令的位置:

当我们按 F7 执行完这条指令后,按照道理来说,程序应该会跳转到 0xE9DAF4EC 这个位置来执行。我们试一下:

程序确实跳转到了这个位置。
我们再来测试一下读取 PC 寄存器的值,此时,PC 的值是 0xE9DAF4EC:

本文探讨了在ARM和Thumb模式下,PC寄存器的行为特点,包括PC值与流水线的关系,以及在IDA中调试LDR指令时遇到的奇异性。它揭示了流水线级数对PC值的影响,以及LDR指令对地址对齐的处理方式。
最低0.47元/天 解锁文章
1471

被折叠的 条评论
为什么被折叠?



