我可以执行驻留在数据段(ELF 二进制)中的代码吗?

2024-04-06

在理解二进制文件(虚拟内存布局、执行...等)的方式中,我写了一个C声明一个全局字符串的代码,其中包含可执行代码的字节,然后我覆盖了返回地址main()通过声明一个指针(PTR) in main()这是保留在堆栈上的本地内存区域,距离返回地址较远 2 个字main(),所以我所做的就是将返回地址的地址分配给该指针(PTR=(int*)&PTR+2)然后用可执行代码的地址(静态字符串)覆盖该地址的内容。

现在的困境是,每当我编译并执行时,我都会收到一个分段故障。 可执行代码不占用内存input/output(它只是一堆NOPs).

使用 GDB,我确保该过程完美运行:返回地址更改为字符串的地址,但返回从未发生。

我所知道的是可执行代码被映射到虚拟内存中标记的页面RW (.data & .bss段)所以也许没有办法执行这样的代码,除非代码被注入到executable内存区域(标记的页面RE)。这就是我关于这个主题的理论,我邀请您提供更多细节。

char code[]="\x90\x90\x90\x90\x90\x90\x90\x90"; //a static string contains executable code

int main()
{
int *return_address; //Pointer to the return address - uninitialized
return_address = (int *)&return_address + 2; //Initializing the return address - according to stack layout
(*return_address) = (int)code; //Overwriting the return address with the code's address
}

我收到分段错误。

它是数据执行预防的硬件控制(https://en.wikipedia.org/wiki/Executable_space_protection#Linux https://en.wikipedia.org/wiki/Executable_space_protection#Linux) - 如果页表中没有设置“x”(执行)位,则不能直接跳转到数据页。所有位的内存映射都列在/proc/$pid/maps / /proc/$pid/smaps文件为“rwx”表示可写代码,“rw-”表示不执行的数据,“r--”表示只读数据,“r-x”表示普通代码。

如果你想执行数据,你应该调用mprotect系统调用与PROT_EXEC标记想要成为代码的数据部分。

在 x86 世界中,这完全实现为“NX位”/“XD位”功能 https://en.wikipedia.org/wiki/NX_bitPentium 4 (Prescott) 及更新版本(Core、Core2、Core i*、core m)/Athlon 64 / Opteron 及更新版本。如果操作系统工作在32位模式,则必须打开PAE才能在页表中包含该位。在 x86_64 模式(64 位)中,始终支持 NX/XD 位。

第一个支持变体在 2004 年左右被添加到 Linux 中:http://linuxgazette.net/107/pramode.html http://linuxgazette.net/107/pramode.html

在 2007 年,您可能拥有过时的硬件、旧的内核或没有 PAE 的 32 位模式内核。

有关 NX/XD 钻头的信息:https://en.wikipedia.org/wiki/NX_bit https://en.wikipedia.org/wiki/NX_bit

有时'rwx'模式可能被禁止,检查https://en.wikipedia.org/wiki/W^X https://en.wikipedia.org/wiki/W%5EX.

对于 NX 之前的系统,有基于 x86 段寄存器的解决方案来部分禁用部分内存空间的执行。

我可以在没有分段错误的情况下执行上面的程序吗?

你可以:

  • 通过调用使数据页可执行mprotect其上与PROT_READ|PROT_EXEC
  • 将elf文件的数据段标记为可执行文件(需要深入内部ld脚本 - 默认位于ld --verbose)
  • 使所有页面包括.data和堆可执行文件(不仅仅是堆栈)
    与 ld 或 gcc-z execstack
  • 将 shellcode 移动到 elf 文件的文本数据中
  • 尝试禁用内核中的 nx/xd 位(困难;可能需要重新编译)
  • 使用未启用 PAE 选项(构建时间选项)的 32 位操作系统(内核)。
  • 使用没有 NX/XD 的旧 CPU
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以执行驻留在数据段(ELF 二进制)中的代码吗? 的相关文章

  • 将 Stream 反序列化为 List 或任何其他类型

    尝试将流反序列化为List
  • 获取 std::variant 当前持有的 typeid(如 boost::variant type())

    我已经从 boost variant 迁移到 std variant 但遇到了障碍 我在 boost type 中使用了一个很好的函数 它可以让你获取当前持有的 typeid 看https www boost org doc libs 1
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • Qt 计算和比较密码哈希

    目前正在 Qt 中为测验程序构建面向 Web 的身份验证服务 据我了解 在数据库中存储用户密码时 必须对其进行隐藏 以防落入坏人之手 流行的方法似乎是添加的过程Salt https en wikipedia org wiki Salt cr
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 如何使用 wpf webbrowser 将数据发布到 Web 服务器

    我想从数据库获取数据并使用它来让用户登录到网站 我有一个包含 Web 浏览器控件的 wpf 页面 我有这样的代码 用于将用户登录到用 php 编写的网站
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • 无法加载文件或程序集“EntityFramework,版本=6.0.0.0”

    我究竟做错了什么 我该如何解决这个问题 我有一个包含多个项目的解决方案 它是一个 MVC NET 4 5 Web 应用程序 在调试模式下启动后调用其中一个项目时 出现此错误 导致此错误的项目具有以下参考 两个都是版本6 0 0 0 应用程序
  • 格式化货币

    在下面的示例中 逗号是小数点分隔符 我有这个 125456 89 我想要这个 125 456 89 其他示例 23456789 89 gt 23 456 789 89 Thanks 看看这个例子 double value 12345 678
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • 使用 AdHocWorkspace 会导致“不支持语言‘C#’”。

    在VS2015中使用Microsoft CodeAnalysis CSharp Workspaces的RC2 这段代码会抛出异常 var tree CSharpSyntaxTree ParseText var workspace new A
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 如何获取 QIcon 的文件/资源​​路径

    假设我做了这样的事情 QIcon myIcon resources icon ico 我稍后如何确定该图标的路径 例如 QString path myIcon getPath 问题是 没有getPath 会员 我找不到类似的东西 但肯定有办
  • 在 C++ 和 Windows 中使用 XmlRpc

    我需要在 Windows 平台上使用 C 中的 XmlRpc 尽管我的朋友向我保证 XmlRpc 是一种 广泛可用的标准技术 但可用的库并不多 事实上 我只找到一个库可以在 Windows 上执行此操作 另外一个库声称 您必须做很多工作才能
  • 使用 Chrome 和 Selenium 设置 LocalStorage

    我正在尝试使用 OpenQA Selenium 和 Chrome 设置本地存储键和值 我认为这相当微不足道 但我似乎无法让它发挥作用 我对 C 很陌生 所以我可能错过了一些东西 无论如何 我有这个功能 public static void
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t

随机推荐