问题标签 [mprotect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
531 浏览

c++ - Hook 函数调用 linux mint

几天前,我通过修补单个调用指令编写了一个简单的钩子/绕道。它可以在 Ubuntu 12.xyz(32 位)上运行,现在我更新到 Linux Mint 17.1(32 位)并且出现分段错误。

我有两个项目

  • 调用名为 goodGuy 的函数的目标项目
  • 由 dlopen() 加载的库项目,它覆盖目标应用程序中调用指令的偏移量

在覆盖调用指令偏移之前,我通过以下方式修改了页面的保护:

这工作正常(返回 0)。

当我调试我的程序时,它在尝试写入调用地址时崩溃:

看起来我不允许覆盖指令,但为什么呢?

我禁用了 ALSR 并-z execstack -fno-stack-protector在 g++ 中使用了标志。

你知道如何让我的应用程序写指令吗?

谢谢你,亚历克斯

编辑

对不起各位,代码如下:

目标应用:

和共享库代码:

要找出addressOfCall,用gdb打开目标应用程序gdb target并显示主函数,disas main看看+29

0 投票
1 回答
1962 浏览

linux - 解决 mprotect() 系统调用失败

我正在编写一些通过系统调用调用 mprotect 的 ROP 漏洞利用代码,在调用 int 0x80 eax 后设置为 0x0 表示成功。将执行转移到目标地址仍然会导致 SIGSEGV。我很想有人告诉我哪里出错了。

一些细节,目标地址是 .data 部分,这是我将通过 shellcode 写入的地方: [20] 0x8146820->0x814c2b8 at 0x000fd820: .data ALLOC LOAD DATA HAS_CONTENTS

我设置eax125,ebx到页面边界0x8146000,ecx0x1000(4096 页面大小) 和edx( 0x7RWX)。

就在系统调用之前,寄存器看起来像这样:

在系统调用之后,寄存器是:

但是,内存位置没有显示权限的变化,并且尝试在那里执行指令会终止应用程序:

欢迎任何关于如何/什么调试或我做错了什么的建议。

编辑 我在没有附加调试器的情况下在 strace 下运行它,似乎 mprotect 调用成功,但执行失败:

从核心确认崩溃地址:

0 投票
2 回答
99 浏览

c - libc 创建/访问了哪些匿名区域?

有没有办法找出 libc 创建/访问了哪些匿名虚拟内存区域?

我有一个程序,mprotect它的地址空间上有 VMA。但是当它mprotect是一个将被 libc 访问的区域时,就会发生 SIGSEGV。不幸的是,我安装的信号处理程序只处理发生在我的代码上的错误,而不是 libc 的。

详细地说,我得到的错误是因为printf使用了可变参数。它尝试访问结构reg_save_area内的位置va_list。该位置属于我之前mprotect编辑的匿名 VMA。

那么,在我之前是否知道这些区域是哪些mprotect?或者至少有一种方法可以知道stdarg.h选择放置在哪里reg_save_area

最干净的方法是处理 libc 中出现的 SIGSEGV。但我怀疑是否有这样的方法。

注意: libc 的 data/bss 段很容易识别,因为它不是匿名的。如果我mprotect也是那个 VMA,它也会导致一个未处理的 SIGSEGV,这就是我选择不这样做的原因。

0 投票
1 回答
322 浏览

c++ - 在多线程应用程序中切换注入 mprotect 调用的标志

我正在开发一个项目,其中动态库(.so)在运行时(动态检测)注入到某个目标程序中。该库使用mmap/munmap. 出于安全原因,要求库中的某些映射区域只能通过库中公开的 API 写入。

我们所做的是在库函数的序言/结尾处使用和切换内存区域的写入标志,例如:mprotectPROT_WRITE

这适用于单线程应用程序。对于多线程应用程序,如果在设置发生上下文切换(到同一进程中的不同任务)PROT_WRITE(因此内存是可写的)和它被清除之前。

所以,问题是:是否可以在foo返回之前禁用进程中的其他任务?如果没有,你建议如何解决这个问题?

0 投票
2 回答
181 浏览

c - 在主线程的堆栈上调用 mprotect 总是失败

我尝试调用mprotect主线程的堆栈,但它总是失败。每次我尝试,它都会产生一个ENOMEM错误。我已经签入 /proc/[pid]/maps 整个堆栈都映射到地址空间中。但是,我可以成功地mprotect从主堆栈调用子线程的堆栈。主线程的堆栈一定有一些特殊的东西可以防止自己被mprotect. 但我找不到任何文件。有人有想法吗?

0 投票
1 回答
1292 浏览

ios - mprotect errno 22 iOS

我正在iOS上开发越狱应用程序并在调用时收到errno 22

errno 22 表示无效参数,但我不知道出了什么问题。我已经将 p 对齐为页面大小的倍数,并且在调用 mprotect 之前我已经分配了内存。

这是我的代码和示例输出

并输出:

0 投票
0 回答
163 浏览

memory - mips平台如何查看内存修改

我正在调试 MIPS 上的内存损坏问题。我想知道谁将某个值写入地址。

在 x86-64 中,我们可以使用 mprotect+sigsegv+sigtrap 来记录对指定地址的任何内存写访问。

如果我使用 mprotect,在 sigsegv 处理程序中,我必须取消保护内存,否则程序会不断触发信号处理程序。此外,在信号处理程序中,要知道将写入内存的值并不容易。

对于硬件观察点,它有类似的问题。异常将在写入内存之前而不是之后发生。

无论如何要知道将写入内存的值?而如果是期望值,我们是否可以再次保护内存并继续执行?

0 投票
3 回答
3357 浏览

c - 调用位于堆中的函数时出现分段错误

我正在尝试在这里稍微调整规则和malloc缓冲区,然后将函数复制到缓冲区。

调用缓冲函数有效,但是当我尝试调用其中的另一个函数时,该函数会引发分段错误。

有什么想法为什么?

此代码将引发段错误,除非我将foo函数更改为:

笔记:

代码成功复制foo到缓冲区,我知道我做了一些假设,但在我的平台上它们没问题。

0 投票
2 回答
1230 浏览

elf - 使所有页面可读/可写/可执行

我想授予 ELF 二进制文件中所有内存页的完全权限(读取、写入和执行)。理想情况下,我希望能够将其作为二进制文件或目标文件的转换来执行,就像可以使用objcopy. 我还没有找到一个很好的方法来做到这一点。我也可以接受涉及在启动时运行代码的解决方案,该代码在mprotect每个页面上调用 flags PROT_READ | PROT_WRITE | PROT_EXEC。我已经简单地尝试过了,但我还没有找到一个很好的方法来知道哪些页面被映射,因此哪些页面需要被mprotect编辑。

不需要动态分配的页面具有所有权限,只需在程序启动时映射的页面即可。

0 投票
0 回答
94 浏览

ld - 你如何查询内存映射?

有没有办法查询一个用户内存地址范围是RO,RW,X,...?

在 BSD 上,POSIX ...系统mmap()mprotect()可用于设置地址范围的内存保护。所以有“setter”,但相关的“getter”是什么?

我问是因为一个新的漏洞利用已经浮出水面,CoReV for Copy Relocation Violation。基本上,在实例化进程时,可执行文件中引用的常量外部变量会在没有警告的情况下被强制重定位到可写内存段

一个邪恶的副本:装载机如何背叛你

对于常量部分,RO 映射将由加载程序“设置”。但是有了这个漏洞,有必要在运行时验证映射,这需要一个“getter”。