在 ARM Cortex-M3 上编写一个简单的 C 任意代码执行漏洞?

2024-02-10

我正在尝试用 C 语言编写概念验证,演示从 ARM Cortex-M3 堆栈中的内存缓冲区执行代码。这将有助于证明正确使用 ARM MPU 可以防止此类攻击。我认为将一些代码放入堆栈的一种快速而肮脏的方法是从常规函数复制它,然后使用 goto 跳转到它,如下所示:

static void loopit(void)
{
    printf("loopit\n");
    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 位,它指示“非法使用 EPSR”,我读到的这通常是由于 BX 指令试图跳转到 LSB 设置为 0 的地址,处理器将其解释为函数其中包含非 Thumb 代码,但 Cortex-M 处理器只允许 Thumb 代码。我看到 memcpy 被赋予了一个奇怪的地址loopit函数,因为我假设编译器正在将实际内存地址与1。所以我认为的修复方法是重写我的攻击函数,如下所示:

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 但没有成功。知道出了什么问题以及如何让它发挥作用吗?


很抱歉滥用答案表格,我对您的代码进行了一些修改,并且它从堆栈中闪烁了 LED:

void (*_delay_ms)(uint32_t) = delay_ms;

static void loopit(void)
{
    while (1)
    {
        GPIOC->ODR ^= 1 << 13;
        _delay_ms(125);
    }
}

void attack(void)
{
    volatile uint8_t buffer[64] __attribute__((aligned(4)));
    memcpy(buffer, (void *)((uint32_t) loopit & ~1), sizeof(buffer));
    goto *(void *)((uint32_t) buffer | 1);
}

我想知道我多久会收到关于 UB 的投诉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 ARM Cortex-M3 上编写一个简单的 C 任意代码执行漏洞? 的相关文章

随机推荐

  • 如何在使用hadoop时使用logger api编写java日志文件

    我写了一个我想调试的地图缩减代码 为此 我无法使用标准输出 因为除非发生错误 否则 Hadoop 平台不会将其打印到屏幕上 相反 我尝试使用记录器来创建日志文件 我使用处理程序将其拆分为两个文件 不幸的是 严重 日志文件为空 而通用日志文件
  • java.io.IOException:Android 设备上没有剩余空间

    我们在 Android 市场上有应用程序 我们的用户从这个错误中得到了很多 java io IOException 设备上没有剩余空间 从我到目前为止发现的情况来看 我知道他们的外部存储上有足够的空间 而且这只发生在 Android 2 x
  • 如何使用openCV python从文本文档中删除水印?

    我是 OpenCV 新手 我需要帮助从该图像中删除水印 我尝试使用修复 但我想要一种更自动化的特征映射和修复方式 请帮助我 如果您的所有图像都是这样的并且具有水印 如具有浅灰色水印的问题所示 那么简单的阈值操作将起作用 import cv2
  • Flask 和 React - Spotify 授权后处理令牌

    我已经在我的应用程序中实现了 JWT 用于用户登录 在 Spotify Auth 之前 如下所示 Flask auth blueprint route auth login methods POST def login user get p
  • 快速:didSelectRowAtIndexPath

    我有 tableViewController 我想点击 1 个单元格并获取print 0 然后点击2个单元格并得到print 1 但我的代码不起作用 为什么 import UIKit class MasterViewController U
  • Laravel 身份验证登录不起作用

    我是 Laravel 的新手 我正在开发 Laravel 身份验证系统 虽然注册有效 但登录没有执行任何操作 用户控制器 php class UserController extends Controller public function
  • 2 状态可舍入数字文本框与knockoutjs

    我想要一个具有 2 个状态的 html 数字文本框 当聚焦时 它必须显示所有小数位 当焦点丢失时 只显示 2 位小数 我几乎已经实现了 HTML
  • 如何向服务器发送数据

    我想做一个登录 那么如何将用户名和密码发送到我的服务器呢 我为服务器编写了一个 php 脚本 他将收到用户名和密码 如果用户名和密码正确 他将响应 成功 那么如何发送到服务器呢 用 onResponse 发送后呢 您可以使用 OkHttp
  • 在 R 中安装包时出现警告

    我一直在尝试在 R 中安装 ggplot2 包 这是我收到的警告 read dcf file path pkgname DESCRIPTION c Package Type 中的错误 无法打开连接 另外 警告消息 1 在 download
  • 将括号内第一个单词的第一个字母大写

    我想将括号内每个字符串的第一个字母大写 如果我们有这个字符串 const text This forest or jungle is really beautiful 期望的结果是 This Forest or jungle is Real
  • 点表示法与方法表示法

    我正在深入研究 iOS 编程 但我很难理解点表示法和方法表示法的想法 据我了解 点表示法可用于调用属性上的 setter getter 并且写入 读取更加清晰 方法表示法用于向对象发送消息以对其进行操作等 有人可以给我一个简单的解释 解释为
  • iOS:如何以最简单的方式测试互联网连接,而不冻结应用程序(没有可达性)?

    在我的代码中 我曾经使用三种方法来检查互联网 但它们有限制 1 可达性方法 BOOL isInternetOk Reachability curReach Reachability reachabilityWithHostName appl
  • Eclipse Compare Editor:“下一个差异”和“下一个更改”按钮之间的区别?

    今天问一个简单的问题 在 Eclipse 比较编辑器中 右键单击文件 比较 下一个差异 和 下一个更改 按钮之间有什么区别 他们似乎做着完全相同的事情 它烦我 Thanks The 比较编辑器 的帮助页面 http help eclipse
  • CSS 变换 - 保持悬停状态的值

    我将一个盒子改造为旋转 10 并添加悬停状态以增加尺寸 box margin 0 auto background blue width 100px height 100px moz transform rotate 10deg webkit
  • 使用 Javafx 模仿 ListView 中的 CTRL+单击多项选择

    我试图找到在 ListView 中选择多个项目的不同方法 GUI 将在触摸屏显示器上运行 因此我无法按住 CTRL 单击 通过研究过去的各种帖子 我已经能够通过将所有选定的项目保留在数组中然后循环遍历以获得最终选择来实现多重选择 我的代码遇
  • Rails:如何在 collection_select 中添加自定义数据属性

    我正在研究一种解决方案 使用以下命令将自定义数据属性添加到选项标签collection selectRails 中的表单助手 我研究了 stackoverflow 上的一些帖子 并在查阅了一些 API 文档后进行了大量的试验和错误 我已经快
  • 从c中的数组中删除偶数

    你好 我正在尝试大约 2 个小时来创建一个程序 该程序将从 c 中的动态分配数组 使用 malloc 中删除偶数 有人可以帮我提供一些提示或创建代码吗 附注这是我在这里的第一个主题 所以请随时给我一些关于如何正确发布问题的提示 假设您已经动
  • 在 React 项目上运行“tslint --project”时,是什么产生了“项目选项无效:true”?

    我正在尝试按照在线教程设置 tslint 以处理一个小型示例 React Typescript 项目 当我跑步时yarn lint或者直接输入tslint project在终端中 我不断收到错误 项目选项无效 true 我已经做了很多谷歌搜
  • 如何使用theano或烤宽面条将特定位置的重量值保持为零?

    我是 theano 和烤宽面条的用户 我在处理输入矩阵的可变长度时遇到问题 i e x1 0 1 3 x2 1 2 matrix embedding 0 1 0 2 0 3 0 4 0 5 0 6 0 2 0 3 0 5 0 5 0 6 0
  • 在 ARM Cortex-M3 上编写一个简单的 C 任意代码执行漏洞?

    我正在尝试用 C 语言编写概念验证 演示从 ARM Cortex M3 堆栈中的内存缓冲区执行代码 这将有助于证明正确使用 ARM MPU 可以防止此类攻击 我认为将一些代码放入堆栈的一种快速而肮脏的方法是从常规函数复制它 然后使用 got