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文件由以下几部分组成:
-
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病毒关键代码解析
_start() {
__asm__(
".globl real_start\n"
"real_start:\n"
"pusha\n"
"call do_main\n" // 跳转到病毒主函数
"popa\n"
"jmp myend\n" // 跳转到原始入口点
);
}
-
感染流程:
- 遍历当前目录文件
- 检查ELF文件头和感染标记
- 定位text段并计算可用空间
- 修改入口点和段大小
- 插入病毒代码和跳转指令
-
关键技术点:
- 使用
-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; \
}
// 其他参数数量的类似定义...
五、防御与检测技术
-
ELF病毒检测方法:
- 检查异常入口点
- 查找text/data段异常扩展
- 检测可疑的节/段权限
- 扫描已知病毒特征码
-
防护措施:
- 使用NX/DEP保护(禁止数据段执行)
- 文件完整性检查
- 限制可执行文件写权限
- 使用静态链接的重要程序
六、总结
ELF病毒技术涉及ELF文件格式的深入理解和精巧的二进制修改技术,关键点包括:
- 理解ELF文件结构和加载过程
- 掌握控制流劫持方法
- 实现位置无关的寄生代码
- 正确处理系统调用和字符串
- 选择适当的感染方法(Silvio/逆向/data段)
通过分析LPV等实际病毒代码,可以更深入理解这些技术的具体实现方式。同时,了解这些技术也有助于开发更有效的防御措施。