gpt4 book ai didi

c - 从mmaped NULL指针读取数据

转载 作者:行者123 更新时间:2023-12-03 09:55:20 24 4
gpt4 key购买 nike

检查此代码:

#include <sys/mman.h>
#include <stdio.h>
#include <string.h>

int main(void) {
char *addr = mmap(NULL, 6, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
if (addr == MAP_FAILED) {
perror("mmap");
return 1;
}
strcpy(addr, "abcxyz");
printf("Mapped into addr=0x%X\n", addr);
printf("%s\n", addr);
printf("%s\n", NULL);
}
fd是包含字符串 abcxyz的文件的文件描述符
我希望程序在访问NULL指针时应收到SIGSEGV
但讽刺的是,我得到了
Mapped into addr=0x0
abcxyz
abcxyz

发生了什么?为什么可以将可访问的数据映射到地址NULL?有了这种行为,我如何使用它来利用系统?

请注意:该程序必须在root特权下运行。

注2:该行为是在 Linux XXXXXX 4.4.0-174-generic #204-Ubuntu SMP Wed Jan 29 06:41:01 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

最佳答案

What is happened?



通常,没有页面映射到 0x0,因此取消引用空指针segfaults。但是您在此处显式映射了一个页面,因此它不再存在段错误。

Why is it possible to map a accessible data to address NULL?



您没有意识到就回答了自己的问题:

Note that: The program has to run under root privilege.


vm.mmap_min_addr sysctl通常通过将其设置为大于0的值来防止这种情况。但是,该sysctl不适用于以root用户身份运行的进程。

With this behavior, how can I use it to exploit the system?



您不能这样做,因为如果可以执行 mmap,则可以执行 you're already on the other side of the airtight hatchway

顺便说一句,您的代码从技术上讲是未定义行为,因为即使有某些内容,您仍在取消引用NULL。实际上,对于大多数常见的libcs​​,只有编译器将 printf优化为 puts才可以使它工作。

关于c - 从mmaped NULL指针读取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62321717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com