云计算百科
云计算领域专业知识百科平台

PE——新增节

优势

  • 代码 / 数据独立,不和原有节混杂,不会破坏原有节数据
  • 空间大小自己定义,可存放大体积 shellcode
  • 完整实操步骤

  • 打开 PE,定位节表位置(IMAGE_SECTION_HEADER数组)
  • 判断节表后面是否还有空余空间:
    ○ 每个节表占40字节;节表不能覆盖后面第一个节的原始数据
  • 在节表数组末尾,新增一整个IMAGE_SECTION_HEADER结构体:
    ○ Name:自定义节名,最多 8 字节
    在这里插入图片描述
    ○ VirtualSize:节内存实际大小
    在这里插入图片描述
  • ○ VirtualAddress (RVA): 读.reloc的 VirtualAddress+VirtualSize 再对齐:0x0ABAC0 + 0x0EF7C8 = 0x19B288 ,向上对齐0x1000 → 新节 VirtualAddress = 0x19C000
    在这里插入图片描述

    ○ SizeOfRawData:磁盘大小,向上对齐FileAlignment(0x200)
    在这里插入图片描述

    ○ PointerToRawData:读.reloc的PointerToRawData+SizeOfRawData0x0A7EC0 + 0x0EF800 = 0x1976C0,向上对齐FileAlignment(0x200) → 新节PointerToRawData = 0x197800
    在这里插入图片描述

    ○ 重定位、行号全部填 0
    ○ Characteristics:设置权限,shellcode 需要0x60000040(可读 + 可写 + 可执行)
    在这里插入图片描述

  • 修改IMAGE_FILE_HEADER → NumberOfSections:节数量 + 1在这里插入图片描述

    改为10 00

  • 计算新镜像总大小:新节RVA + VirtualSize,向上对齐SectionAlignment(0x1000),写入SizeOfImage
    新节 RVA=0x19C000,VirtualSize=0x1000
    0x19C000+0x1000 =0x19D000

  • 在磁盘文件PointerToRawData偏移处,追加对应大小的 00,写入 shellcode

  • 修改入口点(OEP),JMP 跳转到新节 shellcode,执行完再跳回原 OEP

  • 运行测试,保证原程序功能正常

  • 三种技术对比

    方式优点缺点适用场景
    洞穴注入 不改节表,改动最小 空间有限,容易破坏原有数据 小段 shellcode
    扩大最后一节 不用新增节表 只能操作最后一节,容易破坏资源节 中等长度代码
    新增节 完全独立,不污染原有节 改动项多,步骤繁琐 大段 shellcode,shellcode 开发
    赞(0)
    未经允许不得转载:网硕互联帮助中心 » PE——新增节
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!