ARM PC被缓冲区溢出中的错误值覆盖

ARM PC被缓冲区溢出中的错误值覆盖,arm,gdb,buffer-overflow,stack-smash,program-counter,Arm,Gdb,Buffer Overflow,Stack Smash,Program Counter,我正在进行ARM上的堆栈粉碎,我有一个缓冲区声明为: 字符buff[12] 在我的代码中 为了找到电脑在gdb中被覆盖的位置,我写 aaaabbbbccddedeeefff去buff 我希望DDDD将FP(r11)覆盖为0x444444(执行正确),但PC被覆盖为0x454544(而不是0x4545) 有人知道为什么最后一个字节是D(44)而不是E(45)吗?我尝试了更长时间的输入,但PC中的值总是下降几位 截图 PC寄存器不能保存奇数值-LSB被强制为0以确保地址对齐。“与0x4544(而不是

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

字符buff[12]

在我的代码中

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

aaaabbbbccddedeeefff去buff

我希望DDDD将FP(r11)覆盖为0x444444(执行正确),但PC被覆盖为0x454544而不是0x4545

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

截图

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

“与0x4544(而不是0x4544)重叠”它们是相同的值。您的意思是“用0x4544(而不是0x4545)过度书写”吗?您是否尝试过打印
&buff[0]
?而不是0x4545的地址!pc的lsbit是保留的/特殊的。你不能在arm模式下设置两个lsbit。它们被剥离。你不能在thumb模式下设置lsbit。进入pc时,它被剥离。如果你想进行一些黑客操作,也可以使用堆栈指针进行黑客操作。进行一些实际适用于体系结构的黑客操作。随机值不行。这是否意味着内容仍然等同于EEEE(0x4545)?在arm模式下,地址必须在thumb模式下对齐四个字节,在thumb模式下对齐两个字节。在这两种情况下都不能设置lsbit,因为arm模式无法设置位1。这些位在加载到pc时会被剥离,pc没有设置这些位。检查add r0,r0,pc非常容易。