【发布时间】:2018-08-01 10:53:35
【问题描述】:
为了测试 MPU 和利用漏洞,我想从运行在我的 STM32F4 开发板上的本地缓冲区执行代码。
int main(void)
{
uint16_t func[] = { 0x0301f103, 0x0301f103, 0x0301f103 };
MPU->CTRL = 0;
unsigned int address = (void*)&func+1;
asm volatile(
"mov r4,%0\n"
"ldr pc, [r4]\n"
:
: "r"(address)
);
while(1);
}
首先,我首先打开 MPU。在 func 中存储了我的指令。在 ASM 部分中,我将地址(拇指为 0x2001ffe8 +1)加载到程序计数器寄存器中。使用 GDB 单步执行代码时,在 R4 中存储正确的值,然后将其传输到 PC 寄存器。但是我最终会进入 HardFault Handler。
编辑: 堆栈如下所示:
0x2001ffe8: 0x0301f103 0x0301f103 0x0301f103 0x2001ffe9
内存中的指令是正确的。 Cortex 权威指南说区域 0x20000000–0x3FFFFFFF 是 SRAM 并且“这个区域是可执行的, 所以你可以在这里复制程序代码并执行它”。
【问题讨论】: