ELF Relocation逆向工程

2024-03-14

我希望你们能帮助我理解重定位条目和 ELF 部分数据是如何关联的,以及它们是如何处理和生成的。

我有一个古老的不受支持的工具,它采用 ELF 文件和相关的 PLF 文件(部分链接文件,在构建过程的早期生成),并从中构建一个自定义可重定位文件,该文件在内存限制严格的平台 (PPC) 上使用。这工作得很好,除了它包含大约一兆我们要在启动后卸载的初始化代码。因此,我们将所有初始化代码放在自定义部分中以便卸载它,但不幸的是,该工具无法正确处理自定义部分并且 rel 文件无效。因此,我的任务是制作一个新工具,可以正确生成此可重定位文件,其中包含自定义部分。

我已经使用这个工具并生成了 rel 文件,但目前陷入困境,试图弄清楚如何处理部分数据并构建重定位条目等。我是一名高级程序员,摆脱了我的束缚。这个任务的元素,所以所有这些逆向工程业务对我来说都是新的(感谢上帝的互联网!)。

I found 精灵夏普 http://antmicro.com/projects/elfsharp/index.shtml并以此为起点。它允许我加载 ELF 和 PLF 文件并与其内容进行交互。从那里,我对重定位文件的标头和内容的大部分进行了逆向工程,但它远非准确。当我将旧工具的文件版本与我的文件版本进行比较时,我发现一些部分数据已被修复,而我的文件使用直接来自 PLF 文件的部分数据并且是简单的。我的意思是我复制的部分数据包含大量“48 00 00 01”,但这些都是由旧工具以某种方式修复的。这些字节的意义是什么?对它们做了什么?我还必须生成重定位条目,但不确定如何继续。

我在网上找到了一些处理精灵重定位的示例,并且我的工具中也有类似的东西,但我仍然不清楚我到底应该做什么。我有一个关于所有重定位类型及其公式的良好资源(第 4.12.5 章)here https://www.power.org/wp-content/uploads/2012/07/Power-Arch-32-bit-ABI-supp-1.0-Embedded.pdf),但我仍然不太确定我应该使用什么偏移量、部分信息等。

TL;DR

  • 您能帮我想象一下这些重定位条目到底发生了什么,它是如何生成和处理的,以及在程序执行时如何使用它的吗?

  • 对段数据中的所有“48 00 00 01”字做了什么?我假设它们已经用适当的符号解决了,但是这是如何完成的呢?使用.rela 信息?

  • 另外,我不确定何时应该使用 PLF 内容以及何时应该使用 ELF 内容。我想我只需要ELF来获取加载地址和段信息。

  • 当我生成重定位修正(在 PPC 上)时,如何准确评估重定位类型方程?我在网上提到的例子在这一点上并不直观。我对偏移量感到困惑 - 您从 Elf32_Rela 获得了一个偏移量,但这就是您修改的偏移量吗?用于记录修复结果的偏移量是多少?加数到底是什么?我在网上没有找到任何有启发性的东西。

  • 一些(实际上是大多数)重定位修复指向几个 .debug_ 之一*部分或.bss。我应该跳过 .debug 修复还是这些修复很重要? .bss 是 NoBits 部分,那么我该如何处理呢?当涉及到实际生成重定位条目时,我了解它们是如何构造的,但实际上是谁/什么在制作这些条目?我的意思是,我已经准备好构建它,但我不知道从哪里开始 - 我是否要在某个地方迭代一些数据或者什么?

  • 还有其他我应该问但尚未意识到的问题吗? ;)

感谢您阅读我的冗长问题!


也许 objconv 工具可以提供帮助。它可以将 x86 ELF 文件中的重定位类型显示为转储或反汇编。http://www.agner.org/optimize/#objconv http://www.agner.org/optimize/#objconv

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

ELF Relocation逆向工程 的相关文章

  • 解析没有 .proto 文件的 Protocol-Buffers

    作为安全项目的一部分 我正在对 Android 应用程序进行逆向工程 我的第一步是发现应用程序和服务器之间交换的协议 我发现正在使用的协议是协议缓冲区 鉴于 protobuf 的性质 需要原始 proto 文件才能反序列化 protobuf
  • -fPIC 仅适用于共享库吗?

    I know fPIC对于共享库是必要的并且知道为什么 不过 我对这个问题并不清楚 Should fPIC在构建可执行文件或静态库期间永远不会使用 Should fPIC在构建可执行文件或静态库期间永远不会使用 从不是一个很强烈的词 上面的
  • 在加载的 ELF(.so 共享库)中挂钩并替换导出函数

    我正在编写一些 C 代码来将 so ELF 共享库 的某些函数加载到内存中 我的 C 代码应该能够重定向另一个加载到应用程序 程序内存中的 so 库的导出函数 这里有一些详细说明 Android 应用程序将加载多个 so 文件 我的 C 代
  • 您将如何对此进行逆向工程?

    我有一些代码位于 javascript 中的 php 文件的底部 它经历了很多奇怪的扭曲 比如将十六进制转换为 ascii 然后进行正则表达式替换 执行代码等等 有没有办法在它实际执行之前找出它正在执行的内容 代码在这里 http past
  • 如何使 GCC 将 .text 部分编译为 ELF 二进制文件中的可写部分?

    我希望能够动态更改我正在使用的库中的可执行代码 本质上 我想动态地 NOP 掉某些不需要的函数 但是 我正在使用的库的 text 部分是不可写的 大多数程序都是如此 我有该库的源代码 因此想使用 GCC 将其编译为可写 有没有办法做到这一点
  • 从给定的 x86 程序集编写 C 函数

    我正在尝试对这个神秘的函数进行逆向工程 该函数返回一个整数并接受一个结构节点作为参数 include mystery h int mystery struct e4 struct s 头文件是一个简单的结构体声明 struct my str
  • 将自定义菜单项添加到 Finder 上下文菜单

    如何将自定义菜单项添加到 Finder 中文件的上下文菜单 不幸的是 Internet 和 Stack Overflow 上的大多数信息在 10 6 中不起作用或者太有限 例如 Automator 不允许您动态创建项目或创建子菜单 我知道仍
  • RSA 身份验证代理 API 文档中的函数签名是否正确?

    我有一些使用 RSA 身份验证代理记录的 API 的软件 该产品作为服务在域中的客户端计算机上运行 并通过与集中安装的 RSA 身份验证管理器 通信来对本地用户进行身份验证 身份验证代理的 API 公开记录在此处 适用于 C 开发人员指南的
  • Linux 上 C 语言中字符数组和指针的分段错误

    所以我有以下程序 int main char one computer char two another two 1 b one 1 b return 0 它在 one 1 b 行上出现段错误 这是有道理的 因为指针 one 指向的内存必须
  • JNZ 和 CMP 组装说明

    如果我错了请纠正我 这是我的理解JNZ and CMP JNZ 跳跃将会发生 如果Z标志不为零 1 CMP 如果两个值相等 则Z标志已设置 1 否则未设置 0 这是我正在看的 Flash 教程 它正在教授一个简单的 CrackMe 的解决方
  • 从现有数据库自动生成 JHipster 实体

    作为 JHispster 2 11 0 的一部分 实体配置保存在 jhipster 目录中的特定 json 文件中 这些文件可用于使用以下命令在 JHipster 应用程序中重新生成实体和相关文件 哟 jhipster 实体 ENTITY
  • 读取 ELF 部分的内容(以编程方式)

    我正在尝试检索 ELF 二进制文件中附加部分的内容 此时 我使用以下代码来检索每个部分的名称 include
  • 保护 .NET 代码免遭逆向工程?

    混淆是一种方法 但它不能防止破坏应用程序的盗版保护安全 如何确保应用程序不被篡改 如何确保注册机制无法被逆向工程 还可以将 C 应用程序转换为本机代码 并且Xenocode http en wikipedia org wiki Spoon
  • 在运行时访问 build-id

    我试图弄清楚如何访问链接器在运行时生成的构建 ID 从这个页面开始 https linux die net man 1 ld https linux die net man 1 ld 当我构建一个测试程序时 例如 gcc test c o
  • 加载linux内核的基地址

    我对内核如何加载到内存有一些疑问 检查后 proc kallsyms我能够找到内核中各种符号的地址 cat proc kallsyms head n 10 00000000 t vectors start 80008240 T asm do
  • 断点改变程序流程

    我正在尝试分析和逆向我拥有的 Objective C 程序 我通过手动更改一些操作码对可执行文件进行了一些修改 然而 当我测试修改后的软件时 我得到 死亡人数 9 没关系 我想我触碰了不该触碰的东西 我当时就推出了gdb myprogram
  • 无法拦截Android应用程序的流量

    最近 我正在尝试测试和拦截来自开发的应用程序的流量罗莫比尔 我设置了一个代理burp 当然 我已经在我的设备上安装了 burp 证书 因此我可以拦截设备上的其他应用程序 但我无法在 burp suite 上看到相关应用程序的流量 相反 该应
  • 为什么 objdump 不显示 .bss、.shstratab、.symtab 和 .strtab 部分?

    我目前正在用 C 语言实现我自己的 objdump 实现 For my s选项 我必须显示 ELF 文件各部分的完整内容 我做得很好 但我显示的部分比 真正的 objdump 更多 事实上 它并没有输出 bss shstrtab symta
  • 无法在 Apple Calendar 中绑定()套接字(dylib 注入)

    我正在尝试检查 iOS 8 1苹果日历 MobileCal app on Reveal http www revealapp com下列的本指南 http petersteinberger com blog 2013 how to insp
  • 加载器如何引用共享库中的变量?

    我现在了解如何通过过程链接表引用动态函数 如下所示 Dump of assembler code for function foo plt 0x0000000000400528

随机推荐

  • 您可以使用 Python 正则表达式从偏移量开始向后搜索吗?

    给定一个字符串以及该字符串中的字符偏移量 我可以使用 Python 正则表达式向后搜索吗 我试图解决的实际问题是在字符串中的特定偏移量处获取匹配短语 但我必须匹配该偏移量之前的第一个实例 在我的正则表达式只有一个符号长 例如 单词边界 的情
  • Android 抛出 IndexOutOfBound 异常

    我制作了一个Android应用程序 因为数据来自服务器 所以这是一个耗时的过程 所以我创建了一个进度对话框 下面是我的代码 Override protected void onResume super onResume if placesL
  • JQuery UI 删除类动画似乎不起作用

    我正在使用一系列 CSS3 转换 但对于较旧的机器 通过使用 JQuery UI 添加和删除类进行备份 JQuery UI addClass 动画功能齐全 然而 JQuery UI removeClass 并没有设置动画 而是延迟动画时间
  • 读取 SML 中的命令行参数

    我正在尝试读取输入文件的名称 argv 1 这是我到目前为止所做的 val args CommandLine arguments val x y args val agora x 但我不断收到此错误消息 uncaught exception
  • Magento - 从选项值 ID 获取自定义选项值详细信息

    我有一些与产品自定义选项相关的有趣问题 选项和自定义选项之间有什么区别吗 这是因为我在几乎所有与产品相关的模块中为每个产品详细信息找到了两个不同的属性 options custom options 然而 只有一个类只适用于产品选项 它倾向于
  • Respond.JS 在 IE 8 中不工作

    由于某种原因 响应 JS 似乎不起作用 我正在使用 IE 8 中的媒体查询来更改各种尺寸显示器的背景图像 在 IE 8 中没有背景 只有纯色 代码如下所示 媒体查询如下所示 media min width 769px and max wid
  • 如何向 JButton 添加行数未知的多行文本? (动态)[重复]

    这个问题在这里已经有答案了 如何在a上制作文字JButton多行 我读到大多数人都使用 HTML 但是当它是动态的并且您不知道行的大 小或行是什么时会发生什么 现在我按钮上的文本以 而不是创建一条新线 大多数其他方法假设您知道该字符串并且是
  • 线程通过 sysfs 调用内核信号量时出现死锁

    源自这个问题 https stackoverflow com q 17391276 912144 and 我的解决方案 https stackoverflow com a 17443774 912144 我开始意识到可能存在僵局 但我不明白
  • 如何在 ASP.NET Core 应用程序中显示和更新自定义身份字段?

    我使用创建了一个 ASP NET Core 应用程序core 3 1我已经包含了开箱即用的身份验证 我想添加一些自定义字段供我的用户完成 例如Location and Instagram 继此处说明 https learn microsof
  • Cocoa 自定义通知示例

    有人可以向我展示一个带有自定义通知的 Cocoa Obj C 对象的示例吗 如何触发它 订阅它并处理它 implementation MyObject Posts a MyNotification message whenever call
  • objectForKey 和 valueForKey 之间的区别?

    有什么区别objectForKey and valueForKey 我在文档中查找了它们 它们对我来说似乎是一样的 objectForKey is an NSDictionary方法 一个NSDictionary是一个类似于集合类NSArr
  • 在 Next.js 中,如何创建“模态链接”(即更改 URL 并添加组件但不重新渲染整个页面的链接)

    当一个站点有一个对话框时 它通常纯粹用 JS 完成 不涉及 页面 即路由 但是 有时您希望对话框有自己的 URL 以便在用户刷新页面时 他们会返回到对话框打开的页面 在 Next js 中 我已经完成了上述大部分工作 我有一个基本页面路由
  • Xcode 找不到 C++ 静态库

    所以我之前遇到过一些问题 但我删除了我的旧问题并将其更新为这个问题 事情是这样的 我想在我的 iOS Swift 项目中使用 C 库 在这个社区的帮助下 我将我的库编译为静态库 a 文件 现在我创建了一个新项目来测试这一点 我只执行了以下步
  • tkinter 复制粘贴到条目不会删除选定的文本

    当我复制一些文本并将其粘贴 ctrl v 到 tkinter Entry 中时 如果有选定的文本 它不会将其从条目中删除 我使用的是 Linux Mint 64 位 Here I copy d with ctrl c Then I sele
  • 用最新的非 NA 值替换 NA

    In a data frame or data table 我想用最接近的先前非 NA 值 向前填充 NA 一个简单的例子 使用向量 而不是data frame 如下 gt y lt c NA 2 2 NA NA 3 NA 4 NA NA
  • 访问错误 2501:OutputTo 操作已取消。从系统帐户运行

    我在使用 Microsoft Access 2010 时遇到问题 我有一个报告模块 可以将报告打印到打印机或文件 报告可以是用户请求的 也可以是自动打印的 用户请求从登录用户的桌面运行报告 自动打印是由我的 Windows 服务启动的 我们
  • 部署到 HoloLens 时在 VS17 中找不到 SDK“WindowsMo​​bile,版本=10.0.18362.0”错误

    I m new to HoloLens and Microsoft s ecosystem and am following this tutorial https learn microsoft com en us windows mix
  • 如何在 Laravel 中定义默认后备路由?

    我目前正在将自定义 CMS 从 Laravel 3 升级到 Laravel 4 由于各种原因 此升级很重要 在现有版本中 它设置了路由 以便可以单独定义路由 但如果有人尝试加载未明确定义的路由 系统会捕获它并将其发送到 页面处理器 这本质上
  • 在 html 页面内的 google 图表表中嵌入折线图

    I have a table taken from google charts and a line chart also taken from there and I want to embed it inside the table I
  • ELF Relocation逆向工程

    我希望你们能帮助我理解重定位条目和 ELF 部分数据是如何关联的 以及它们是如何处理和生成的 我有一个古老的不受支持的工具 它采用 ELF 文件和相关的 PLF 文件 部分链接文件 在构建过程的早期生成 并从中构建一个自定义可重定位文件 该