ARM PC 在缓冲区溢出时被不正确的值覆盖

ARM PC overwritten with incorrect value in buffer overflow

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

字符增益[12];

在我的代码中。

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

AAAABBBBCCCCDDDDEEEEEEFFFF 增益

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

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

截图 of GDB output

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