Articles of 精灵

根据需要装载/卸载ELF部分?

对于一个比较模糊的用例,我希望有一个(大的)静态链接的Linux可执行文件,由一小块控制代码和大量的静态(只读)数据组成。 有没有可能为了节省内存,让加载程序只加载控制代码的部分,然后手动加载需要的RO数据部分,并在处理完成后再次卸载它们? 这可能吗? (我认为数据stream(在文件系统级别)可以用来解决这个问题,但是它们对我来说是不可用的(EXT3),因为数据stream很容易丢失,所以分发会很棘手。

在ELF二进制中导入名称

ELF格式在哪里存储导入函数的名称? 总是可以枚举所有的导入名称,比如PE可执行文件? 例如,如果一个二进制文件正在使用printf ,那么是否可以通过二进制本身的静态分析来告诉它呢?

ELF程序头虚拟地址和文件偏移量

我知道两者之间的关系: 虚拟地址mod页面alignment==文件偏移mod页面alignment 但有人能告诉我这两个数字在哪个方向计算吗? 根据上述关系计算文件偏移量的虚拟地址,反之亦然? 更新 这里有一些细节:当链接器写ELF文件头时,它设置程序头的虚拟地址和文件偏移量(段) 例如有readelf -l someELFfile的输出readelf -l someELFfile : Elf file type is EXEC (Executable file) Entry point 0x8048094 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x00154 0x00154 RE 0x1000 LOAD 0x000154 0x08049154 0x08049154 0x00004 0x00004 RW 0x1000 GNU_STACK 0x000000 0x00000000 0x00000000 0x00000 0x00000 RW […]

我怎样才能用go1.6.2构buildlinux 32位版本

有没有GOARCH和GOOS值的组合,我可以设置为了构buildELF 32位二进制?

dladdr不会返回函数名称

我正在尝试使用dladdr。 它正确地定位库,但它没有find函数名称。 我可以调用objdump,做一个小math,并获得我通过dladdr函数的地址。 如果objdump可以看到它,为什么不能dladdr? 这是我的function: const char *FuncName(const void *pFunc) { Dl_info DlInfo; int nRet; // Lookup the name of the function given the function pointer if ((nRet = dladdr(pFunc, &DlInfo)) != 0) return DlInfo.dli_sname; return NULL; } 这是一个gdb成绩单,显示我得到的。 Program received signal SIGINT, Interrupt. [Switching to Thread 0xf7f4c6c0 (LWP 28365)] 0xffffe410 in __kernel_vsyscall () (gdb) […]

ELF文件TLS和LOAD程序部分

int i; int main() { return i; } readelf -l编译readelf -l显示来自elf的程序头文件: Elf file type is EXEC (Executable file) Entry point 0xxxxx30 There are 6 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x08048000 0x08048000 0x79868 0x79868 RE 0x1000 > LOAD 0x079f94 0x080c2f94 0x080c2f94 0x0078c 0x02254 […]

目标文件的objdump输出中的标志

在某个目标文件上有objdump的输出: $ objdump -h main.o main.o: file format elf32-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000000b 00000000 00000000 00000034 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE 1 .data 00000000 00000000 00000000 00000040 2**2 CONTENTS, ALLOC, LOAD, DATA 2 .bss 00000000 00000000 00000000 00000040 2**2 ALLOC 3 .note.GNU-stack 00000000 00000000 00000000 00000040 […]

比较64位x86平台上的PIE,PIC代码和可执行文件有什么区别?

testing是在Ubuntu 12.04 64位。 x86架构。 我对位置独立可执行(PIE)和位置独立代码(PIC)这个概念感到困惑,我想他们不是正交的。 这是我的快速实验。 gcc -fPIC -pie quickSort.c -o a_pie.out gcc -fPIC quickSort.c -o a_pic.out gcc a.out objdump -Dr -j .text a.out > a1.temp objdump -Dr -j .text a_pic.out > a2.temp objdump -Dr -j .text a_pie.out > a3.temp 我有以下的发现。 A.a.out包含一些PIC代码,但只能在libc序言和结语函数中使用,如下所示: 4004d0: 48 83 3d 70 09 20 00 cmpq $0x0,0x200970(%rip) # 600e48 <__JCR_END__> […]

.so在linux下注入:如何查找dlopen()的地址?

最近我对Linux感兴趣,正在尝试创build一个能够注入共享对象(即.so文件,“dynamic加载库”,Windows下的“DLL”)的程序。我知道这可以通过设置一个环境variables,但我想要在已经运行的进程上执行。 我已经知道如何在Windows下做到这一点。 有几种方法,但一般来说,您可以通过使用CreateRemoteThread()创build远程线程来调用LoadLibrary()。 当然你需要在远程进程中使用LoadLibrary的地址,但是(以我的经验),每个进程的偏移总是相同的。 我已经做了一些关于如何在Linux下完成的研究。 例如Phrack 59中一篇有趣的文章展示了如何做到这一点。 文章也有一个源代码附加,但由于一些假设是由目标进程,它是32位,我不能得到它的工作。 其他的东西,我碰到: 一个codeproject文章 ,但这只是解释如何从gdb内做到这一点。 (我会张贴更多的链接,但网站限制我2: – /。) 首先,我想获取远程进程中dlopen()函数的地址。 为此,我想通过获取stream程的ELF头,并遍历符号表。 其实,我设法做到这一点,通过: 1)获取ELF头(根据我的经验,存储在0x400000下的64位) 2)在标题为DYNAMIC的程序标题中find全局偏移量表。 3)通过访问全局偏移表中的第二个条目来获取第一个link_map。 4)迭代link_map链的dynamic部分,从而获得string表,符号表和散列表的地址(* Hash_Table + 0x4保存符号表中的条目数量。) 5)遍历符号表 从我的程序输出一些示例: ** looking at lib "" ** Trying to find symbol main in symbol table… numentries: 49 index 1 name: val: 0 … index 49 name: memcpy val: 0 symbol […]

访问附加到ELF二进制文件的数据

我有一个静态ELF二进制从zipfile中读取数据。 为了简化分发,我想将zip文件附加到二进制文件中,如下所示: $ cat mydata.zip >> mybinary 我知道这样做不会破坏mybinary,但是我不知道如何访问mydata.zip的内容。 可能吗? 如果是这样,怎么样? 在过去,我使用附加数据的附加技巧来追加数据的长度,所以我所要做的就是打开二进制文件,读取stream的最后一个int,然后重新开始解压缩,但是由于各种原因,在这里不起作用(例如,当需要zip文件时,我不能保证文件仍然在光盘上)。 如果解决scheme跨OS X和MinGW工作,则可以全面超级双分。