C++ mmap系统调用失败,错误号为14
我试图在另一个进程上使用MMAP进行系统调用注入,但失败了。我注意到系统调用正在正确执行,因此问题应该是其他问题。我决定通过目标程序直接运行syscall,使其更易于理解。毫不奇怪,它也不起作用,我真的不知道为什么:C++ mmap系统调用失败,错误号为14,c++,c,linux,system-calls,mmap,C++,C,Linux,System Calls,Mmap,我试图在另一个进程上使用MMAP进行系统调用注入,但失败了。我注意到系统调用正在正确执行,因此问题应该是其他问题。我决定通过目标程序直接运行syscall,使其更易于理解。毫不奇怪,它也不起作用,我真的不知道为什么: #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <sys/errno.h>
int main()
{
void* addr = 0;
size_t len = sysconf(_SC_PAGE_SIZE);
int prot = PROT_EXEC | PROT_READ | PROT_WRITE;
int flags = MAP_PRIVATE | MAP_ANON;
int fd = -1;
off_t offset = 0;
void* alloc0 = mmap(addr, len, prot, flags, fd, offset); //this works
void* alloc1 = syscall(__NR_mmap, addr, len, prot, flags, fd, offset); //this doesn't work
printf("Alloc0: %p\n", alloc0);
printf("Alloc1: %p\n", alloc1);
printf("Errno: %i\n", errno);
return 0;
}
为什么正常的mmap工作,而具有相同参数的mmap系统调用不工作?我运行的是Manjaro,程序是用GCC在32位上编译的。而且,当我用64位编译它时,它工作得很好,没有错误。有什么想法吗?传统的32位(至少32位x86)系统调用没有该签名。它只接受一个指向
结构mmap_arg_struct32
的指针的参数;看见自90年代中后期以来,此系统调用已被弃用,不应使用。错误号14是EFAULT
,反映您的第一个参数不是指向此类结构的有效指针
现代的替代品是
\uu NR\u mmap2
,它采用与mmap
函数类似的参数,只是offset
是一个4k单位的32位计数,而不是直接偏移。这允许寻址偏移量高达2^44。传统的32位(至少32位x86)系统调用没有该签名。它只接受一个指向结构mmap_arg_struct32
的指针的参数;看见自90年代中后期以来,此系统调用已被弃用,不应使用。错误号14是EFAULT
,反映您的第一个参数不是指向此类结构的有效指针
现代的替代品是
\uu NR\u mmap2
,它采用与mmap
函数类似的参数,只是offset
是一个4k单位的32位计数,而不是直接偏移。这允许寻址偏移量高达2^44。您应该在系统调用失败后立即保存errno
的值,因为printf
可能会覆盖它。此外,使用perror()
或strerror()
来获取可读的错误消息,而不是“errno 14”。您应该在失败的系统调用后立即保存errno
的值,因为printf
可能会覆盖它。另外,使用perror()
或strerror()
来获取人类可读的错误消息,而不是“errno 14”。
Alloc0: 0xf7fac000
Alloc1: 0xffffffff
Errno: 14