Linux病毒技术之逆向text感染
字数 1190 2025-08-05 08:18:36

Linux病毒技术之逆向text感染详解

一、逆向text感染技术概述

逆向text感染是一种针对ELF格式可执行文件的病毒注入技术,它通过修改ELF文件头中的text段内存映射地址,向低地址方向扩展内存空间来注入寄生代码。

核心原理

  • 利用ELF文件默认加载地址(32位0x8048000/64位0x400000)之前的未使用内存空间
  • 通过减小text段的虚拟地址(p_vaddr)来扩展内存映射范围
  • 在扩展的空间中注入寄生代码并修改程序入口点

二、ELF内存装载基础

关键知识点

  1. 默认加载地址

    • 32位程序:0x8048000
    • 64位程序:0x400000
  2. 内存映射规则

    • 内核根据程序头表中的p_vaddr属性加载内容
    • 主要加载text段(代码段)和data段(数据段)
  3. 最小虚拟映射地址

    • /proc/sys/vm/mmap_min_addr定义(通常为4096/0x1000)
    • 扩展长度必须是此值的整数倍

三、逆向text感染实现步骤

1. 修改节头表偏移

o_shoff = e_hdr->e_shoff;
e_hdr->e_shoff += PAGE_SIZE; // 增加一个页大小(4096)

2. 修改text段程序头

p_hdr[i].p_vaddr -= PAGE_SIZE;   // 减小虚拟地址
p_hdr[i].p_paddr -= PAGE_SIZE;   // 减小物理地址
p_hdr[i].p_filesz += PAGE_SIZE;  // 增加文件大小
p_hdr[i].p_memsz += PAGE_SIZE;   // 增加内存大小

3. 调整其他区段偏移

// 除text段外的所有程序头偏移增加
p_hdr[i].p_offset += PAGE_SIZE;

// 所有节头偏移增加
s_hdr[i].sh_offset += PAGE_SIZE;

4. 修改程序入口点

entry_point = e_hdr->e_entry;  // 保存原始入口点
e_hdr->e_entry = p_hdr[i].p_vaddr;  // 设置为新text段起始地址
e_hdr->e_entry += sizeof(*e_hdr);    // 加上ELF头大小

5. 调整程序头偏移

e_hdr->e_phoff += PAGE_SIZE;

6. 插入寄生代码

// 写入文件头
write(ofd, mem, ehdr_size);

// 写入寄生代码(包含跳转回原始入口点的指令)
*(unsigned int *)&parasite[return_entry_start] = entry_point;
write(ofd, parasite, psize);

// 填充剩余空间并写入原文件内容
lseek(ofd, ehdr_size + PAGE_SIZE, SEEK_SET);
write(ofd, mem + ehdr_size, st.st_size - ehdr_size);

四、寄生代码示例

典型寄生代码结构

push 0xXXXXXXXX  ; 原始入口点地址
ret              ; 返回到原始程序

C语言表示

char parasite[] = "\x68\x00\x00\x00\x00\xc3"; 
// \x68是push指令,\xc3是ret指令

五、感染前后对比

感染前text段

LOAD 0x000000 0x400000 0x400000 0x0824 0x0824 R E 200000

感染后text段

LOAD 0x000000 0x3ff000 0x3ff000 0x1824 0x1824 R E 200000

变化:

  • 虚拟地址从0x400000变为0x3ff000(减小0x1000)
  • 文件大小从0x824变为0x1824(增加0x1000)

六、关键注意事项

  1. 对齐要求

    • 所有修改必须符合页对齐(通常4096字节)
    • 寄生代码长度不能超过一个页减去ELF头大小
  2. 兼容性问题

    • 需要考虑不同架构的默认加载地址
    • 注意32位和64位ELF结构的差异
  3. 寄生代码设计

    • 必须保留原始程序功能
    • 需要正确跳转回原始入口点

七、完整实现代码解析

代码主要分为以下几个部分:

  1. 初始化检查

    • 验证文件是否为有效ELF
    • 获取文件大小并映射到内存
  2. ELF头修改

    • 调整节头表偏移
    • 修改text段程序头属性
    • 更新程序入口点
  3. 文件重构

    • 写入修改后的ELF头
    • 插入寄生代码
    • 写入原始文件内容

八、防御措施

了解攻击技术的同时也应了解防御方法:

  1. ELF文件完整性检查

    • 验证程序头表是否被修改
    • 检查text段虚拟地址是否异常
  2. 地址空间随机化(ASLR)

    • 使内存布局不可预测
    • 增加注入难度
  3. 代码签名

    • 验证可执行文件的数字签名
    • 防止未经授权的修改

九、总结

逆向text感染技术通过利用ELF加载机制中的内存映射特性,实现了在保持原始程序功能的同时注入寄生代码。理解这一技术不仅有助于分析恶意软件,也能帮助开发更安全的ELF文件保护机制。

关键要点:

  1. 利用text段前的未使用内存空间
  2. 通过修改程序头表实现内存扩展
  3. 精心设计的寄生代码必须保留原始程序功能
  4. 所有修改必须符合ELF规范和系统内存管理要求
Linux病毒技术之逆向text感染详解 一、逆向text感染技术概述 逆向text感染是一种针对ELF格式可执行文件的病毒注入技术,它通过修改ELF文件头中的text段内存映射地址,向低地址方向扩展内存空间来注入寄生代码。 核心原理 利用ELF文件默认加载地址(32位0x8048000/64位0x400000)之前的未使用内存空间 通过减小text段的虚拟地址(p_ vaddr)来扩展内存映射范围 在扩展的空间中注入寄生代码并修改程序入口点 二、ELF内存装载基础 关键知识点 默认加载地址 : 32位程序:0x8048000 64位程序:0x400000 内存映射规则 : 内核根据程序头表中的p_ vaddr属性加载内容 主要加载text段(代码段)和data段(数据段) 最小虚拟映射地址 : 由 /proc/sys/vm/mmap_min_addr 定义(通常为4096/0x1000) 扩展长度必须是此值的整数倍 三、逆向text感染实现步骤 1. 修改节头表偏移 2. 修改text段程序头 3. 调整其他区段偏移 4. 修改程序入口点 5. 调整程序头偏移 6. 插入寄生代码 四、寄生代码示例 典型寄生代码结构 C语言表示 五、感染前后对比 感染前text段 感染后text段 变化: 虚拟地址从0x400000变为0x3ff000(减小0x1000) 文件大小从0x824变为0x1824(增加0x1000) 六、关键注意事项 对齐要求 : 所有修改必须符合页对齐(通常4096字节) 寄生代码长度不能超过一个页减去ELF头大小 兼容性问题 : 需要考虑不同架构的默认加载地址 注意32位和64位ELF结构的差异 寄生代码设计 : 必须保留原始程序功能 需要正确跳转回原始入口点 七、完整实现代码解析 代码主要分为以下几个部分: 初始化检查 : 验证文件是否为有效ELF 获取文件大小并映射到内存 ELF头修改 : 调整节头表偏移 修改text段程序头属性 更新程序入口点 文件重构 : 写入修改后的ELF头 插入寄生代码 写入原始文件内容 八、防御措施 了解攻击技术的同时也应了解防御方法: ELF文件完整性检查 : 验证程序头表是否被修改 检查text段虚拟地址是否异常 地址空间随机化(ASLR) : 使内存布局不可预测 增加注入难度 代码签名 : 验证可执行文件的数字签名 防止未经授权的修改 九、总结 逆向text感染技术通过利用ELF加载机制中的内存映射特性,实现了在保持原始程序功能的同时注入寄生代码。理解这一技术不仅有助于分析恶意软件,也能帮助开发更安全的ELF文件保护机制。 关键要点: 利用text段前的未使用内存空间 通过修改程序头表实现内存扩展 精心设计的寄生代码必须保留原始程序功能 所有修改必须符合ELF规范和系统内存管理要求