Reference https://stackoverflow.com/questions/57446579/executable-says-line-1-elf-not-found-when-starts
使用alt+F7载入脚本,选择dump_elf64 等待 加载 成功以后,刚刚创建的dumpfile就是脱壳后的文件了。
个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。
_Ehdr elf_head; int shnum, a; // 读取 head 到elf_head a = fread(&elf_head, sizeof(Elf64_Ehdr), 1, fp); if (x) #define ELF32_ST_TYPE(x) ELF_ST_TYPE(x) #define ELF64_ST_BIND(x) ELF_ST_BIND(x) #define ELF64_ST_TYPE elf32_note #define elf_shdr elf32_shdr #define elf_sym elf32_sym #define elf_addr_t Elf32_Off #ifdef elfhdr elf64_hdr #define elf_phdr elf64_phdr #define elf_note elf64_note #define elf_shdr elf64_ shdr #define elf_sym elf64_sym #define elf_addr_t Elf64_Off #ifdef ELF_USES_RELOCA # define ELF_RELOC
Executable and Linkable Format (ELF) Linux: man elf https://refspecs.linuxfoundation.org/elf/elf.pdf (第一手资料) https://manpages.debian.org/stretch/manpages/elf.5.en.html ?
/usr/bin/python import struct import sys elfhdr = {} def verify_elf(filename): f = open(filename,'rb = ord('F')): print "your input file %s not a elf file" %filename return else: temp = f.read(struct.calcsize 11] elfhdr['e_shstrndx'] = temp[12] f.close() def display_elfhdr(elffile): global elfhdr print "ELF [12],magic[13],magic[14],magic[15]) if magic[4] == 1 : print " Class: ELF32 " else: print " Class: ELF64" if magic[5] == 1: print " Data
文章目录 源码到可执行文件 ELF文件格式 ELF File header Program header Section header 工具 Symbol Table 源码到可执行文件 linux中四类文件使用 https://man7.org/linux/man-pages/man5/elf.5.html 1999年86open项目选择ELF作为x86处理器上Unix和类Unix系统的标准二进制文件格式。 例如这些扩展名的文件一般都是elf格式:.axf, .bin, .elf, .o, .prx, .puff, .ko, .so, and .mod ELF文件格式 引用wiki的一张图: https to structure the ELF data. 符号表入口结构定义如下,可在/usr/include/elf.h中可以找到文件头结构定义: typedef struct elf64_sym { Elf64_Word st_name; /* Symbol
\n"); return 0; } ELF header # readelf -h hello ELF Header: Magic: 7f 45 4c 46 02 01 01 00 定义 typedef struct { Elf32_Word st_name; Elf32_Addr st_value; Elf32_Word st_size; unsigned char st_info ; unsigned char st_other; Elf32_Half st_shndx; } Elf32_Sym; typedef struct { Elf64_Word st_name; unsigned char st_info; unsigned char st_other; Elf64_Half st_shndx; Elf64_Addr st_value; Elf64_Xword st_size; } Elf64_Sym;
通过以上我们多次看到计算机是依据文件指示这种语言,所以学习elf 首先要理解elf指示了那些信息。 二、可运行的elf文件。 1、elf文件头 ,这个文件是对elf文件总体信息的描写叙述,在32位系统下是56的字节,在64位系统下是64个字节。 typedef struct { Elf64_Word p_type; /* Segment type */ Elf64_Word p_flags segments 是从执行的角度来描写叙述elf文件, sections是从链接的角度来描写叙述elf文件的。 本节我们仅仅将elf文件的运行,所以我们仅仅讲segment相关的内容。 我们将通过一个样例来解说系统载入elf的过程(64位平台)。
英文文档: http://www.cs.cmu.edu/afs/cs/academic/class/15213-f00/docs/elf.pdf 中文对照翻译文档: http://blog.chinaunix.net /attachment/attach/26/40/46/9726404697228d82cda2af11366fa7722d3a4f1a58.pdf 使用010editor打开ELF文件,套用ELF模板
ELF文件结构 ELF格式的文件中的“数据”实际上是以“段”(节,英文:Section)的形式存储的。 ELF头部的结构体为 elf32_hdr 或 elf64_hdr, 在Android系统源代码的 /bionic/libc/kernel/uapi/linux/elf.h 可以找到。 Elf32_Half e_type; Elf32_Half e_machine; Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32_Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32
前面章节我们了解了ELF文件的头部结构,这次我们深入了解另一个非常重要的数据结构,那就是程序表头。操作系统严重依赖该结构来加载ELF文件或是实现动态链接。 程序表头反映的是当ELF加载到内存后所形成的“视图”或结构,也就是说ELF文件存在硬盘上或者被加载到内存,它展现出来的形态不一致。 最后p_align表示内存对齐方式,它的取值为2的指数,同时p_vaddr必须等于(p_offset % p_align) 了解了ELF二进制内部原理后,我们需要实现手动加载ELF文件,实现这个目标,我们需要依赖一个库叫 Binary类用于对整个elf文件的抽象,通过它可以访问ELF文件相关信息,Section是对前面章节描述的段对象的抽象,Symbol是对前面章节符号表对象的抽象。 load_binary是来自libbfd库提供的函数,它将elf文件加载到内存中。
ELF目标文件格式最前部ELF文件头(ELF Header),它包含了描述了整个文件的基本属性,比如ELF文件版本、目标机器型号、程序入口地址等。 ELF文件头结构及相关常数被定义在“/usr/include/elf.h”,因为ELF文件在各种平台下都通用,ELF文件有32位版本和64位版本的ELF文件的文件头内容是一样的,只不过有些成员的大小不一样 Elf32_Word e_version; Elf32_Addr e_entry; Elf32_Off e_phoff; Elf32_Off e_shoff; Elf32 _Word e_flags; Elf32_Half e_ehsize; Elf32_Half e_phentsize; Elf32_Half e_phnum; Elf32 段表 段表就是保存ELF文件中各种各样段的基本属性的结构。段表是ELF除了文件以外的最重要结构体,它描述了ELF的各个段的信息,ELF文件的段结构就是由段表决定的。
; Elf32_Half e_phnum; Elf32_Half e_shentsize; Elf32_Half e_shnum; Elf32_Half e_shstrndx; } Elf32 ; Elf64_Half e_phentsize; Elf64_Half e_phnum; Elf64_Half e_shentsize; Elf64_Half e_shnum; Elf64 typedef struct elf32_phdr { Elf32_Word p_type; Elf32_Off p_offset; Elf32_Addr p_vaddr; Elf32 Elf32_Phdr; typedef struct elf64_phdr { Elf64_Word p_type; Elf64_Word p_flags; Elf64_Off p_offset Elf32_Addr sh_addr; Elf32_Off sh_offset; Elf32_Word sh_size; Elf32_Word sh_link; Elf32_Word sh_info
本篇介绍 本篇详细介绍下ELF 64的文件格式。 ELF文件分类 可重定位文件(.o),包含代码和数据,但是代码和数据都没有指定绝对地址,需要链接其他目标文件来生成可执行文件或共享目标文件 共享目标文件(.so),包含代码和数据,以供链接器使用 可执行文件 , 包含代码和数据,是可以执行运行的程序,代码和数据都有固定的地址 ELF文件内容 一个ELF文件需要包含以下部分: elf文件头,必须出现在elf文件的开头 节头表(Section header table ELF节 节包含了ELF文件中除了文件头,程序段头表,节头表之外的所有内容。 #define ELF64_R_SYM(i)((i) >> 32) #define ELF64_R_TYPE(i)((i) & 0xf f f f f f f f L) #define ELF64_R_INFO
ELF文件格式的详解 1.说明 2.elf文件的基本格式 3.elf文件的头部信息 4.elf文件的节区(Section) 4.1 节区的作用 4.2 节区的组成 5.elf文件的段(Segment) 2.elf文件的基本格式 elf文件是有一定的格式的,从文件的格式上来说,分为汇编器的链接视角与程序的执行视角两种去分析ELF文件。 ? 为了彻底的弄清楚elf文件的内容,可以先从ELF文件的头部开始分析。 3.elf文件的头部信息 对于elf头部文件信息,首先可以可以查看一下内存的布局情况: ? EL_VERSION表示了elf的头部版本号码。 前面四个基本上确定的,内容第一个字符为7f,后面用ELF字符串表示该文件为ELF格式。 当程序执行的时候输入python elf_parse.py rtthread.elf就可以向下执行了。 第二步:校验elf 该函数的作用主要是校验elf文件,并且将相关的信息存到字典里面。
ELF文件格式 4.1 从编译和链接角度看ELF文件(可重定位目标文件) 4.2 从程序执行角度看ELF文件(可执行文件) 5.总结 1. ELF文件作用 ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待ELF格式的文件: 1.如果用于编译和链接(可重定位文件),则编译器和链接器将把 ELF文件格式 4.1 从编译和链接角度看ELF文件(可重定位目标文件) ? 从编译和链接角度看ELF文件 ELF头 每个ELF文件都必须存在一个ELF_He ader,这里存放了很多重要的信息用来描述整个文件的组织,如: 版本信息,入口信息,偏移信息等。 Elf32_Word sh_flags; //节标志:该节在虚拟空间中的访问属性 Elf32_Addr sh_addr; //虚拟地址:若可被加载,则对应虚拟地址 Elf32_Off
新的疑问随之而来:如前面所述,我在构造畸形ELF文件的时候,直接把section头部表给删除了,还修改了ELF头部和section相关的字段,为啥不会影响执行呢? d_val; Elf32_Addr d_ptr; Elf32_Off d_off; } d_un; } Elf32_Dyn; typedef struct { Elf64_Xword d_tag; union { Elf64 Elf32_Dyn数组 Elf32_Dyn中的d_tag非常重要,它标示了各种数据类型,其后的d_un也是根据d_tag进行解释的。 网上可以下载到解析ELF文件的Template,但这个Template对于畸形ELF不做深入解析,为此,我花了1天时间学习了010Editor的语法,发现它的模板真的是非常强大。
在执行boo函数时,内部调用foo函数时,IP寄存器能准确的指向foo函数第一条指令所在位置呢,这就需要编译器在编译代码时所生成的重定向数据结构,内容如下: typedef struct { ELF64 _Addr r_offset; Uint64_t r_info; } Elf64_Rel; typedef struct { ELF64_Addr r_offset; Uint64_t r_info; int64_t r_addend; } Elf64_Rela; r_offset指向.o文件中需要指定其在内存中位置的偏移,例如obj1.o中,foo() 如果elf文件对应32位系统,那么重定向就使用第一个结构,如果对应64位系统就对应第二个结构。 可以看到第一条信息对应的就是结构体Elf64_Rela各个字段的内容。
elf loader的实现方式应该与此类似,通过复制文件到申请的内存,并将eip指针指向elf入口地址e_entry。 根据上述的思考,我们需要从以下四个方向去搜集资料和分析: elf文件结构 elf 装载 依赖库的加载(动态链接) 开源项目 ELF文件结构 ELF 视图 ELF,即 Executable and Linking 程序头部的数据结构: /* Program Header */typedef struct { Elf32_Word p_type; /* segment type */ Elf32 alignment */} Elf32_Phdr; typedef struct { Elf64_Half p_type; /* entry type */ Elf64_Half address */ Elf64_Addr p_paddr; /* physical address */ Elf64_Xword p_filesz; /* file size
腾讯云样本智能分析平台 是一套恶意样本智能分析鉴定平台,依靠自研深度沙箱,实现自动化、智能化、可定制化的样本分析,从而精准高效地对现网中的恶意样本进行打击。
扫码关注腾讯云开发者
领取腾讯云代金券