概述
我正在尝试用C语言编写一个概念证明,它演示了ARM Cortex-M3上堆栈中内存缓冲区的代码执行 . 这将有助于证明正确使用ARM MPU可以防止此类攻击 . 我想一个快速而肮脏的方法来将一些代码放入堆栈中是从常规函数中复制它然后使用goto跳转到它,如下所示:
static void loopit(void)
{
printf("loopitn");
while (1);
}
void attack(void)
{
uint8_t buffer[64] __attribute__((aligned(4)));
memcpy(buffer, loopit, sizeof(buffer));
goto *((void *) (int) buffer);
}
我希望当我调用攻击函数时,它会将代码复制到堆栈中,跳转到它,打印消息并进入无限循环 . 但是,我在故障寄存器中得到以下值的异常:
HFSR = 0x40000000
CFSR = 0x00020000
PSR = 0x60000000
这似乎是UFSR中的INVSTATE位,表示"illegal use of the EPSR",我读到的通常是由于BX指令试图跳转到LSB设置为0的地址,处理器将其解释为一个非Thumb代码的函数,但Cortex-M处理器只允许使用Thumb代码 . 我看到memcpy被赋予 loopit 函数的奇数地址,因为我假设编译器正在使用 1 对实际内存地址进行ORing . 所以我认为修复就像重写我的攻击函数一样:
void attack(void)
{
uint8_t buffer[64] __attribute__((aligned(4)));
memcpy(buffer, ((int) loopit) & ~1, sizeof(buffer));
goto *((void *) ((int) buffer) | 1);
}
但是在这之后我得到了一个与故障寄存器不同的异常:
HFSR = 0x40000000
CFSR = 0x00080000
PSR = 0x81000000
这似乎没有任何意义,UFSR第3位设置意味着“处理器试图访问协处理器” . 看看PC这次看起来跳跃成功了很好但是后来有些东西掉了轨道并且CPU看起来正在执行奇怪的指令而没有进入无限循环 . 我尝试在goto之前关闭中断并注释掉printf但没有运气 . 有什么问题以及如何使其发挥作用?
最后
以上就是安静信封为你收集整理的ARM主板跑java_在ARM Cortex-M3上编写一个简单的C任意代码执行漏洞?的全部内容,希望文章能够帮你解决ARM主板跑java_在ARM Cortex-M3上编写一个简单的C任意代码执行漏洞?所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复