如何手动加载并执行 ELF 二进制可执行文件?

2024-05-06

假设二进制文件是PIC,如何将其加载到内存并执行入口点? 我这样做是为了熟悉 ELF 所以execve不允许。


这些是基本步骤:

  1. 阅读程序头以查找 LOAD 指令并确定您需要的映射的总长度(以页为单位)。
  2. 将最低地址的 LOAD 指令映射到总长度(可能大于文件长度),让mmap给你分配一个地址。这将保留连续的虚拟地址空间。
  3. 使用以下命令将剩余的 LOAD 指令映射到此映射的各个部分之上MAP_FIXED.
  4. 使用程序头来查找DYNAMIC向量,这将为您提供重定位向量的地址。
  5. 应用搬迁。假设您的二进制文件是静态链接的 PIE 二进制文件,它们应该完全包含RELATIVE重定位(只需添加基本加载地址),这意味着您不必执行任何符号查找或任何花哨的操作。
  6. 构造一个 ELF 程序入口堆栈,由堆栈上的数组中的以下系统字大小的值序列组成:

    ARGC ARGV[0] ARGV[1] ... ARGV[ARGC-1] 0 ENVIRON[0] ENVIRON[1] ... ENVIRON[N] 0 0
    
  7. (这一步需要ASM!)将堆栈指针指向该数组的开头并跳转到加载程序的入口点地址(可以在程序头中找到)。

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

如何手动加载并执行 ELF 二进制可执行文件? 的相关文章

随机推荐

  • 函数内的静态变量如何工作?

    在下面的代码中 int count static int n 5 n n 1 return n 变量n仅在第一次调用该函数时实例化一次 应该有一个标志或其他东西 所以它只初始化变量一次 我试图查看 gcc 生成的汇编代码 但没有任何线索 编
  • Amazon VPC NACL 默认规则评估顺序

    据我了解 NACL 网络访问控制列表 就是子网防火墙 我试图了解创建 NACL 时的默认值 规则 100 默认情况下允许来自所有 IP 的所有端口 否则 一切都被否定 那么 底线是 是全部允许还是全部拒绝 我知道根据 AWS 最佳实践 默认
  • 无法从表存储中获取记录

    我有一个表存储表 我想从中获取一些数据 插入和更新查询工作正常 但当我尝试选择一些记录时遇到问题 下面是我到目前为止所做的代码 class TransactionEntity TableEntity public String s get
  • Django 管理 GenericForeignKey 小部件

    我正在创建一个 Django 应用程序 其中所有模型都可以按照用户设置的顺序相互关联 我正在使用 GenericForeignKeys 设置所有这些 更重要的是 我需要能够支持这些类型的关系 管理的多个集合 因此 一个对象可以拥有多个相关对
  • 使用 NSMutableDictionary 与 NSMutableArray 造成的性能损失>

    我正在考虑使用 NSMutableDictionary 代替我当前的 NSMutableArray 这主要是出于 KVC KVO 的原因 该集合将在我的绘图方法的内循环中经历严重的变化 如果我继续进行此替换 性能是否会受到重大影响 干杯 道
  • @NumberFormat 注释不起作用

    试图在 JSP 中显示货币符号 但我没有看到它 我做了研究 但我只是不知道我还应该添加什么才能让它发挥作用 这就是我所拥有的
  • FindAndUpdate 如何检查文档是否真的更新

    想象一下以下模型 var Office id 1 name My Office branches adddress Some street that avenue isPrincipal true adddress Another addr
  • pandas 使用查询功能检查列是否为空

    我有 pandas 数据框 我想在它的查询函数上执行 isnull 或 not isnull 条件 如下所示 In 67 df data pd DataFrame a 1 20 None 40 50 In 68 df data Out 68
  • 如何更改 Kindle Fire 上 /mnt/SDcard 文件夹的读/写权限?

    我正在尝试在 Android 中开发 Amazon In app 为此 我从该网站下载示例代码https developer amazon com sdk in app purchasing sample code button click
  • PHP如何使用“ XML 中的实体与 DOMdocument

    我正在修改由其他库生成的 XML 文件的内容 我正在使用 PHP 5 3 10 进行一些 DOM 修改并重新插入替换节点 我正在使用的 XML 数据有 quot 在进行操作之前的元素 我想保留这些元素http www w3 org TR R
  • Unix cURL POST 使用文件中的内容到特定变量

    我已经搜索过这个答案 但没有找到任何有效或完全符合我的问题的答案 使用 Unix cURL 我需要将键 值对发布到服务器 密钥将是 MACs 换行符分隔的 MAC 地址文件的内容将是此 POST 的 VALUE 我试过了 curl d fi
  • 重写 .php 扩展名

    请问我该如何重写 有人可以重写这个网址吗 to http localhost display news cat 14 2 http localhost display news cat 14 2 谢谢 您可以使用 htaccess 文件来做
  • GitHub Actions 中的嵌套模板(从另一个 yaml 文件调用一个 yaml 文件)

    GitHub Action 是否支持嵌套模板 例如 以下是 Azure Pipeline yaml 的示例 其中调用另一个 yaml 文件 job BuildFunctions steps each func in parameters f
  • 在 Project Rider 中启用 c# 7 编译

    如果我将 LangVersion 设置为 7 则会出现以下错误 Error CS1617 Invalid option 7 for langversion must be ISO 1 ISO 2 Default or an integer
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 如何使用 Google Direction api 或 iPhone 应用程序的其他一些 api 比较两条路线

    我想比较两条路线以检查它们在我的 iPhone 应用程序中是否相同 有一个人X想要从A点到B点 另一个人想要从A1点到B1点 我可以使用谷歌的方向 API 获取 A 到 B 之间的路线 http maps googleapis com ma
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • 如何访问 Rails 4 模型中的 polymorphic_path?

    很简单 我想用polymorphic pathRails 4 模型中的方法 是的 我知道关注点分离很差 我知道Rails application routes url helpers but polymorphic path不在那里 尝试也
  • 在gradle c++项目中配置C++标准?

    我有一个由以下构建脚本定义的 gradle 项目 build gradle plugins id cpp application application targetMachines add machines linux x86 64 ta
  • 如何手动加载并执行 ELF 二进制可执行文件?

    假设二进制文件是PIC 如何将其加载到内存并执行入口点 我这样做是为了熟悉 ELF 所以execve不允许 这些是基本步骤 阅读程序头以查找 LOAD 指令并确定您需要的映射的总长度 以页为单位 将最低地址的 LOAD 指令映射到总长度 可