代码执行漏洞利用Cortex M4

时间:2018-08-01 10:53:35

标签: arm exploit cortex-m

为了测试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处理程序。

编辑: 堆栈如下所示:

0x2001ffe8: 0x0301f103  0x0301f103  0x0301f103  0x2001ffe9

指令在存储器中是正确的。 《 Cortex权威指南》指出,区域0x20000000–0x3FFFFFFF是SRAM,“该区域是可执行的, 因此您可以在此处复制程序代码并执行它。”

1 个答案:

答案 0 :(得分:1)

您正在将32位值分配给16位数组。

您的指令不会终止,它们会继续运行到ram中发现的任何内容,因此将崩溃。

您没有将数组的地址加载到程序计数器中,而是将数组中的第一项加载到程序计数器中,这将崩溃,您创建了一个间接级别。

查看BX指令,而不是ldr pc

您没有将数组声明为静态数组,因此可以将数组优化为失效和未使用状态,因此可能导致崩溃。

编译器还应该抱怨您为一个无符号变量分配了void *,因此在那里需要进行类型转换。

作为一种习惯,我建议使用地址| = 1而不是+ = 1,在这种情况下,两者都会起作用。