PE程序底层结构与恶意代码插入与执行的研究

2024-04-14 22:36

本文主要是介绍PE程序底层结构与恶意代码插入与执行的研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Windows PE程序底层结构分析

PE(Portable Executable)是一种Windows操作系统下可执行文件的标准格式

pe101-64.png
Windows PE程序结构和Linux的elf程序结构类似,首先一个名为simple64.exe程序里有一个头文件和一个段文件,头文件里主要存放的是可执行文件的技术详细信息,段文件里主要存放的是可执行文件的内容
image.png
在头文件里的内容有DOS头信息,PE的头信息,optional头信息,数据目录,节表
image.png
头文件里信息的详细内容
image.png
而段文件里主要存放的是程序代码,导入,数据信息
image.png
为了更好的理解,这里写一个简单的exe程序来进行分析

#include <stdio.h>
int main()
{printf("Hello, World!");return 0;
}

安装编译工具:

apt-get install g++-mingw-w64-x86-64

编译程序:

x86_64-w64-mingw32-g++ --static test.cpp -o helloword.exe

image.png
将编译好的helloword.exe文件拖入到010 Editor里分析,如果没有010 Editor,也可以用linux里的xxd工具分析
010 Editor下载:

https://www.sweetscape.com/010editor/

图中的4D 5A是一个DOS头数据
image.png
图中紫色的地方提示系统这个程序不是以DOS模式运行的
image.png
50 45就是程序的PE头数据
image.png
在下面有.text .data .rdata .bss段,这些都是程序的节表名称

.text段:存储可执行代码(机器指令),即程序的指令部分
.data段:存储已初始化的全局变量和静态变量
.rdata段:存储只读数据,例如常量字符串等
.bss段:存储未初始化的全局变量和静态变量

image.png
使用pe-bear工具可以查看更详细的PE程序结构

https://github.com/hasherezade/pe-bear/releases/tag/v0.6.7.3

image.png
比如,这里我就可以查看.rdata段存储的字符串hello world,还可以看到程序当前的汇编指令
image.png
点击.text节,选择导入表,可以看到程序使用的一些dll文件名称,dll相当于是一个库,程序使用的函数都是从这个库里导入的
image.png
无论是PE或者ELF文件,里面都有一个entry函数,这个函数很重要,它是程序的入口函数,在分析恶意程序的时候,通常都找不到main函数,这里就需要看entry函数来定位程序主函数
入口函数的作用是指示程序从何处开始执行。它通常包含程序的主要逻辑,初始化代码以及程序的控制流程。在程序运行时,操作系统或运行时环境会找到入口函数,并从该函数开始执行程序的代码
image.png

恶意代码插入与执行

用xdbg导入可执行程序,在最下面,程序有一段都是0的部分,有些文件格式或文件类型在设计时可能会留有预留空间,以便将来添加或扩展文件内容。这些空白区域可能在文件创建时被填充为0,这部分是程序的一块空字节空间,攻击者可以在这个空间里写入恶意代码,通过汇编指令,达到正常运行程序和恶意代码的一个效果,这里用系统的calc.exe程序举例
image.png
image.png
这个区域就是程序的空字节空间,我们先用msf生成一段shellcode代码
启动msf,使用payload/windows/exec模块,如果要生成64位的shellcode就使用payload/windows/x64/exec模块,这里calc.exe程序是32位的,所以要用32位的模块
image.png
可生成cmd执行的命令,设置完成后用generate -f raw -o 命令输出内容到指定文件里,这里我的shellcode是打开一个文本文档
image.png
使用xxd可以看到shellcode的十六进制
image.png
回到xdbg,启动程序到entry point处,无论是PE或者ELF文件,里面都有一个entry函数,这个函数很重要,它是程序的入口函数,入口函数的作用是指示程序从何处开始执行。它通常包含程序的主要逻辑,初始化代码以及程序的控制流程。在程序运行时,操作系统或运行时环境会找到入口函数,并从该函数开始执行程序的代码
image.png
复制这一行,记录下来

003C1CE0 <c | E8 3EFCFFFF                        | call calc.3C1923                                        |

然后去到程序空字节区域,复制记录第一行
image.png

003C20C4    | 0000                               | add byte ptr ds:[eax],al                                |

回到entry函数处,选中entry函数,按下空格编辑汇编指令,jmp到0x003C20C4空字节空间处

jmp 0x003C20C4

image.png
双击函数,会自动跳转到指定的内存地址,现在我们要先push两个寄存器,之后才能写入shellcode

pushad

push ad指令在32位程序下有用,它的作用是将所有通用寄存器push到栈中,比如EAX, ECX, EDX, EBX这些32位寄存器

pushfd

push fd指令作用是将标志寄存器压入堆栈,这个寄存器包含了各种处理器状态和控制标志位,比如条件码、中断允许位等
image.png
然后用010 Editor或者win hex工具打开刚刚msf生成的shellcode文件,复制文件里的十六进制值,回到xdbg的空字节空间,在刚刚添加汇编指令的下一行长按鼠标,框选一段区域,然后按下ctrl+e,将十六进制值粘贴进去
image.png
点击确定后,就能看到shellcode的汇编指令
image.png
为了使程序正常运行,我们还需要jmp回之前entry函数调用的地址,首先需要pop出之前push进去的寄存器指令,使堆栈平衡,在程序最后一行的后一行写入,因为程序最后一行的空指令处代表的是shellcode的结束地址

popfd
popad

image.png
然后写入之前entry原来的指令,让程序正常运行

call 0x003C1923

跳转到entry函数下一行指令处,正常执行程序
image.png

jmp 0x003C1CE5

image.png
最后用jmp指令替换掉shellcode后的退出指令,因为我们要正常打开calc.exe程序
image.png
跳转到popfd处

jmp 0x00F9218B

image.png
选择xdbg任务栏里的创可贴图标,保存修改后的文件
image.png
image.png
运行保存后的文件,程序会运行计算器和文本文档
image.png
这里还是推荐自己写汇编指令,用msf生成的shellcode特征太明显,容易被查杀

这篇关于PE程序底层结构与恶意代码插入与执行的研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904206

相关文章

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

python编写朋克风格的天气查询程序

《python编写朋克风格的天气查询程序》这篇文章主要为大家详细介绍了一个基于Python的桌面应用程序,使用了tkinter库来创建图形用户界面并通过requests库调用Open-MeteoAPI... 目录工具介绍工具使用说明python脚本内容如何运行脚本工具介绍这个天气查询工具是一个基于 Pyt

Ubuntu设置程序开机自启动的操作步骤

《Ubuntu设置程序开机自启动的操作步骤》在部署程序到边缘端时,我们总希望可以通电即启动我们写好的程序,本篇博客用以记录如何在ubuntu开机执行某条命令或者某个可执行程序,需要的朋友可以参考下... 目录1、概述2、图形界面设置3、设置为Systemd服务1、概述测试环境:Ubuntu22.04 带图

Nacos注册中心和配置中心的底层原理全面解读

《Nacos注册中心和配置中心的底层原理全面解读》:本文主要介绍Nacos注册中心和配置中心的底层原理的全面解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录临时实例和永久实例为什么 Nacos 要将服务实例分为临时实例和永久实例?1.x 版本和2.x版本的区别

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock