Articles of 精灵

我怎样才能用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工作,则可以全面超级双分。

如何find没有任何符号信息的elf可执行文件的主函数的入口点?

我在Ubuntu-Linux 11.10平台上开发了一个小型的cpp程序。 现在我想对其进行逆向工程。 我是初学者。 我使用这样的工具:GDB 7.0,hte编辑器,hexeditor 。 我第一次做起来很简单。 在符号信息的帮助下,我创build了主要function的地址,并创造了我所需要的一切。 然后我带( –strip-all )可执行的elf文件,我有一些问题。 我知道main从0x8960开始。 但是我没有任何想法,没有这些知识我该如何find这一点。 我试着用gdb一步一步地debugging我的程序,但它进入__libc_start_main然后进入ld-linux.so.3 __libc_start_main (所以它find并加载程序所需的共享库)。 我debugging了大约10分钟。 当然,也许在20分钟内我可以达到主要function的切入点,但似乎更简单的方法必须存在。 我应该怎么做才能find没有任何符号信息的mainfunction的入口? 你可以build议我一些好的书籍/网站/其他资源从反向工程的elf文件的帮助下gdb? 任何帮助,将不胜感激。

ELF格式的操作

我有一个要求,我想要将索引与文件(以某种格式)相关联。 我想知道如果我可以做任何ELF操作,并仍然保证一致性保持如此,该文件在Linux上正常工作。 这里的想法是创build一个文件格式,可以通过一个特定的API [自定义]来查询索引。 a)是否可以修改ELF头来存储索引(如上所述)。 b)如果是的话,过程是什么?

如何加载共享库而不加载它的依赖关系?

说我有一个库libfoo.so.1 ,这取决于libbar.so.1 (根据ldd )。 但是, libbar.so.1目前不可用。 我的应用程序需要在libfoo.so.1调用一个不需要libbar.so.1的函数。 有没有办法加载libfoo.so.1 ,解决函数符号,然后调用它没有libbar.so.1满足依赖? 这是一个“我知道我在做什么,只是让我做”的情况。 我尝试了RTLD_LAZY标志,但它仍然会尝试加载libbar.so.1库之前不加载符号。 编辑 这是确切的情况。 我们有3名球员: libbar.so.1 ,位于不在LD_LIBRARY_PATH或ldconfig中的path中的共享库,其所有依赖关系都已parsing libfoo.so.1 ,一个共享库位于不同于libbar目录中,但依赖于libbar 。 在运行时, libfoo会知道libbar 。 App ,一个在运行时需要加载libfoo的二进制应用程序。 App不知道在哪里可以findlibbar ,但知道libfoo知道。 我试图完成的是在libfoo有一个init函数,它将简单地将App的当前工作目录更改为libbar所在的位置,以最终解决所有的依赖关系,并使每个人都感到高兴。 libfoo 最终将需要在libbar调用东西,而不是在这个init函数中。 我不认为创build存根是可行的,因为这些符号最终需要解决实际的function。