ELF病毒分析
字数 1970 2025-08-05 08:16:26

ELF病毒分析与实现技术详解

一、ELF文件格式基础

1.1 ELF文件类型

ELF(Executable and Linkable Format)是Linux系统下的标准可执行文件格式,主要分为以下几种类型:

  • ET_NONE:未知类型
  • ET_REL:可重定位文件(.o文件)
  • ET_EXEC:可执行文件
  • ET_DYN:共享目标文件(共享库)
  • ET_CORE:核心转储文件

1.2 ELF文件结构

ELF文件由以下几部分组成:

  1. ELF头(ELF Header)

    • 使用readelf -h查看
    • 包含Magic number、文件类型、机器类型、入口点地址等信息
    • 结构体定义在usr/include/elf.h
  2. 节头表(Section Header Table)

    • 描述文件中的各个节(section)
    • 主要用于链接和调试
    • 重要节包括:
      • .text:程序代码
      • .rodata:只读数据
      • .plt:过程链接表
      • .data:已初始化全局变量
      • .bss:未初始化全局变量
      • .got.plt:全局偏移表
      • .dynsym:动态符号表
      • .ctors/.dtors:构造函数/析构函数指针
  3. 程序头表(Program Header Table)

    • 描述文件中的段(segment)
    • 用于程序加载和执行
    • 重要段类型:
      • PT_LOAD:可加载段
      • PT_DYNAMIC:动态链接信息段
      • PT_NOTE:操作系统规范信息
      • PT_INTERP:解释器路径
      • PT_PHDR:程序头表自身信息

二、ELF病毒核心技术

2.1 ELF病毒基本原理

ELF病毒的核心目标是劫持控制流,通过修改ELF文件结构实现:

  1. 修改入口点或插入跳转指令,使程序先执行病毒代码
  2. 病毒代码执行后恢复原始执行流程
  3. 具备自我复制能力,感染其他可执行文件

2.2 ELF病毒关键技术

  1. 独立寄生代码

    • 必须不依赖动态链接器
    • 使用位置无关代码(PIC)
    • 字符串处理需特殊处理(避免.rodata引用)
  2. 控制流劫持方法

    • 修改ELF头中的入口点(e_entry)
    • 利用.ctors/.init_array中的构造函数
    • 插入跳转指令(jmp/call)
  3. 系统调用使用

    • 避免使用libc,直接通过int 0x80进行系统调用
    • 常用系统调用包括:open/read/write/execve等

三、ELF病毒感染技术

3.1 Silvio填充感染

利用text段末尾的填充空间插入病毒代码:

  1. 增加节表偏移(ehdr->e_shoff)一个页大小(PAGE_SIZE)
  2. 定位text段程序头(phdr)
  3. 修改入口点为text段末尾
  4. 增加text段文件大小和内存大小
  5. 调整后续段和节的偏移量
  6. 在text段末尾插入病毒代码

3.2 逆向text感染

通过逆向扩展text段插入病毒代码:

  1. 减小text段虚拟地址,腾出空间
  2. 修改入口点为新腾出的空间
  3. 增加text段大小
  4. 调整后续段和节的偏移量
  5. 在腾出的空间插入病毒代码

最大可插入病毒代码大小计算:
max_parasite_length = orig_text_vaddr - (0x1000 + sizeof(ElfN_Ehdr))

3.3 data段感染

在data段插入病毒代码:

  1. 增加data段大小
  2. 修改入口点为data段中的病毒代码
  3. 调整.bss节偏移
  4. 必要时修改data段权限(添加可执行权限)

四、ELF病毒实现实例分析

4.1 LPV病毒关键代码解析

_start() {
    __asm__(
        ".globl real_start\n"
        "real_start:\n"
        "pusha\n"
        "call do_main\n"  // 跳转到病毒主函数
        "popa\n"
        "jmp myend\n"     // 跳转到原始入口点
    );
}
  1. 感染流程

    • 遍历当前目录文件
    • 检查ELF文件头和感染标记
    • 定位text段并计算可用空间
    • 修改入口点和段大小
    • 插入病毒代码和跳转指令
  2. 关键技术点

    • 使用-nostdlib编译,避免依赖libc
    • 直接通过int 0x80进行系统调用
    • 动态计算内存地址(position independent)
    • 使用magic number标记已感染文件

4.2 系统调用封装

提供从0到6个参数的系统调用封装:

#define __syscall0(type,name) \
type name(void) \
{ \
    __asm__ volatile ("int $0x80" \
    : "=a" (__res) \
    : "0" (__NR_##name)); \
    return(type)__res; \
}
// 其他参数数量的类似定义...

五、防御与检测技术

  1. ELF病毒检测方法

    • 检查异常入口点
    • 查找text/data段异常扩展
    • 检测可疑的节/段权限
    • 扫描已知病毒特征码
  2. 防护措施

    • 使用NX/DEP保护(禁止数据段执行)
    • 文件完整性检查
    • 限制可执行文件写权限
    • 使用静态链接的重要程序

六、总结

ELF病毒技术涉及ELF文件格式的深入理解和精巧的二进制修改技术,关键点包括:

  1. 理解ELF文件结构和加载过程
  2. 掌握控制流劫持方法
  3. 实现位置无关的寄生代码
  4. 正确处理系统调用和字符串
  5. 选择适当的感染方法(Silvio/逆向/data段)

通过分析LPV等实际病毒代码,可以更深入理解这些技术的具体实现方式。同时,了解这些技术也有助于开发更有效的防御措施。

ELF病毒分析与实现技术详解 一、ELF文件格式基础 1.1 ELF文件类型 ELF(Executable and Linkable Format)是Linux系统下的标准可执行文件格式,主要分为以下几种类型: ET_ NONE :未知类型 ET_ REL :可重定位文件(.o文件) ET_ EXEC :可执行文件 ET_ DYN :共享目标文件(共享库) ET_ CORE :核心转储文件 1.2 ELF文件结构 ELF文件由以下几部分组成: ELF头(ELF Header) : 使用 readelf -h 查看 包含Magic number、文件类型、机器类型、入口点地址等信息 结构体定义在 usr/include/elf.h 中 节头表(Section Header Table) : 描述文件中的各个节(section) 主要用于链接和调试 重要节包括: .text :程序代码 .rodata :只读数据 .plt :过程链接表 .data :已初始化全局变量 .bss :未初始化全局变量 .got.plt :全局偏移表 .dynsym :动态符号表 .ctors/.dtors :构造函数/析构函数指针 程序头表(Program Header Table) : 描述文件中的段(segment) 用于程序加载和执行 重要段类型: PT_LOAD :可加载段 PT_DYNAMIC :动态链接信息段 PT_NOTE :操作系统规范信息 PT_INTERP :解释器路径 PT_PHDR :程序头表自身信息 二、ELF病毒核心技术 2.1 ELF病毒基本原理 ELF病毒的核心目标是 劫持控制流 ,通过修改ELF文件结构实现: 修改入口点或插入跳转指令,使程序先执行病毒代码 病毒代码执行后恢复原始执行流程 具备自我复制能力,感染其他可执行文件 2.2 ELF病毒关键技术 独立寄生代码 : 必须不依赖动态链接器 使用位置无关代码(PIC) 字符串处理需特殊处理(避免.rodata引用) 控制流劫持方法 : 修改ELF头中的入口点(e_ entry) 利用 .ctors/.init_array 中的构造函数 插入跳转指令(jmp/call) 系统调用使用 : 避免使用libc,直接通过int 0x80进行系统调用 常用系统调用包括:open/read/write/execve等 三、ELF病毒感染技术 3.1 Silvio填充感染 利用text段末尾的填充空间插入病毒代码: 增加节表偏移(ehdr->e_ shoff)一个页大小(PAGE_ SIZE) 定位text段程序头(phdr) 修改入口点为text段末尾 增加text段文件大小和内存大小 调整后续段和节的偏移量 在text段末尾插入病毒代码 3.2 逆向text感染 通过逆向扩展text段插入病毒代码: 减小text段虚拟地址,腾出空间 修改入口点为新腾出的空间 增加text段大小 调整后续段和节的偏移量 在腾出的空间插入病毒代码 最大可插入病毒代码大小计算: max_parasite_length = orig_text_vaddr - (0x1000 + sizeof(ElfN_Ehdr)) 3.3 data段感染 在data段插入病毒代码: 增加data段大小 修改入口点为data段中的病毒代码 调整.bss节偏移 必要时修改data段权限(添加可执行权限) 四、ELF病毒实现实例分析 4.1 LPV病毒关键代码解析 感染流程 : 遍历当前目录文件 检查ELF文件头和感染标记 定位text段并计算可用空间 修改入口点和段大小 插入病毒代码和跳转指令 关键技术点 : 使用 -nostdlib 编译,避免依赖libc 直接通过int 0x80进行系统调用 动态计算内存地址(position independent) 使用magic number标记已感染文件 4.2 系统调用封装 提供从0到6个参数的系统调用封装: 五、防御与检测技术 ELF病毒检测方法 : 检查异常入口点 查找text/data段异常扩展 检测可疑的节/段权限 扫描已知病毒特征码 防护措施 : 使用NX/DEP保护(禁止数据段执行) 文件完整性检查 限制可执行文件写权限 使用静态链接的重要程序 六、总结 ELF病毒技术涉及ELF文件格式的深入理解和精巧的二进制修改技术,关键点包括: 理解ELF文件结构和加载过程 掌握控制流劫持方法 实现位置无关的寄生代码 正确处理系统调用和字符串 选择适当的感染方法(Silvio/逆向/data段) 通过分析LPV等实际病毒代码,可以更深入理解这些技术的具体实现方式。同时,了解这些技术也有助于开发更有效的防御措施。