当前位置: 首页 > news >正文

PE文件(六)新增节-添加代码作业

一.手动新增节添加代码

1.当预备条件都满足,节表结尾没有相关数据时:

现在我们将ipmsg.exe用winhex打开,在节的最后新增一个节用于存放我们要增加的数据

注意:飞鸽的文件对齐和内存对齐是一致的

先判断节表末尾到第一个节之间是否够80字节:可选PE头中SizeOfHeaders值为0x1000,标准PE头中SizeOfOptionalHeader获取可选pe头的大小值为0xE0,NumberOfSections获取节的数量为0x4,DOS头中e_lfanew获取NT的地址为0xE0,PE签名大小0x04,标准PE头大小0x14,通过0x1000 - (0xE0 + 0x4 + 0x14 + 0xE0 + 0x4 * 0x28)= 0xD88获取节表到节之间的空白区大小,因为0xD88 > 0x50,所以可以存下新增节表。在实际操作中,我们肉眼便可判断空间是否足够

我们将.text节表(注意是第一个节表)的40字节复制一份到节表末尾地址0x278:选中.text40字节复制,再选中0x278到后面40字节数据粘贴,这样我们就把.text节表内容复制一份添加到节表末尾作为新节表的40字节

注:winhex中write是覆盖选中数据,paste是插入

接着为了满足Windows格式要求将新增节后面的40字节数据改为0

修改PE标准头中的NumberOfSections值为4 + 1 = 5

先看一下文件对齐和内存对齐都是0x1000,所以我们新增的节大小为了方便后面修改可以设定为0x1000字节大小,这已经足够存放我们想要添加的代码了。(如果文件对齐和内存对齐不一样,那可以选择两个的最小公倍数,方便后面的修改)

接着修改可选PE头中SizeOfImage值:由于我们想要新增节的大小为0x1000(考虑了内存对齐),所以将SizeOfImage + 0x1000即可,0x3D000 + 0x1000 = 0x3E000

然后修改节表中的字段:

Name:名字改为.tttt 2E 74 74 74 74

Misc.VirtualSize:直接写0x1000,即内存中对齐前的长度

VirtualAddress:0x30000 + 0x4000 + 0x4000 + 0x4000 + 0x4000 = 0x3D000 第一个节的VirtualAddress时0x300000,一共四个节,每个节对齐后是0x4000大小,加起来就是0xD0000

SizeOfRawData:0x1000

PointerToRawData:0x2C000 + 0xD000 = 0x39000

属性值不用变,因为复制的.text节表已经满足了可执行的属性

现在我们要在文件第四个节末添加新节,选中节末最后一个数据,右键–edit–paste zero bytes–输入新节的大小十进制大小4096,将其初始化为0

新增节后我们将要添加的代码加到新节中,这里就使用前两节应用的shellcode,就是运行飞鸽后先弹一个框,再正常运行,但是此时还要计算一下E8和E9后面的值:

E8后面的值:X = 0x77D36476 - (0x400000 + 0x3D000 + 0x8 + 0x5) = 0x778F9469 注意0x77D36476为MessageBoxA API地址

E9后面的值:X = 0x400000 + 0x1D26F - (0x400000 + 0x3D000 + 0xD + 0x5) = 0xFFFE025D

所以将完整的代码(硬编码)添加到新节中:

最后将OEP的值改为0x3D000

保存,运行后发现先弹框再正常打开程序,成功

2.节表结尾有数据整体上移的情况

我们打开记事本复件notepad_test.exe,找到节表末,发现这里有一些我们不认识的数据,而且是紧挨着节表的,所以这种情况下我们没法在节表末新增节表

此时我们发现DOS头结尾到PE签名之间是垃圾数据,如果将PE签名一直到节表末之间的所有数据整体上紧挨着DOS头后面,接着将e_lfanew字段值改为0x40,此时节表末便空出来了0xE8 - 0x40 = 0xA8字节内存,足够存放80字节,即两个节表大小了

选中0xE8到0x258的全部数据复制,从0x40开始write覆盖0x258 - 0xE8 = 0x170字节数据,接着将此时节表末尾多空出来的数据改为0,再修改e_lfanew的值为0x40即可。此时0x1B0到0x258之间就空出来了0xA8字节,在这里新增节即可

后面新增节的过程与条件都满足时一模一样,不再演示

二.代码实现新增一个节,并添加代码

三.编程实现扩大最后一个节,并添加代码

 3.整体上移后空间还不够,扩大最后一个节

如果整体上移覆盖DOS Stub后空间还不够两节表宽度,那么就要采用扩大最后一个节的方式。注意不要扩大其他的节,因为如果不是最后一个节扩大的话,其他的节扩大会造成其下面的全部节的数据偏等等诸多问题

需要修改SizeOfImage,比如我想扩大500字节,那么要满足内存对齐,所以SizeOfImage应该 + 0x1000,这里为了方便后面的修改,直接就按照内存对齐来扩大,所以扩大0x1000字节即可

接着就是修改最后一个节表的属性:

VirtualAddress和PointerToRawData的值都不用改变

VirtualSize:SizeOfImage - VirtualAddress + Ex,再内存对齐(这里为了方便,Ex可以直接选文件对齐粒度和内存对齐粒度的最小公倍数,这样就不用再考虑内存对齐了),就是最后注入shellcode时不好判断Ex+原来空白区大小是否足够存下shellcode了,不过可以直接在Ex区域注入shellcode即可,不用考虑原来此节的空白区

SizeOfRawData:因为文件对齐一般都为0x200或0x1000,这里直接等于VirtualSize即可(因为VirtualSize此时肯定即是0x200的整数倍,也是0x1000的整数倍)

因为扩大节的目的是为了添加shellcode,所以还要看最后一个节的属性是否可执行

此时就可以在最后一个节的末尾到结束这之间添加代码了

http://www.lryc.cn/news/352459.html

相关文章:

  • ICRA 2024: NVIDIA 联合多伦多大学、加州大学伯克利分校、苏黎世联邦理工学院等研究人员开发了精细操作的手术机器人
  • 探索Go语言的原子操作秘籍:sync/atomic.Value全解析
  • 【java深入学习第3章】利用 Spring Boot 和 Screw 快速生成数据库设计文档
  • 继“三级淋巴结”之后,再看看“单细胞”如何与AI结合【医学AI|顶刊速递|05-25】
  • [图解]产品经理创新之阿布思考法
  • Proteus仿真小技巧(隔空连线)
  • 抖音极速版:抖音轻量精简版本,新人享大福利
  • leetCode-hot100-数组专题之双指针
  • 完成商品SPU管理页面
  • Ansible实战YAML语言完成apache的部署,配置,启动全过程
  • 深入探索微软Edge:新一代浏览器的演进与创新
  • k8s使用Volcano调度gpu
  • x的平方根-力扣
  • hot100 -- 回溯(上)
  • 5.24数据库作业
  • go-zero 实战(5)
  • Python异常处理:打造你的代码防弹衣!
  • Linux——进程与线程
  • ping 探测网段哪些地址被用
  • OSPF问题
  • asgasgas
  • Go语言实现人脸检测(Go的OpenCV绑定库)
  • springboot中线程池的使用
  • ubuntu20.04 开机自动挂载外加硬盘
  • 5.18 TCP机械臂模拟
  • linux---线程控制
  • 低代码开发:拖拽式可视化构建工业物联网系统
  • 【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇
  • webpack 学习之 五大核心
  • Android逆向抓包技巧 - Hook 底层通信