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,所以还要看最后一个节的属性是否可执行
此时就可以在最后一个节的末尾到结束这之间添加代码了
相关文章:

PE文件(六)新增节-添加代码作业
一.手动新增节添加代码 1.当预备条件都满足,节表结尾没有相关数据时: 现在我们将ipmsg.exe用winhex打开,在节的最后新增一个节用于存放我们要增加的数据 注意:飞鸽的文件对齐和内存对齐是一致的 先判断节表末尾到第一个节之间…...

ICRA 2024: NVIDIA 联合多伦多大学、加州大学伯克利分校、苏黎世联邦理工学院等研究人员开发了精细操作的手术机器人
英伟达(NVIDIA)正与学术研究人员合作,研究手术机器人。 NVIDIA 联合多伦多大学、加州大学伯克利分校、苏黎世联邦理工学院和佐治亚理工学院的研究人员开发了 ORBIT-Surgical,一个训练机器人的模拟框架,可以提高手术团…...
探索Go语言的原子操作秘籍:sync/atomic.Value全解析
引言 在并发编程的世界里,数据的一致性和线程安全是永恒的话题。Go语言以其独特的并发模型——goroutine和channel,简化了并发编程的复杂性。然而,在某些场景下,我们仍然需要一种机制来保证操作的原子性。这就是sync/atomic.V…...
【java深入学习第3章】利用 Spring Boot 和 Screw 快速生成数据库设计文档
免费多模型AI网站,支持豆包、GPT-4o、谷歌Gemini等AI模型,无限制使用,快去白嫖👉海鲸AI🔥🔥🔥 在开发过程中,数据库设计文档是非常重要的,它可以帮助开发者理解数据库结构࿰…...

继“三级淋巴结”之后,再看看“单细胞”如何与AI结合【医学AI|顶刊速递|05-25】
小罗碎碎念 24-05-25文献速递 今天想和大家分享的是肿瘤治疗领域的另一个热点——单细胞技术,我们一起来看看,最新出炉的顶刊,是如何把AI与单细胞结合起来的。 另外,今天是周末,所以会有两篇文章——一篇文献速递&…...

[图解]产品经理创新之阿布思考法
0 00:00:00,000 --> 00:00:01,900 那刚才我们讲到了 1 00:00:02,730 --> 00:00:03,746 业务序列图 2 00:00:03,746 --> 00:00:04,560 然后怎么 3 00:00:05,530 --> 00:00:06,963 画现状,怎么改进 4 00:00:06,963 --> 00:00:09,012 然后改进的模式…...

Proteus仿真小技巧(隔空连线)
用了好几天Proteus了.总结一下使用的小技巧. 目录 一.隔空连线 1.打开添加网络标号 2.输入网络标号 二.常用元件 三.运行仿真 四.总结 一.隔空连线 引出一条线,并在末尾点一下. 1.打开添加网络标号 选择添加网络标号, 也可以先点击按钮,再去选择线(注意不要点端口) 2.…...

抖音极速版:抖音轻量精简版本,新人享大福利
和快手一样,抖音也有自己的极速版,可视作抖音的轻量精简版,更专注于刷视频看广告赚钱,收益比抖音要高,可玩性更佳。 抖音极速版简介 抖音极速版是一个提供短视频创业和收益任务的平台,用户可以通过观看广…...

leetCode-hot100-数组专题之双指针
数组双指针专题 1.同向双指针1.1例题26.删除有序数组中的重复项27.移除元素80.删除有序数组中的重复项 Ⅱ 2.相向双指针2.1例题11.盛最多水的容器42.接雨水581.最短无序连续子数组 双指针在算法题中很常见,下面总结双指针在数组中的一些应用,主要分为两类…...

完成商品SPU管理页面
文章目录 1.引入前端界面1.将前端界面放到commodity下2.创建菜单3.进入前端项目,使用npm添加依赖1.根目录下输入2.报错 chromedriver2.27.2的问题3.点击链接下载压缩包,然后使用下面的命令安装4.再次安装 pubsub-js 成功5.在main.js中引入这个组件 4.修改…...

Ansible实战YAML语言完成apache的部署,配置,启动全过程
🏡作者主页:点击! 🏝️Ansible专栏:点击! ⏰️创作时间:2024年5月24日15点59分 目录 💯趣站推荐💯 🎊前言 ✨️YAML语言回顾 🎆1.编写YAML文…...
深入探索微软Edge:新一代浏览器的演进与创新
在数字时代的浪潮中,浏览器已不再只是简单的网页访问工具,而是成为了连接信息、服务与用户之间的重要桥梁。微软Edge作为微软公司推出的一款全新的浏览器,不仅承载着微软在互联网领域的最新愿景,还融合了多项前沿技术,…...
k8s使用Volcano调度gpu
k8s部署 https://www.yangxingzhen.com/9817.html cri-dockerd安装 https://zhuanlan.zhihu.com/p/632861515 安装nvidia-container-runtime https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 安装k8s-device-plugin https://…...
x的平方根-力扣
本题想到使用二分法不断逼近一个区间,直到最后趋近于x,从而求得解。注意的点,一开始使用 if(mid * mid < x) 进行判断时,会出现越界,原因是输入一个很大的数是,超过int表示的范围,继而修改为…...

hot100 -- 回溯(上)
目录 🍞科普 🌼全排列 AC DFS 🚩子集 AC DFS 🎂电话号码的字母组合 AC DFS 🌼组合总和 AC DFS 🍞科普 忘记 dfs 的,先看看这个👇 DFS(深度优先搜索…...
5.24数据库作业
考虑如下关系模式R(A,B.C.D,E,F)上的函数依赖集F: {A→BCD,BC→DE,B→D,D→A} 1、计算B的闭包。 2、(使用Armstrong公理)证明AF是超码。 3、计算上述函数依赖集F的正则覆盖;给出你的推导的步骤并解释。 4、基于正则覆盖࿰…...

go-zero 实战(5)
引入Prometheus 用 Prometheus 监控应用 1. 用 docker 启动 Prometheus 编辑配置位置,我将 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目录下 prometheus.yaml global:scrape_interval: 15s # 抓取间隔evaluation_interval: 15s # 评估…...

Python异常处理:打造你的代码防弹衣!
Hi,我是阿佑,上文咱们讲到——揭秘Python的魔法:装饰器的超能力大揭秘 ♂️✨,阿佑将带领大家通过精准捕获异常、使用with语句和上下文管理器、以及异常链等高级技巧来增强代码的健壮性。就像为代码穿上防弹衣,保护它…...

Linux——进程与线程
进程与线程 前言一、Linux线程概念线程的优点线程的缺点线程异常线程用途 二、Linux进程VS线程进程和线程 三、Linux线程控制创建线程线程ID及进程地址空间布局线程终止线程等待分离线程 四、习题巩固请简述什么是LWP请简述LWP与pthread_create创建的线程之间的关系简述轻量级进…...

ping 探测网段哪些地址被用
#!/bin/bash# 遍历192.168.3.1到192.168.3.254 for i in {1..254} doip"192.168.3.$i"# 对每个IP地址进行三次ping操作if ping -c 3 -W 1 $ip > /dev/null 2>&1thenecho "$ip: yes"fi done$ sh test.sh 192.168.3.1: yes 192.168.3.95: yes 192.…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...