WindowsPE文件格式入门03.节表

https://www.bpsend.net/thread-306-1-1.html

dump

我们点击运行程序进程加载时时,是把文件里面的数据映射进内存,这样进程里面的内存就拿到了各种各样的代码,数据等资源,但是如果我们反着来,就可以从进程的内存里把 exe 文件提出来,这个过程叫做dump过程

dump过程在对抗里面经常用到


第一代的壳功能比较简单,当时的加壳软件在运行时一定会在内存中还原代码。OS可以根据PE信息,将文件的数据映射到内存中,那么可以进行反操作,将解密后的内存中的代码保存到文件中,这就称为内存dump。

内存dump可以跳过壳的各种复杂算法,直面原始代码。内存dump可以称为万能的脱壳方式。

img

  • 映射:按照节表的内容,将PE文件按照节表信息和节数据依次映射进入内存。
  • DUMP:将内存中的数据按节表数据将目标数据拷贝出来成为一个PE.exe文件

dump的先决条件**:在OEP处dump,此时全局变量里的值未被初始化,不会存在全局变量的访问异常。**

手动Dump

描述Dump的原理,内存中需要dump的数据,PE头,节数据。

  1. 拷贝PE文件头。
    1. 根据PE模块确定模块基址,在内存中找到文件头的位置,根据文件头大小将头数据dump到新文件中 。
  2. dump节数据。
    1. 获取节的RVA(相对虚拟地址),计算出VA(内存绝对地址),根据文件大小和内存大小字段dump到新文件中。
  3. 依次拷贝完所有节,保存关闭。
    1. 文件大小 = 0,则不需要dump,表示该节中都是未初始化的数据
    2. 文件大小 > 内存大小,则dump文件大小的数据
    3. 文件大小 < 内存大小,同样dump文件大小的数据,表示其他数据是未初始化的数据
演示

可以把整个内存数据拷贝出来放到文件,但是这样数据偏移就会有问题,需要自己去修节表,还可以按照节表结构去拷贝出来,下面就是演示按节表结构拷贝

  1. 首先用winhex打开需要dump的进程
  2. 把PE头拷贝出来
  3. 按照节表结构解析数据,拷贝出来
从内存S3处开始,拷贝S2大小的数据,到文件S1处
typedef struct _IMAGE_SECTION_HEADER {...
  DWORD VirtualAddress;         // S3:内存地址:基于模块基址,与SectionAlignment对齐(0x1000)
  DWORD SizeOfRawData;          // S2:文件大小,与FileAlignment对齐(0x200)
  DWORD PointerToRawData;       // S1:文件偏移,与FileAlignment对齐(0x200)
  ...
 }

img

img

img

拷贝节数据

img

img

img

img

img

img

img

img

至此数据拷贝完了,包数据保存去运行,发现功能正常,所以拷贝是成功的

插件Dump

一般的调试工具或者PE工具 例如x64,OD本身有dump的的功能和插件

OD

img

img

X64dbug

img

img

Dump时机不对原理:

  1. 原因:dump的时机不对。程序运行中,此时全局变量中的值需要做修改,不为NULL,跳过了程序的空指针检查,导致指针访问异常。

如果程序运行起来以后,全局变量里面已经有值了,此时dump,则会将全局变量的值也dump到新文件。当dump后的文件运行时,里面有值,就越过了空检查,然而此时的的值是错误的,导致了内存访问异常。

Dump有值的原因

LPBYTE g_p = NULL
if g_p != NULL
{
    g_p = new BYTE[0x1000];
}//使用

因此 dump最好的时间就是代码还没执行的时候,即在程序的入口点,所以要找oep,可以用调试器把程序在入口点挂起,再去dump

 

反内存Dump

依据Dump原理

根据dump原理,删除或者改变PE头中用到的关键信息,或者破坏PE信息,使得dump到的新文件,windwos不支持。

比如:

  • 修改节的内存地址,欺骗攻击者或者工具,使得dump到错误的数据
  • 修改PE中的关键数据,使得即使dump到正确的代码,也不能正确执行,比如PE镜像大小(和计算出的大小不一致,OS就有可能不承认)
  • 加载PE后抹除导入表数据。
对抗方法

直接从PE文件中Dump获取数据。

导入表对抗:

加壳软件分次解密:

  • 对抗方法:分层dump

节表注入


代码注入的一种,将代码添加到现有节数据中,或则是新增一个节当中,然后修改OEP指向新增的代码处,OEP执行完成后重新跳转到Old OEP处。

利用节空隙

  1. 添加节区数据
  2. 节表添加一项 , 节表个数 NumberOfSections + 1
  3. 修改 SizeOfImage 大小 ,原大小加上节区数据对齐后的大小

将自定义机器码直接写入PE文件内的空闲位置处。

  • 缺陷:节之间的大小,可能不够使用。且仅限用于手动做,写代码做就很麻烦。对 00 00 00 00 是否有效不好掌控。
  • 应用举例:CHI病毒。写PE.exe ->运行程序执行流程 -> jmp 到原来 OEP
注入流程:
  1. 寻找节与节之间的空隙,很多 00 00 00 00 处,手动构造机器码,注意绝对地址的使用。

img

  1. 修改OEP
  2. 执行自己的流程
  3. 执行完流程jmp到原来的OEP
操作演示

把winmine 加入到我们的 PE 程序中

  1. 首先在 winhex 中 打开2个 可执行文件

img

  1. 把winmin的所有数据拷到PE.exe 最后面

img

img

img

  1. 增加一个节

img

  1. 修改内存总大小和节数量

img

用OD打开程序,可以看到扫雷数据成功写入了我们程序中

img

注意:像这种节表后面有数据的是没有办法使用添加节的

img

新增一个节

  • 新增一个节,将数据放到最后。
  • 优点:数据有多大,就放多大。
  • 缺陷:对于有的程序,当节表后面没有空隙,即有附加数据,直接跟了数据的程序不适用
  • 影响的字段:
    • IMAGE_FILE_HEADER
    • NumberOfSections 节的个数
    • IMAGE_OPTIONAL_HEADER
    • OEP
    • SizeOfImage:在内存中所占内存的大小
    • SIzeOfHeaders:PE文件格式总大小。如果节表够多,一般不小于400h

步骤:

  1. IMAGE_FILE_HEADER 中的NumberOfSections 增加1
  2. 节表中增加一项
  3. PE中添加节数据,数据必须跟文件对齐值对齐。
  4. 修改IMAGE_OPTIONAL_HEADER 中的SizeOfImage 和 AddressOfEntryPoint
  5. 增加节,很明显,我们首先要该的是节的个数,并将新的节的属性增加到IMAGE_SECTION_HEADER的后面
    1. 这里会遇到一个问题,通过修改,PE的头部大小可能不支持我们增加一个节,这时需要我们先插入一个文件对齐值大小的控件,再将节数据写入文件
    2. 这时就会增加文件头部大小,我们需要对PE的数据进行修正,包括头部大小以及所有节的文件地址,所有节的文件地址+文件对齐值
  6. 增加节的内容,即注入代码,需要注意的是,增加的文件内容也是需要文件对齐的,不足补0
  7. 修改镜像大小,由于这里我们是新加的节,OS在映射到内存时,必然会从一个新的内存页开始,所以镜像大小必然要变大
  8. 要使注入的代码能够运行,就要修改entry point

不适用以下情况:节表和节数据之间没有空隙

img

扩展最后一个节

思路是直接将注入的代码当作最后一个节的内容,需要修改的地方首先能想到的就是节数组中最后一个节的文件大小,以及内存大小。

比较隐秘的坑,由于原PE文件,节的大小是按照文件对齐值来设置的,现在新增了数据,新增的数据要以文件对齐值的大小为单位。如新增的数据超过内存对齐值,我们就要相应的修改PE镜像大小。

缺陷:这种方式最方便,但是修改的代码很大,稳定性很差。必须是最后一个,前面不可以

步骤:
  1. 添加节数据
  2. 修改节表最后一项,拓展文件大小和内存大小 IMAGE_OPTIONAL_HEADER 中 的SizeOfImage 和 AddressOfEntryPoint
  3. 修改 SizeOfImage
操作演示

把winmine 加入到我们的 PE 程序中

  1. 首先在 winhex 中 打开2个 可执行文件

img

img

  1. 把winmine数据拷贝到 pe.exe

img

img

  1. 修改节表最后一项

img

  1. 修改 SizeOfImage

img

在通过OD去看,发现winmain数据已经 写入 PE

img

注意

img

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7-二次、加解密、DNS等注入

加解密注入其实就是数据被加密了,注入的时候要先把注入语句进行相应加密再注入,只是叠加了一次加密而已二次注入二次注入一般用于白盒测试,黑盒测试就算是找到注入也没办法攻击 二次注入无法通过工具或手工发现,只能观察源代码才能发现 一般产生在有数据互联的情况,比如有…

8-WAF绕过

WAF WAF部署安全狗,宝塔等waf搭建部署 https://blog.csdn.net/nzjdsds/article/details/93740686 流量防护:某ip访问过多入黑名单 建议阿里云搞个服务器部署进行绕过测试WAF常见功能总体来说,WAF(Web Application Firewall)的具有以下四个方面的功能:审计设备:用来截获所有…

一个基于 .NET 开源免费的异地组网和内网穿透工具

前言 今天大姚给大家分享一个基于 .NET 开源免费的异地组网和内网穿透工具:linker。 工具介绍 linker是一个基于 .NET8 开源免费(GPL-2.0 license)的异地组网和内网穿透工具,支持TCP(支持IPV6)打洞、UDP打洞,服务器中继,异地组网使用虚拟网卡将各个客户端组建为局域网络、…

还是继续写博客吧!作为留痕、作为给面试官了解我的资料。

今天我被约谈了,没错,说的是“毕业”的事情 今天下午三点的时候,我接到了一个工单,我很纳闷,这是一个很简单且稳定运行了几年的东西,怎么有问题了?这个系统我太熟悉了,简单看下日志,便发现了问题所在——用户信息上的关键标识缺失,导致了某个接口查询无结果。我赶紧联…

SvelteKit 最新中文文档教程(12)—— 高级路由

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

代码随心录第一天|Leecode (704二分查找、27移除元素、977有序数组的平方

Leecode 704二分查找 题目链接:https://leetcode.cn/problems/binary-search/ 题目描述 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。题目解法 思路: 题目前提是数组为有序…

Linux输出重定向全攻略:掌握命令行高效管理的艺术

概述 在Linux中,输出重定向是一种将命令的输出(标准输出或标准错误)重定向到文件或其他设备的方法。以下是一些常见的输出重定向操作符及其用法:标准输出重定向 (>)将命令的标准输出重定向到一个文件中。如果文件不存在,它会被创建;如果文件已经存在,它会被覆盖。 co…

XN2025 集训记录 D6

梦境是一个微妙的境界 , 空寂感与包裹感交织 , 哪些景象明明永远不可能出现在现实 , 却像家一样 . . . 温暖 . . . 熟悉XN2025 集训记录 D6 今天西安也降温了 , 一晚上没睡好 , 做了能有三四个梦 . 梦到自己去神秘巨大建筑群集训 , 找不到同桌还没找明白房间 . . . 这都啥跟啥 …

树上差分学习笔记+做题记录

树上差分 点的差分求路径 \(u-v\) 上的点被经过的次数. \(cnt[x]\) 表示点 \(x\) 被经过的次数. 核心代码:cnt[u]++; cnt[v]++; cnt[lca(u,v)]--; cnt[father[lca(u,v)]]--;边的差分求 \(u-v\) 路径上每条边的经过次数 \(cnt[x]\) :代表 \(x\) 向上的边经过的次数. 核心代码:cn…

小迪安全|web安全|渗透测试|小白学习笔记Day1

Day1-概念名词 域名 什么是域名例www(可以换).xxx.com(可以换) 可以简单的理解为我们平常使用的网址,具体可以参考:https://baike.baidu.com/item/域名/86062域名在哪里注册国内像万网,新网都可以注册域名,可以在上面提及的网站上面进行查询以及进行注册什么是二级域名以及…

蓝桥杯1

今天写了写蓝桥杯的顺序结构程序设计类型的题,相关数学计算,输入输出复习。

分布式架构下出现的503问题

今天写完接口之后发现客户端503了,查看后端代码报的错 先看最下面的caused by:OK有点抽象,看看上面报的什么:哦我好像有点理解,该不会是我sql配置写错了吧,看看:id怎么会有一点报红呢?哦,是http没有加s啊有些时候就是会出现这种很扯的问题