【发布时间】:2023-03-21 06:41:01
【问题描述】:
我专注于 micropython,特别是分支 dynamic-native-modules。
此功能将在未来允许您将 C/C++ 函数编译为原生 .obj,并将其与 .py 接口一起打包,从而大幅提升速度。
太棒了!但问题是,如果您使用的是 RTOS,doesn't have virtual memory,那么任何正在执行的本机代码都可以访问地址空间的任何部分,包括外围设备、RTOS 的状态等。
您不希望用户能够执行以下操作:
void user_func()
{
/* point to arbitrary memory, potentially the reset registers, flash erase . . . you get the point */
int * a = (int*)0x1234;
*a = 0x10110000; // DESTROY!!!
}
即使是以下情况也应该被禁止:
void user_func()
{
int a;
(int*)(&a-1000) = 0x10010111;
}
解决方案?
- 创建自己的
gcc版本(适用于每种二进制格式) - 反编译
.obj文件并检测指针的使用(针对每种二进制二进制格式)
反馈意见
我知道阻止恶意用户可能是不可能的,但这不是第一个担心。我们要停止善意但意外的代码。如果不可能停止每一个案例,那ok。
如果我们可以禁止/检测显式指针访问并简单地提供有关数组使用的警告,那仍然非常有价值。
警告:您正在使用数组!确保您不会越界
【问题讨论】:
-
这是 XY 问题的根源。
-
使用数组并在末尾运行也将在内存中的某个位置运行,也无需显式使用指针。没有任何内存访问的 C/C++ 将有所帮助...
-
如果特定的 OBJ 可以做一些事情,即使你禁止使用特定语言做这些事情,恶意用户也会想方设法通过其他方式制作这样的 OBJ。这意味着您的系统架构在要求方面存在缺陷。
-
如果您认为静态分析是检测基于指针和数组的内存访问的唯一可行方法,请投票支持@EugeneSh 的原始评论。:
Anyway. You can't remove the use of pointers from C without defeating it's completeness. And of course you can't remove it from obj, because it looks like a regular memory access. You can think of some kind of static analysis tool to analyze the compiled program and warning about dangerous constructs. It won't be easy, though.跨度> -
是的,对于所有这些情况,您都可以使用模拟器、仿真器、valgrind、软件 mmu(检查 6 执行)等等。所以只要这样做,如果你真的想使用 C++... valgrind 必须在另一个非嵌入式目标上的代码的不同编译中使用。但是应该可以发现越界问题和被操纵的指针。
标签: c++ c gcc decompiling