ELF 可执行文件的起点?
Posted
技术标签:
【中文标题】ELF 可执行文件的起点?【英文标题】:starting point of ELF executable file? 【发布时间】:2012-12-09 18:19:28 【问题描述】:我在 lubuntu 12.10 上使用 anjuta 编译以下 C 程序
int main()
return 0;
文件名为 foobar
然后我打开终端并编写命令
ndisasm foobar -b 32 1>asm.txt
(使用32位指令选项反汇编foobar并将反汇编结果保存到asm.txt)
我打开 asm.txt 有很多 0x0000 和无法理解的代码。
指令jg 0x47(0x7F45) on 0x00000000 and dec esp(0x4C) on 0x00000002
似乎是 ELF 文件格式签名。
(因为十六进制代码 0x454c46 在 ascii 中是 'ELF')
Linux 可能会将此代码加载到内存中,并且不会跳转到 0x00000000,因为没有可执行代码。
我在这里有问题。
-
我怎么知道起始地址的地址?
哪些代码可以忽略?(也许很多 0x0000 可以忽略,但还有什么?)
【问题讨论】:
为什么不objdump -d foobar
?它只会反汇编 elf 文件的可执行(文本)部分。还可以尝试readelf -e foobar
获取有关部分的信息并查找入口地址。
是否可以手动获取起点?
检查精灵标题:sco.com/developers/gabi/1998-04-29/ch4.eheader.html - e_entry 字段。但是您还需要解析程序头 sco.com/developers/gabi/1998-04-29/ch5.pheader.html 并找到所有 PT_LOAD 段以将虚拟地址转换为文件偏移量。以下是 ELF 和加载过程的快速介绍:wiki.osdev.org/ELF
【参考方案1】:
即使对于像你这样的最简单的程序,gcc
也会链接一些库和一些目标文件(特别是crt0.o
,它调用你的main
并包含_start
,ELF 的起点)。而且您的二进制文件可能动态链接到某些libc.so.6
,因此需要动态链接器(使用ldd foobar
查找)。使用gcc -v
了解gcc
在做什么。而objdump 有很多有趣的标志或选项。
您可能还想阅读Assembly Howto、X86 calling conventions、this question、the X86-64 ABI、these notes on X86-64 programming 等
【讨论】:
以上是关于ELF 可执行文件的起点?的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )
Android 逆向ELF 文件格式 ( ELF 文件类型 | ELF 文件对应 CPU 架构 | ELF 目标文件版本 | 可执行程序起始地址 )