2

我正在研究 ARM 上的堆栈粉碎,我有一个缓冲区声明为:

字符缓冲区[12];

在我的代码中。

为了在 gdb 中找到 PC 被覆盖的位置,我写了

AAAABBBBCCCCDDDDEEEEFFFF到 buff

我希望 DDDD 将 FP(r11) 覆盖为0x44444444(并且它执行正确)但 PC 被 0x45454544覆盖而不是 0x45454545

有谁知道为什么最后一个字节是 D(44) 而不是 E(45)?我尝试过更长的输入,但 PC 中的值总是下降几位。

GDB 输出截图

4

1 回答 1

0

PC 寄存器不能保存奇数 - LSB 被强制为 0 以确保地址对齐。

于 2020-01-24T15:01:07.943 回答