PE文件(七)扩大节合并节数据目录

添加shellcode有以下几种的方式:

1.直接在任意节的空白区添加代码

2.新增节添加代码

3.扩大最后一个节添加代码

4.合并节并添加代码

今天我们学习如何扩大节,合并节

扩大节

在上一节的学习中,我们可以通过上移NT头和节表覆盖DOS Stub以获取足够的空白区来增加新的节表以及后续新增节,但是当整体上移覆盖DOS Stub之后,多出来的空白区域还不够新增节表时,我们就可以使用扩大最后一个节的方法来添加我们的shellcode

扩大节主要用于当我们在任意空白区添加比较多的代码,但空白区不够时使用,我们通常扩大最后一个节。这是因为当我们扩大其他某个节时,其他节的偏移量之类的属性都需要修改,这样很麻烦。而选择扩大最后一个节,这样就不用修改其他节的属性了

扩大节步骤:

1.拉伸到内存

2.分配一块新的空间:SizeOfImage + EX

3.将最后一个节的SizeofRawDateVirtualSize改成N

N = (SizeofRawDateVirtualSize内存对齐后大者的值) + EX

SizeofRawDate = VirtualSize

4.修改SizeOfImage大小为SizeOfImage + EX

就直接把要添加的代码加到最后一个节中即可,这样可以保证不影响上面的所有地址。具体操作参考代码区空白区添加代码文章

注意事项:

1.文件加载到内存后,最后一个节的VirtualAddress + VirtualSize对齐后的位置就是一个文件在内存中的结束位置,即SizeOfImage。文件在硬盘上时,最后一个节的PointerToRawData + SizeOfRawData的位置就是整个文件再硬盘上的结尾。

2.文件在内存中,节与节之间的排列是根据VirtualAddress和VirtualSize以及其内存对齐后的结果进行判断。如果在硬盘上,节与节之间的排列,是根据PointerToRawData和SizeOfRawData来判断,这是因为SizeOfRawData已经是文件数据经过对齐后的结果了

合并节

当我们整体上移后,留出来的空白区域不足以添加我们新的节表时,我们便可以利用合并节来添加数据了,将添加的代码加到最后一个节的空间中。由于内存对齐的原因,我们会有很大一部分的空间供我们去添加代码。这样可以保证不影响上面的所有相对地址的计算

注意:合并节一定要在ImageBuffer中进行操作,不然在FileBuffer容易出现错误,比如节中未初始化数据在拉伸后导致节变大等等情况。

合并节就是将所有的节表只保留第一个(其他节表可删可不会删,因为这些数据没有意义了),把第一个节开始一直到最后一个节的结尾都当成第一个节

但是可能会造成合并后文件变大,因为文件对齐粒度一般都要小于内存对齐粒度,所以虚拟内存中每个节的空白区一般比文件空白区要大一些,现在合并节是把虚拟内存中从第一个节开始到文件结束都当成一个节,最后再变成FileBuffer就会变大。

步骤:

1.NumberOfSections改成1

2.修改第一个节表的字段

VirtualSize:

方法一:SizeOfImage - 第一个节VirtualAddress

方法二:还可以通过最后一个节的VirtualAddress + 最后一个节的VirtualSize内存对齐后的大小 - SizeOfHeader内存对齐后的大小获取整个VirtualSize

方便起见我们选择方法一

SizeOfRawData:等于VirtualSize即可

将第一个节的属性改为包含所有节的属性,即用第一个节的属性与其他的节的属性做或运算

数据目录

数据目录的引入

可选PE头时,有一个字段为DWORD NumberOfRvaAndSizes,NumberOfRvaAndSizes的值表示_IMAGE_DATA_DIRECTORY DataDirectory[16];这种类型的结构体的数量

Win32操作系统下,PE文件不仅有文件本身的数据,编译器也会替我们往每一个节中加很多重要的内容:比如一个文件使用系统提供的函数时,编译器就会在PE文件中添加这些函数的相关信息,告诉该文件在运行时需要去哪里找到这个函数并进行系统调用。由于一个程序不仅可以使用系统的函数,也可以提供函数给别的文件使用,所以此时编译器会添加此程序中供别人使用的函数相关信息

编译器添加的内容包含了诸如:PE程序的图标位置,用到了哪些系统提供的函数,为其他的程序提供哪些函数等各种信息,如果编译器不添加这些数据的话,程序就找不到这些东西的地址,程序也无法正常运行。

数据目录的作用

每个PE文件都有16个数据目录用来记录编译器在PE文件中添加的16种不同的信息,并说明这些信息存在在哪里

数据目录的内容

可选PE头最后一个成员,就是数据目录,一共有16个

分别是:导出表的数据目录、导入表的数据目录、资源表的数据目录、异常信息表的数据目录、安全证书表的数据目录、重定位表的数据目录、调试信息表的数据目录、版权所有表的数据目录、全局指针表的数据目录、TLS表的数据目录、加载配置表的数据目录、绑定导入表的数据目录、IAT表的数据目录、延迟导入表的数据目录、COM信息表的数据目录、最后一个保留未使用

其中比较重要的就是导出表、导入表、重定位表、IAT表这四张表的数据目录,这四张表和程序的运行有直接关系,不管是加壳、脱壳、破解、病毒或反病毒,这些都是基础中的基础

数据目录的结构

结构如下:

struct _IMAGE_DATA_DIRECTORY{

    DWORD VirtualAddress;  //内存偏移,必须有

       DWORD Size;  //大小,破坏了也不会影响程序运行

};

16个数据目录的大小一样,都是8字节

手动查找数据目录

从节表开始往上倒着推8行,就是数据目录开始

也可以从可选PE头开始,往后数第25个DWORD就是数据目录开始

上图中前8字节是导出表的数据目录:当中前4个字节为导出表的VirtualAddress–0x0;后4字节为导出表的Size–0x0,说明此可执行文件没有导出表

再接着8字节为导入表的数据目录:前4字节为为导入表的VirtualAddres–0x6D20;后4字节为导入表的Size–0xC8,此可执行文件的导入表在ImageBase + 0x6D20处开始,大小为0xC8

下面以此类推

数据目录的应用

数据目录只是记录了对应的表的内存偏移地址和大小。我们通过找到相应表的数据目录,得到相应表的内存偏移地址,然后加上ImageBase才是相应表本身真正的所在位置!

举例:我们找到导出表的数据目录,通过数据目录中的VirtualAddress + ImageBase得到导出表所在的地址

IMAGE_DIRECTORY_ENTRY_EXPORT

struct _IMAGE_DATA_DIRECTORY {

    DWORD VirtualAddress;

    DWORD Size;

};

如图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端技术回顾系列 08|TS 泛型基础

在微信中阅读,关注公众号:CodeFit。 创作不易,如果你觉得这篇文章对你有帮助,请不要忘了 点赞、分享 和 关注 我的公众号:CodeFit,为我的持续创作提供一些动力。 上篇内容回顾:枚举(Enums) 在上篇文章中,我们详细回顾了 TypeScript 中的 枚举(Enums)。 枚举 是一…

spark第三篇sql

spark第三篇sql sparksql概述sparksql四大特性dataframe概述通过读取数据源创建dataFrameDataFrame常用操作DataSet将RDD转换为DataFrame代码开发sparksql 操作hivesqlsparksql读取mysql表中的数据sparksql将结果数据写入到mysql中 sparksql概述 1、sparksql发展史 shark为spa…

HTML静态网页成品作业(HTML+CSS)—— 环保主题介绍网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

MQ解决的问题

系统中MQ能解决哪些问题? 1.不同语言的程序使用MQ通信 2.分布式,微服务,之间的通信,实现服务质检解耦 3.高并发实现销峰作用 4.实现异步,提高用户体验。

“程序员职业素养全解析:技能、态度与价值观的融合“

文章目录 每日一句正能量前言专业精神专业精神的重要性技术执着追求的故事结论 沟通能力沟通能力的重要性团队合作意识实际工作中的沟通案例结论 持续学习持续学习的重要性学习方法进步经验结论 后记 每日一句正能量 梦不是为想象,而是让我们继续前往。 前言 在数字…

Python数据分析与机器学习在电子商务推荐系统中的应用

文章目录 📑引言一、推荐系统的类型二、数据收集与预处理2.1 数据收集2.2 数据预处理 三、基于内容的推荐3.1 特征提取3.2 计算相似度3.3 推荐物品 四、协同过滤推荐4.1 基于用户的协同过滤4.2 基于物品的协同过滤 五、混合推荐与评估推荐系统5.1 结合推荐结果5.2 评…

docker 下载镜像发现超时,加速加速方法

报错原因有可能旧的不能用了!!!换下面的!!! cat /etc/docker/daemon.json "registry-mirrors": ["https://bhu1x6ya.mirror.aliyuncs.com"] 编辑完成后执行以下命令重启docker即可&a…

企业官网:过时了,但又没完全过时

作为一名互联网冲浪级选手,我经常会看到一些有趣的产品。 这两年比较让我感兴趣的产品有「飞聊」、「即刻」及其旗下的「橙 App」等等,然后我就想上它们的官网看看。 虽然现在 app 是主流,但我非常不喜欢下载 app,一是麻烦&…

基于STM32开发的智能空气质量监控系统

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取,感谢支持!⬇ 点击领取更多嵌入式详细资料 问题讨论,stm32的资料领取可以私信! 目录 引言环境准备智能空气质量监控系统基础代码实现&…

【吊打面试官系列-Mysql面试题】MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 ?

大家好,我是锋哥。今天分享关于 【MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 ?】面试题,希望对大家有帮助; MySQL_fetch_array 和 MySQL_fetch_object 的区别是什么 ? 以下是 MySQL_fetch_array 和 MySQL…

高考志愿填报的技巧和方法

高考过后,最让家长和学生需要重视的就是怎样填报志愿。高考完和出成绩之前有一段很长的时间,而成绩出来之后往往报考的时间非常的紧张。在很短的时间内,高考的学生和他的家长要综合高考的成绩,考虑院校,专业&#xff0…

【9】openssl 代码调试

0x01 前言 最近在学习密码学,但是国密算法(SM2,SM3,SM4,SM9)的细节都在openssl项目里,当然一些国际算法也在。想着看下代码执行过程和理论结合起来。中间走了一些弯路,做个笔记。 0x02 openssl安装 一开始认为是不是直接下载好的…

万向节锁死(Gimbal Lock)

Gimbal Lock是一个常见的3D动画问题,主要由旋转顺序引起的。我来详细解释一下它的成因: 在三维空间中,任何旋转都可以分解为绕X,Y,Z三个轴的欧拉旋转(Euler Rotation)。每个轴的旋转是按照一定顺序进行的,比如XYZ或ZYX等。 理论上,通过这三个旋转值的组合,可以达到任意的空间…

14. RTCP 协议

RTCP 协议概述 RTCP(Real-time Transport Control Protocol 或 RTP Control Protocol 或简写 RTCP),实时传输控制协议,是实时传输协议(RTP)的一个姐妹协议。 注:RTP 协议和 RTP 控制协议&#…

Policy-Based Reinforcement Learning(1)

之前提到过Discount Return: Action-value Function : State-value Function: (这里将action A积分掉)这里如果策略函数很好,就会很大;反之策略函数不好,就会很小。 对于离散类型: …

QPS,平均时延和并发数

我们当前有两个服务A和B,想要知道哪个服务的性能更好,该用什么指标来衡量呢? 1. 单次请求时延 一种最简单的方法就是使用同一请求体同时请求两个服务,性能越好的服务时延越短,即 R T 返回结果的时刻 − 发送请求的…

error 12154 received logging on to the standby报错处理

错误 处理方法 该参数不是主库的servicename (低级错误) SQL> alter system set log_archive_dest_2 SERVICEstandby ASYNC VALID_FOR(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAMEstandby; System altered. 观察主库日志: 备库日志: 该问题会影…

SpringBoot 配置事务

SpringBoot 在启动时已经加载了事务管理器,所以只需要在需要添加事务的方法/类上添加Transactional即可生效,无需额外配置。 TransactionAutoConfiguration 事务的自动配置类解析: SpringBoot 启动时加载/META-INF/spring/org.springframewor…

月薪6万,想离职...

大家好,我是无界生长,国内最大AI付费社群“AI破局俱乐部”初创合伙人。这是我的第 39 篇原创文章——《月薪6万,想离职...》 是的,你没有看错,我月薪6万,却想离职,很不可思议吧?周围…

matlab使用教程(95)—显示地理数据

下面的示例说明了多种表示地球地貌的方法。此示例中的数据取自美国商务部海洋及大气管理局 (NOAA) 国家地理数据中心,数据通告编号为 88-MGG-02。 1.关于地貌数据 数据文件 topo.mat 包含地貌数据。topo 是海拔数据,topomap1 是海拔的颜色图。 load t…