假设我有一个函数 (vuln),它有一个大小为 0x20 字节的本地缓冲区。在这个函数的开头,有push r4-r7,lr.
是否正确,堆栈看起来像:
缓冲区:((0x20)...r4(0x4)...r5(0x4)...r6(0x4)...r7(0x4)...lr用于返回地址0x4)...fp(前一帧指针0x4)...然后是调用者函数的堆栈帧。
这意味着,如果我想跳转到 address 中的函数0xabcd,我需要放入 buffer AA* 0x32+ 0xabcd ( 0x32= buffer +r4-r7) 。
是这样吗?lr 的位置将被替换,但 fp 的位置保持正确?
现在,如果我真的会跳转到 0xabcd 的地址。此功能 ( 0xabcd) 将完成后。该函数将尝试恢复 fp 并且会崩溃,因为它是易受攻击函数的帧指针。
那是对的吗?