Sil*_*ver 4 c linux null mmap linux-kernel
检查这个代码:
#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);
}
Run Code Online (Sandbox Code Playgroud)
fd
是包含字符串的文件的文件描述符abcxyz
我希望程序在访问 NULL 指针时应该收到 SIGSEGV 但具有讽刺意味的是,我得到了
Mapped into addr=0x0
abcxyz
abcxyz
Run Code Online (Sandbox Code Playgroud)
发生了什么?为什么可以将可访问的数据映射到地址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
发生了什么?
通常,在 处没有映射页面0x0
,因此取消引用空指针会出现段错误。但是您在那里显式映射了一个页面,因此它不再出现段错误。
为什么可以将可访问的数据映射到地址NULL?
你在没有意识到的情况下回答了你自己的问题:
注意:程序必须在root权限下运行。
sysctlvm.mmap_min_addr
通常通过将其设置为 0 以上来防止这种情况。但是,该 sysctl 不适用于以 root 身份运行的进程。
有了这种行为,我如何利用它来利用系统?
你不能,因为如果你能做到这一点mmap
,那么你已经在密闭舱口的另一边了。
顺便说一句,从技术上讲,您的代码是未定义行为,因为即使那里有某些东西,您仍然会取消引用 NULL。事实上,对于大多数常见的 libc,只有编译器的优化才能printf
使其puts
正常工作。
归档时间: |
|
查看次数: |
1031 次 |
最近记录: |