Articles of elf

如何readelf翻译入口点

我有一个精灵文件,当我使用readelf -h文件名时,我得到了入口点。 现在,让我说我想自己计算这个地址[使用汇编,但语言并不重要]。 我怎样才能做到这一点? 我知道入口点是从文件中的偏移量24开始的4个字节,但是我不知道如何将这个数据转换成地址。

ELF弱导入/回退存根glibcfunction

我试图让我们的程序在一些旧的Linux版本上运行。 防止它的一个常见导入是__longjmp_chk ,在glibc 2.11中添加,但在旧版本中丢失。 一个“解决scheme”是使用-D_FORTIFY_SOURCE=0但这会closures目标libc中存在的其他强化函数( __printf_chk等)。 有没有办法使__longjmp_chk是一个“弱导入”,如果存在,将使用libc.so.6的函数,如果不存在则返回到本地存根?

为什么不尊重'-rpath-link'选项?

我使用strace来检测这个: 8480 execve("/usr/lib/gcc-lib/i486-slackware-linux/3.3.4/../../../../i486-slackware-linux/bin/ld", [ "/usr/lib/gcc-lib/i486-slackware-linux/3.3.4/../../../../i486-slackware-linux/bin/ld", … "-L/home/bjack/lib", … "-rpath-link", "/root/src/firmware/Bj-bg/ab-BJ-gameprom-modules/src/dispatcher/logic", … "-lgame_std", "-lygor", "-ldl", "–rpath", "/home/bjack/lib", "-lgcc", "–as-needed", "-lgcc_s", "–no-as-needed", "-lc", "-lgcc", "–as-needed", "-lgcc_s", "–no-as-needed", "/usr/lib/gcc-lib/i486-slackware-linux/3.3.4/crtend.o", "/usr/lib/gcc-lib/i486-slackware-linux/3.3.4/../../../crtn.o" ], [/* 26 vars */]) = 0 8480 open("/home/bjack/lib/libgame_std.so", O_RDONLY) = 12 8480 open("/home/bjack/lib/libygor.so", O_RDONLY) = -1 ENOENT (No such file or directory) 8480 open("/home/bjack/lib/libygor.a", O_RDONLY) = -1 […]

Linux程序的堆栈以某种非显式方式修改?

我正在尝试在Linux上的NASM上编写一个简单的ELF64病毒。 它将自身附加到受害者身上(当然也包括所有这些部分和细分相关的东西),并改变受害者的入口点,以便指向恶意代码。 当被感染的程序启动时,第一个被执行的是我的病毒,什么时候工作,它跳转到原来的入口点,受害者的代码正在执行。 当病毒感染简单的C ++ hello world时,一切正常,正如我在strace中看到的,病毒正确执行,然后执行受害者的代码。 但是,如果我追加: printf("%s\n", argv[0]); 到受害者的代码,重新感染它并运行,病毒的代码正确执行,“打印你好世界”,但是然后引发一个分段错误错误。 我认为这意味着在病毒执行过程中堆栈正在被更改,以便有一些随机数而不是原始的argv [0]。 但是,我分析了我的病毒的全部来源,标记了rsp的所有推送,popup和直接修改,仔细分析它们,看起来堆栈应该处于相同的状态。 但是,正如我所看到的,事实并非如此。 是否有可能通过例如系统调用以某种非显式方式修改堆栈? 或者,也许这是不可能的,我应该花更多的时间盯着源find一个错误?

存在于二进制的精灵RUNPATH中的库没有被使用?

我在我的环境中定制了gcc-4.7.2 。 系统gcc是gcc-4.3.4 。 我已经使用patchelf –set-rpath为所有自定义gcc的二进制文件和共享库修补了RUNPATH 但是,当我在我的4.7.2 cc1上运行ldd ,它会读取系统libstdc++而不是RUNPATH所指向的系统: $ ldd /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1 libcloog-isl.so.1 => /sdk/x86_64/2.11.1/gcc-4.7.2/lib/libcloog-isl.so.1 (0x00007f072dce8000) … libc.so.6 => /lib64/libc.so.6 (0x00007f072bfe0000) –> libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007f072bcd5000) libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f072babe000) /lib64/ld-linux-x86-64.so.2 (0x00007f072df0d000) 可以看出, RUNPATH指定了gcc-4.7.2库位置: $ readelf -a /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/4.7.2/cc1 | grep PATH 0x000000000000001d (RUNPATH) Library runpath: \ [/sdk/x86_64/2.11.1/gcc-4.7.2/lib64: \ /sdk/x86_64/2.11.1/gcc-4.7.2/lib: \ /sdk/x86_64/2.11.1/gcc-4.7.2/libexec/gcc/x86_64-suse-linux/lib64: \ /sdk/x86_64/2.11.1/gcc-4.7.2/lib/gcc/x86_64-suse-linux/4.7.2: \ /hostname/sig/lib64: […]

有没有办法将Linux共享库加载到特定的内存位置?

我有一个Linux应用程序在运行时加载非常小(一些小function)共享库。 对于各种重要原因™,我需要将共享库加载到特定的虚拟内存范围中。 然而, dlopen()并没有提供任何手段(我可以看到)告诉它,或者提示它,在哪里加载它。 有没有办法告诉dlopen()它应该把它加载的库? 有没有其他的dlopen()可以提供这种function?

如何在NASM中不放出本地符号,让GDB disas不会停下来呢?

我正在尝试在Linux上使用nasm编写一些汇编程序。 一切都很好,但是我大量使用本地符号(.loop,.else等),这在debugging时很痛苦,因为这些符号被发送到符号表,例如: [BITS 32] global main section .text main: do stuff .else: do other stuff 会产生一个反汇编,如下所示: <main>: 00000000 do stuff <main.else>: 00000000 do other stuff 这有点烦人,因为gdb会认为这些都是单独的函数,所以当我“disas”时,它只会拆卸一些指令,然后运行到另一个标签并停止。 有没有办法抑制发射这些符号在ELF符号表使用NASM下的Linux?

在Linux上,ELF头部中的ABI设置为Sys V,而不是Linux?

在Linux下,当我编译下面的程序时: int main() {} 用gcc 4.7: $ gcc test.c 并用readelf检查生成的可执行文件: $ readelf -h a.out … OS/ABI: UNIX – System V … 它的ELF头部中的EI_OSABI字节设置为ELFOSABI_SYSV ,而不是ELFOSABI_LINUX 。 有没有人知道背后的历史或推理? 天真地,人们可能期望它被设置为Linux。 此外,将其设置为Linux的后果是什么?

如何从elf文件格式创build一个可执行的hex

我是非常新的这个,我有精灵文件input.out并需要从它创buildhex可执行文件。 我正在使用objcopy来创build以hex格式的可执行文件,如下所示 objcopy -O ihex input.out out.hex 通过这out.hex包含所有部分(.interp,.note.ABI标记等)的数据,但我不知道是否所有的这是可执行的。 只是.text部分足够创build可执行hex,所以我可以只使用如下或任何更多的部分是必需的 objcopy -j.text -O ihex input.out out.hex 另外如果有什么好的参考来详细了解这一点,我找不到很多的Goggling。 也许我不知道要search什么。

为什么在执行静态二进制文件时出现vdso?

这是一个快速示例程序。 (这基本上会得到与进程相关的procmap ) > cat sample.c #include<stdio.h> int main() { char buffer[1000]; sprintf(buffer, "cat /proc/%d/maps\n", getpid()); int status = system(buffer); return 1; } 准备静态 > gcc -static -o sample sample.c > file sample sample: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=9bb9f33e867df8f2d56ffb4bfb5d348c544b1050, not stripped 执行二进制 > ./sample 00400000-004c0000 r-xp […]