如何对系统调用 brk 进行二进制检测? (x86-64 Linux)(也许是 valgrind?)

2024-01-31

我想用仪器syscall brk http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html(和其他电话,但这是第一顺序,这对我来说最重要)给定二进制(最好是在实际的系统调用/系统输入级别(x86-64 和 x86)sys_brk http://lxr.linux.no/#linux+v3.4.3/include/linux/syscalls.h#L455 call).

主要目标:

  • 沙箱的一部分,它提供固定值被监禁进程的内存
  • 所以,我想摆脱brk http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html系统调用(最好是下一个顺序的其他调用)并模拟内存分配固定限额. 固定限额是可用于编程的内存空间。 (你可以把它想象成制作一种具有固定可用内存量的沙箱)

如何实施(其中之一)一些示例可能的解决方案(或您的解决方案):

  • 只是将指令更改为NOP http://en.wikipedia.org/wiki/NOP
  • As brk成功时返回 0,通过设置内存(寄存器)状态的设置操作来模拟它的成功,如下brk http://www.kernel.org/doc/man-pages/online/pages/man2/brk.2.html将被成功调用。
  • 更复杂...带有代码(或函数调用)的工具,可在固定限制下模拟成功的内存分配。
  • 最灵活(在我的情况下可能有点过分)将此系统调用更改为函数调用并将提供的函数添加到二进制文件。

给定二进制是可能以两种(最好是两种:))形式之一构成恶意的代码:

  • 共享库 - 在这里我可以在函数调用之前设置环境(例如以受控方式进行 brk 调用)
  • 程序二进制 - 在这种情况下我们需要给出程序固定值内存(由调用者或在程序“一个系统调用”开始时),导致它无法分配。调用此类程序的示例应包含在答案中。

由于问题与许多其他方面密切相关,我尽力将其作为问题分开,但如果我应该或多或少地指定一些内容,请给我建议。

欢迎提供实施答案、资源链接(书籍、教程)。

(我最感兴趣的是Linux,解决方案是reliable,这样人们准备二进制文件,即使是在汇编程序中,也不必担心代码的执行)


LD_PRELOAD 将捕获对 brk() 的 C 调用,但不会捕获实际的系统调用(int/syscall 指令)。没有可移植的方法来捕获这些,但在 Linux 上,ptrace http://www.linuxjournal.com/article/6100会做的。内存也可以通过 mmap() 分配给程序,因此您也需要拦截该调用。

当然,您真正想要的似乎是rlimit http://linux.die.net/man/2/setrlimit().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对系统调用 brk 进行二进制检测? (x86-64 Linux)(也许是 valgrind?) 的相关文章

  • 使用 pthread_create 时出现 valgrind 内存泄漏错误

    我正在使用 pthread 库编写一个程序 当我使用命令运行程序时valgrind leak check full 我得到以下错误描述 11784 11784 HEAP SUMMARY 11784 in use at exit 4 952
  • retq 和 ret 有什么区别?

    让我们考虑以下程序 它计算参数的无符号平方 global foo text foo mov rdi rax mul rdi ret 这是正确编译的as 但反汇编为 0000000000000000
  • 用于分析 Node.js 核心转储的工具 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 如果我使用 gcore 制作 Node js 进程的代码转储 分析它的最佳工具是什么 灵感来自 jav
  • 将 32 位和 64 位代码链接到一个二进制文件中

    在对此问题的评论中 内核空间 C 代码中简单指针算术的意外行为 https stackoverflow com questions 49470691 unexpected behaviour in simple pointer arithm
  • 从信号处理程序返回而不进入内核+用户空间中断

    这是我的旧问题的后续 通过 setcontext 从信号处理程序返回 https stackoverflow com questions 69237910 returning from a signal handler via setcon
  • 汇编程序中的重定位截断错误

    我对汇编语言完全陌生 我尝试编写简单的程序来破译凯撒密码 问题是链接后我收到以下错误 cezar o In function loop text 0xbf relocation truncated to fit R X86 64 8 aga
  • bash 是否存在内存泄漏?

    我在跑bashv4 4 19 1 在 Ubuntu 18 10 上发布 如果我跑valgrind在一个简单的脚本上 或者甚至bash version 我发现我确实丢失了 12 个字节的内存 但仍然可以访问大约 46kB 的内存 仍然可访问的
  • 如何从 SQLAlchemy 映射对象中发现表属性

    我有一个与表映射的类 在我的例子中是以声明的方式 我想从这个类中 发现 表属性 列 名称 关系 engine create engine sqlite databasePath echo True setting up root class
  • Valgrind 自动测试——它们在什么地方使用过吗?

    您认为基于 valgrind 工具套件运行一组自动测试有意义吗 您听说过或看到过这样的设置吗 这样的设置可以执行哪些自动 不受人类直觉影响 操作 如果您在单元测试或最终构建测试中检查内存问题 错误代码 那么这是有意义的 可能有两种方法 编写
  • 使用 gdb 调试时彻底退出 valgrind

    我正在使用 valgrind 和 gdb 调试程序 然而 我以一种野蛮的方式终止了这些调试会话 这真的是它应该做的吗 设置调试会话 按照来自的指示valgrind 官方网站 http valgrind org docs manual man
  • 在长模式下更改 GDT 并更新 CS

    我正在编写一个简单的自制 64 位操作系统 通过 UEFI 启动它 这意味着当我的代码开始执行时 它已经处于长模式 并且启用了分页 现在 退出 UEFI 引导服务后 我想用我自己的控制结构替换 UEFI 构建的所有控制结构 成功更改 CR3
  • 如何让我的用户脚本也在隔离沙箱和 unsafeWindow 中执行代码?

    对于我的用户脚本中的大部分代码 我需要使用unsafeWindow对于我的脚本执行的网站 我通过使用来做到这一点 grant unsafeWindow 但是 我的一些代码无法执行unsafeWindow并且需要在 Tampermonkey
  • 安全沙箱违规

    运行我的 Flash 应用程序时出现以下错误 违反安全沙箱 与 rtmp system ip live 的连接已停止 不允许从 file F Flash 工作 RTS RT vlab BIOTECH NEO 简单神经元的被动属性 vi 特征
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • 从 NASM 调用 C 函数 _printf 会导致分段错误

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • 如何将输入传递到扩展汇编中?

    考虑这段代码 来自我的先前的问题 https stackoverflow com questions 37955538 segfault on movq instruction int main asm movq 100000000 rcx
  • 将 PayPal 返回 URL 设置为 localhost

    我正在尝试集成 Paypal 并且在此过程中使用沙箱 我按照以下问题中接受的答案的步骤进行操作 设置 PayPal 返回 URL 并使其自动返回 https stackoverflow com questions 7642895 setti
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写

随机推荐