Articles of binutils

将代码/符号修补为dynamic链接的ELF二进制文件

假设我有一个dynamic链接的ELF二进制文件,我想覆盖/redirect某些库调用。 我知道我可以用LD_PRELOAD来做到这一点,但是我想要一个在二进制文件中永久存在的独立于环境的解决scheme,它可以用于setuid / setgid二进制文件,其中没有一个是LD_PRELOAD可以实现的。 我想要做的就是从其他目标文件中添加代码(如有必要,可能在新的部分添加代码),并将这些目标文件中的符号添加到二进制文件的符号表中,这样就可以使用新添加的代码版本代替共享库代码。 我相信这应该是可能的,而不需要在现有的代码中进行实际的迁移。 即使它们在同一个文件中,它们应该能够在运行时以通常的PLT方式来parsing(因为我只关心函数,而不关心数据)。 请不要给我答复,“你不想这样做!” 或者“那不是便携的!” 我正在处理的是一种连接二进制文件与ABI不兼容的备用共享库实现的方式。 有问题的平台是i386-linux(即32位)。 除非我误解了什么是可能的,否则我可以编写一些工具来parsingELF文件并执行我的黑客攻击,但我怀疑有一种奇怪的方式来使用GNU链接器和其他工具来完成此操作,而无需编写新代码。

什么是__gmon_start__符号?

我用gcc hello.c编译这段代码-o hello -O3 #include <stdio.h> int main(void) { printf("Hello world\n"); return 0; } 当我列出重新分配我得到: test@southpark$ readelf -r hello | grep gmon 080495a4 00000106 R_386_GLOB_DAT 00000000 __gmon_start__ 080495b4 00000107 R_386_JUMP_SLOT 00000000 __gmon_start__ 当我列出这个文件中的符号时,我得到: test@southpark$ readelf -s hello | grep gmon 1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ 48: 00000000 0 NOTYPE WEAK DEFAULT UND […]

如何确定gcc默认将哪些命令行选项传递给ld?

考虑一下Hello world C程序: hello.c : #include "stdio.h" int main() { printf("Hello, World!\n"); } 如果我打电话: $ gcc -c hello.c -o hello.o 它会产生一个ELF可重定位文件hello.o 如果我然后打电话给: $ gcc hello.o -o hello [1] 它将链接hello.o与ld并产生一个ELF可执行文件hello 但是,如果我直接调用ld [2]而不是[1] : $ ld hello.o -o hello [2] 我得到这些错误: /usr/bin/ld.bfd.real: warning: cannot find entry symbol _start test.c:(.text+0xa): undefined reference to `puts' gcc必须将其他选项传递给ld(例如链接C库)。 有无论如何确定命令行gcc正在通过命令[1] ld通过?

如何从libopcodes获取指令信息?

我正在编写一个在x86-32和x86-64 Linux中使用libbfd和libopcodes的工具来执行反汇编。 问题是,虽然我能够获得libopcodes反汇编,我无法得到任何指示信息。 为了示范的目的,我已经做了一个再现我的问题的最小例子。 程序应该从入口点到第一个RET / RETQ 。 这个代码有点被全局变了,为了简洁起见,错误检查被省略了,但是应该清楚地说明问题。 #include <bfd.h> #include <dis-asm.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <ctype.h> #include <limits.h> #include <libiberty.h> /* * Holds state for BFD and libopcodes. */ bfd * abfd = NULL; disassemble_info dinfo = {0}; /* * Temporary hack to signal […]

你如何只提取ELF部分的内容

我已经尝试了以下,但生成的文件仍然是一个ELF,而不是纯粹的部分内容。 $ objcopy –only-section=<name> <infile> <outfile> 我只想要部分的内容。 有没有可以做到这一点的工具? 有任何想法吗?

如何使用/安装GNU binutils(objdump)

我需要在Windows上运行的应用程序中使用objdump和readelf命令。 我知道我可以安装cygwin为了使用它们。 我不想使用cygwin的原因是因为我想把它作为部署的文章。 另外我不知道如何进行cygwin的沉默安装。 因此,我相信我所需要的是GNU Utilities For Win32作为链接状态这些库是无服务器的。 “可执行文件只依赖于Microsoft C运行时(msvcrt.dll)而不是像Cygwin工具提供的仿真层” 无论如何,一旦我去那个链接,我不知道如何安装它。 具体来说,我会喜欢使用>这个工具< 我将不胜感激,如果有人能指出我如何能够在我的应用程序中使用objdump和readelf(cygwin中的binutils)的正确方向。