在剥离的 ELF 可执行文件中设置断点

2024-03-04

我有一个 ELF 32 位动态链接、剥离文件,我希望对其进行调试。尝试在某个地址设置断点时,出现一条消息,提示符号表未加载。

我的问题是:

  1. 当你说 ELF 文件是stripped究竟发生了什么?
  2. 如何剥离 ELF 文件?
  3. 是否可以以某种方式重建符号表?
  4. 是否无法在 gdb 中对剥离的可执行文件设置断点?

剥离 ELF 是使用 gnu binutils 工具 strip 完成的,来自 strip 手册页:

GNU strip 丢弃所有符号 目标文件 objfile.名单 目标文件可能包括档案。在 必须至少给出一个目标文件。

当你说 ELF 文件被剥离时到底发生了什么?

剥离会从二进制文件中删除不必要的信息。这可能只是调试数据或未导出的符号。

如何剥离 ELF 文件?

您可以使用 strip 来剥离二进制文件strip -s yourLittleBinary- 这将用精简版本替换该文件。选项-s告诉 strip 删除所有符号。 Strip 可以通过多种方式进行操作。再次,从它的手册页:

   -R sectionname
   --remove-section=sectionname
       Remove any section named sectionname from the output file. 

这 选项可能会被多次给出。请注意,使用此 选项 不当可能会导致输出文件无法使用。

   -s
   --strip-all
       Remove all symbols.

   -g
   -S
   -d
   --strip-debug
       Remove debugging symbols only.

   --strip-unneeded
       Remove all symbols that are not needed for relocation processing.

是否可以以某种方式重建符号表?

据我所知,这是不可能的。然而,可以在剥离之前从可执行文件创建一种映射文件,以便保留调试所需的信息。

是否无法在 gdb 中对剥离的可执行文件设置断点?

有可能的。它只是一个可执行文件 - 去掉了它的符号名称。然而,由于没有符号,唯一剩下的就是在特定地址处设置断点(除了为您提供地址 名称映射的映射文件之外)。但是,您可以在相关可执行文件使用的共享库的任何函数处设置断点。

在地图文件上

您可以使用以下命令从可执行文件创建映射文件nm公用事业:

nm -Cn myLittleExecutable > myLittleExecutable.map

这将转储所有符号、C++ 分解(选项 -C)并按数字排序(选项 -n)。

Links

这可能会给你一些想法:http://www.linuxsa.org.au/meetings/reveng-0.2.pdf http://www.linuxsa.org.au/meetings/reveng-0.2.pdf
GNU binutils 文档:http://sourceware.org/binutils/docs-2.21/binutils/index.html http://sourceware.org/binutils/docs-2.21/binutils/index.html
GDB文档:http://www.gnu.org/software/gdb/documentation/ http://www.gnu.org/software/gdb/documentation/

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

在剥离的 ELF 可执行文件中设置断点 的相关文章

  • 如何判断共享库加载到进程地址空间中的位置?

    我正在尝试调试一个共享库 其中有使用 gdb 的源代码和调试符号 我没有实际使用此共享库的进程的调试符号或代码 我自己编译它 所以我可以拥有一切 但生成的二进制文件被剥离 以模拟我没有代码的情况 该进程打印我正在尝试调试的目标函数 foo
  • 如何使用gdb来探索堆栈/堆?

    谁能给我一个快速概述 给我指出一种检查 C 程序堆栈 和堆 的方法的文档 我认为这应该用 GDB 来完成 但如果有其他更直接的替代方案 那么也应该没问题 Thanks 您可以使用 x 命令转储原始内存 因此 如果您想查看堆栈或堆的位 请尝试
  • 用于 RHEL 的 gdb-multiarch

    我正在尝试寻找方法来运行gdb 多架构RHEL 中的命令 我已经安装了用于 ARM 处理的 QEMU 模拟器 我想安装GDB进行调试 我能够安装GDB 多体系结构在 Ubuntu 中运行命令成功 sudo apt get GDB multi
  • 为什么 Linux/gnu 链接器选择地址 0x400000?

    我正在 Linux x86 64 上试验 ELF 可执行文件和 gnu 工具链 我已经链接并剥离 手动 Hello World 测试 global start text start mov 1 rax 转换为 267 字节 ELF64 可执
  • Google crashpad 上的一个交叉编译平台应用程序。 Ubuntu 中无法读取 dmp 文件

    我有一个小qt项目 https github com apalomer qt crashpad test我想跟踪一个分段错误 这是一个示例 分段错误是出于测试目的而手动添加的 在实际项目中我不知道留在那里的分段错误 我决定使用 google
  • 在运行时从应用程序读取调试信息

    除了调试之外 我还有一些关于调试符号以及可以用它们做什么的问题 我最感兴趣的是有关 GCC 的答案 但我也很高兴知道它在其他编译器 包括 MSVC 下的样子 首先 调试符号的常见格式 类型有哪些 它们与编译器和平台有何关系 GCC 和 Mi
  • 使用 gdb 调试时彻底退出 valgrind

    我正在使用 valgrind 和 gdb 调试程序 然而 我以一种野蛮的方式终止了这些调试会话 这真的是它应该做的吗 设置调试会话 按照来自的指示valgrind 官方网站 http valgrind org docs manual man
  • 如何在Intellij IDEA中的Hibernate中使用逆向工程进行ORM?

    我有 100 个表 其中大多数平均有 40 50 个字段 有些表有 5 6 个字段 因此我可以轻松地使用 DB 进行对象关系映射 但是我有很多表和字段 所以是否可以在 Intellij IDEA 中使用逆向工程创建 ORM 如果是的话该怎么
  • 符号查找错误未定义符号,但所有符号似乎都存在

    可执行文件似乎无法解析链接库中的符号 LD DEBUG libs 的相关输出表明加载了正确的库 6557 usr lib libcharon so 0 error symbol lookup error undefined symbol a
  • 如何对加密算法进行逆向工程?

    我编写了一个以这种方式加密文本的应用程序 获取输入文本 反转文本 转换为十六进制 用密钥进行异或 Base64编码 现在 我自己没有做很多加密 编码 所以我的问题可能听起来很愚蠢 但是 假设我得到一个包含上述算法内容的文件 而我不知道这个算
  • 如何在 gdb 中禁用“键入 继续,或 q 退出”?

    我想要自动化gdb 并且等待用户输入是不可取的 如何禁用消息 Type
  • 为什么 objdump 不显示 .bss、.shstratab、.symtab 和 .strtab 部分?

    我目前正在用 C 语言实现我自己的 objdump 实现 For my s选项 我必须显示 ELF 文件各部分的完整内容 我做得很好 但我显示的部分比 真正的 objdump 更多 事实上 它并没有输出 bss shstrtab symta
  • 将静态链接的 elf 二进制文件转换为动态链接的

    我有一个 elf 二进制文件 它已静态链接到 libc 我无权访问其 C 代码 我想使用 OpenOnload 库 它在用户空间中实现了套接字 因此与标准 libc 版本相比提供了更低的延迟 OpenOnload 实现标准套接字 api 并
  • 测试是否定义了 gdb 便利变量

    有没有办法测试 gdb 中是否设置了便利变量 例如 gdb if exitcode 0 gt quit gt end Invalid type combination in equality test gdb p exitcode 1 vo
  • 如何确定使用哪个框架来构建特定的 Windows 桌面应用程序?

    如何确定使用哪个平台或编程语言来构建特定的 Windows 桌面应用程序 有多种方法可以尝试检测特定软件是用哪种语言编写的 通常 执行检查的工具PE标头 http en wikipedia org wiki Portable Executa
  • 基于已知 XSL 对未知 XML 进行逆向工程

    Solved 在遵循 Matti 的建议后 我删除了自定义函数 一切都很好 原帖 截至今天 我还是 XSLT 的新手 所以我确信这对你们中的许多人来说是理所当然的 无论如何 我的任务是使用第三方供应商提供的数据为我公司的网站创建一个小部件
  • 修改编译共享库中符号的可见性

    我的项目依赖于一个第三方库 该库导出了更多应有的符号 其中一些符号被其他库和主程序无意地覆盖 如何更改已编译共享对象的函数和变量的可见性 如何更改已编译共享对象的函数和变量的可见性 您可以通过修改动态符号部分来更改符号的可见性 dynsym
  • 如何从 JW Player 5.1 中提取 .flv 流?

    问题是我的互联网连接速度很慢 并且视频不像 YouTube 那样缓冲 因此我想知道是否可以提取 JW Player 中正在流式传输的 flv 文件的 url 并直接下载它 做了一些初步研究 我发现了以下信息 主要视频网址 http ijf1
  • gcc 中 -g 选项的作用是什么

    我看到很多关于 gdb 的教程要求在编译 c 程序时使用 g 选项 我无法理解 g 选项的实际作用 它使编译器将调试信息添加到生成的二进制文件中 此信息允许调试器将代码中的指令与源代码文件和行号相关联 拥有调试符号可以使某些类型的调试 例如
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort

随机推荐

  • 如何使用 PrimeFaces 验证码?

    我经历了用户指南 http www primefaces org documentation html和showcase http www primefaces org showcase ui captcha jsf但找不到在支持 bean
  • RxSwift:立即交付第一个项目,对后续项目进行反跳

    我有一个文本字段需要验证 我想在用户键入时禁用按钮 用户停止输入后 1 秒去抖 将执行验证并根据结果有条件地启用按钮 请注意当用户仅键入一个字符时的极端情况 验证仍然应该发生 a ab abc ab a ab false validate
  • 在camerax中捕获没有音频的视频

    我想使用camerax api在应用内相机中捕获没有音频的视频 我使用的是beta10的camerax api 我尝试过设置音频缓冲区大小和音频源等 截至此答案尚不支持 但当使用camerax库完全发布视频录制时 这将是可能的 最好的方法是
  • 如何对星期几进行直方图并具有字符串标签

    我有一个日期数据框 日期对象 见底部 我试图将它们转换为星期几 然后绘制直方图 但理想情况下标签是 星期一 星期日 不是数字 我有两个不同的问题 这很容易将日期对象转换为星期几 https stat ethz ch pipermail r
  • Rails 服务器错误:Ruby 版本是 1.8.7,但您的 Gemfile 指定为 1.9.3

    我输入了现有的 ruby 应用程序 然后输入 导轨 想在这里启动rails服务器 但它说 您的 Ruby 版本是 1 8 7 但您的 Gemfile 指定为 1 9 3 事实上 我有一个1 8 7 但我把它删除了 如果我这样做 红宝石 v
  • 我想在matlab中计算两行的平均值

    我在 matlab 中有一个 1028 x 18 矩阵 我想在 Matlab 中计算第一行和第二行按列值 第三行和第四行等的平均值 并得到一个具有平均值的新矩阵 我想你想计算每对行的列平均值 将数组重塑为 2 x 18 1028 2 计算平
  • RenderScript 支持库在 x86 设备上崩溃

    我正在运行致命异常android support v8 renderscript 在 Razor i x86 设备 上 如果我使用 问题就会消失android renderscript ARM设备也没有问题 这是例外情况 03 03 18
  • Spyder IDE 中的重复日志条目和锁定日志文件

    我想要的 我的 python 脚本运行 将日志消息输出到控制台和文件 一旦 python 脚本完成运行 我希望能够删除 编辑日志文件 我在 Windows7 上使用 Spyder IDE 示例代码 import logging loggin
  • Paypal 沙盒帐户电子邮件确认

    我在开发者网站上创建了一个沙箱帐户 当帐户所在国家 地区不在列表中时 一切都很好 然后 我通过 创建测试帐户 网站中的链接创建了另一个帐户 该帐户所在的国家 地区不在之前的列表中 它的电子邮件未经确认 我找不到激活它的方法 没有它我就无法接
  • 从 Dropzone 中删除任何现有文件会显示 dictDefaultMessage

    我创建了一个显示服务器上现有文件的放置区 我添加了有效的删除链接 我的问题是 当我使用删除链接删除文件时 默认的 将文件拖到此处上传 消息会出现在拖放区中 即使仍然有缩略图 我已经关注了这个tutorial http www startut
  • 自定义验证属性:比较同一模型中的两个属性

    有没有一种方法可以在 ASP NET Core 中创建自定义属性来验证一个日期属性是否小于模型中的其他日期属性ValidationAttribute 可以说我有这个 public class MyViewModel Required Com
  • quartz.NET 的任何开源管理 UI

    是否有任何开源管理界面可以在 QUARTZ NET 调度程序中添加 编辑 删除作业和触发器 看看这个blog http bugsquash blogspot com 2010 06 embeddable quartznet web cons
  • Magento:SQLSTATE [23000]:违反完整性约束:1062 键“UNQ_SALES_FLAT_ORDER_IN”的重复条目“100000001”

    我已经安装了 Magento 1 9 0 1 并且已经上线 1 个月了 客户的第一个订单没有出现任何问题 但现在 当应该处理订单时 会出现以下错误消息 处理您的订单时出错 请联系我们或稍后重试 日志文件说 异常 PDOException 消
  • Kafka s3 连接“值不是结构类型”错误

    我使用以下参数加载 s3 连接器 confluent load s3 sink name s3 sink config connector class io confluent connect s3 S3SinkConnector task
  • jenkins 服务无法在 Windows 2008 上启动

    我正在尝试将 Jenkins 作为服务安装在 Windows Server 2008 Datacenter SP2 上 我似乎无法让它作为服务运行 寻找任何想法来帮助实现它 当我尝试使用本机 Windows 软件包安装 Jenkins 时
  • Android,是否可以从拨号器运行该应用程序?

    我需要 如果可能的话 为我的项目添加一种功能 以便在用户输入诸如 之类的代码时运行1234 在拨号器中 我不确定这是否可能 目前 当我从应用程序文件夹中午餐我的应用程序时 它会启动 但只是为了好玩 我想知道我可以使用代码来午餐吗 您可以通过
  • 如何使用护照和快递显示自定义错误消息

    我在注册用户时检查电子邮件是否已经存在 如果用户已经存在 我会传递错误消息 电子邮件已存在 但在前端它显示 未经授权 错误401 我想传递我从后端传递到前端的错误消息 但它传递了默认消息 下面是我检查用户是否已存在并发送错误消息的方法 ex
  • 绑定到 MonoDroid/Android 的 MvvmCross 中的路径 ImageView

    在我的案例路径中 MyZooSnap Core component Resources Images i jpg Android 的路径转换方法ImageView 为了在以下绑定中使用它 AssetImagePath Path ImageP
  • 如何在rails中使用simple_form中的CSS将两个div放在同一行?

    将两个 div 放在同一行是一个老问题 但在 Rails 中使用 simple form 时我找不到解决方案 我想要做的是将内容及其标签显示在同一行上 标签的宽度为 125px left 内容在右边 right 标签中的文本右对齐 内容中的
  • 在剥离的 ELF 可执行文件中设置断点

    我有一个 ELF 32 位动态链接 剥离文件 我希望对其进行调试 尝试在某个地址设置断点时 出现一条消息 提示符号表未加载 我的问题是 当你说 ELF 文件是stripped究竟发生了什么 如何剥离 ELF 文件 是否可以以某种方式重建符号