在arm体系下,内核在较早版本的读写限制没有开启,至少在4.4版本之前。但是在4.19之后的内核,默认开启。

这里有个set_mem_rw(unsigned long ,int)
在19版本上理论上可以更改内存的读写属性,但是采取

set_mem_rw = (void *)kallsyms_lookup_name("set_memory_rw");

进行导出引用,发现根本不管用。我还以为这里内核写的有错误。

在这里插入图片描述
这里这个chang_memory_common是内核中的set_mem_rw的主要实现。

我们看到红色框里面的flag & VM_ALLOC 标志如果不属于这个,那么就直接退出。
在这里插入图片描述
据此,我们导出内存属性中的flagz并做了更改,如黄色框图显示。
再次调用导出set_mem_rw,发现内存成功试下更改。

可见,这个内核函数在做属性更改的同时做了标志检查,但是还是存在绕过的可能。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐