ELF文件的头示例如下:
其中一些关键的字段解释如下:
(1)Type字段。该字段用于描述ELF文件的类型,如表2.3所示。
表2.3 ELF文件头中的Type字段
(2)Entry point address字段:也称为e_entry字段,该字段包含了可执行文件开始执行的内存地址,即系统在启动进程时对控制权进行转移的起始地址,该地址指向_start()函数。程序被装载后,装载器会查找e_entry字段,通过相关工具可以修改该字段,使其指向恶意代码地址,这样就可获取进程的执行控制权。
_start()函数主要功能是为_libc_start_main()函数准备相关的参数。_libc_start_main()函数的原型如下:
_libc_start_main()函数的主要作用有:
●为程序的执行准备环境变量。
●在main()函数开始前调用_init()函数执行初始化。
●注册_fini()函数和_rtld_fini()函数,在程序终止后对程序进行清理。
●在完成必要的操作后,_libc_start_main()函数调用main()函数。
在默认情况下,_start()函数会调用main()函数。如果要执行定制的启动代码,则可以覆盖_start()函数,使其调用定制的启动代码,而不是main()函数,如Listing 2.7所示。
Listing 2.7 无main()函数的测试程序nomain.c
在编译nomain.c时,为了避免编译器使用默认的_start()函数,可以使用编译选项-nostartfiles做到这一点。例如: