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特征太明显,容易被查杀

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

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

相关文章

使用Charles断点修改接口返回数据

问题&#xff1a;数量/金额原来接口是用一个字段返回&#xff0c;由于业务需要换行展示&#xff0c;后端便拆分成了两个字段&#xff0c;前端则需要用新拆分的字段去取值&#xff0c;导致目前发现有个字段的金额也取成了件数&#xff08;红框部分&#xff09;&#xff1b;需求&…

设备树下的 LED 驱动实验

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、修改设备树文件二 创建设备树节点并获取属性 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;随着人工智能的不断…

有真的副业推荐吗?

#有真的副业推荐吗# 我做副业项目的时候&#xff0c;认识了一位带娃宝妈&#xff0c;讲一下她空闲时间做副业赚钱的故事吧。在一个温馨的小家庭里&#xff0c;李婷是一位全职宝妈&#xff0c;她的主要任务是照顾和陪伴自己可爱的宝宝。然而&#xff0c;随着宝宝逐渐长大&#x…

196算法之谜在 JSP 中使用内置对象 request 获取 form 表单的文本框 text 提交的数据。

(1&#xff09;编写 inputNumber . jsp &#xff0c;该页面提供一个 form 表单&#xff0c;该 form 表单提供一个文本框 text &#xff0c;用于用户输入一个正整数&#xff0c;用户在 form 表单中输入的数字&#xff0c;单击 submit 提交键将正整数提交给 huiwenNumber . jsp 页…

5.9 mybatis之callSettersOnNulls作用

文章目录 1. 当callSettersOnNullstrue时2. 当callSettersOnNullsfalse时 在mybatis的settings配置参数中有个callSettersOnNulls参数&#xff0c;官方解释为&#xff1a;指定当结果集中值为 null 的时候是否调用映射对象的 setter&#xff08;map 对象时为 put&#xff09;方法…

【菜狗学前端】ES6+笔记(包含Promise及async、await等)

老样子。复制上来的图片都没了&#xff0c;想看原版可以移步对应资源下载(资源刚上传&#xff0c;还在审核中) &#xff08;免费&#xff09;菜狗学前端之ES6笔记https://download.csdn.net/download/m0_58355897/89135424 一 解构赋值 解构赋值 解构指的是把一个数据…

2024年广东省网络系统管理样题第3套网络部署部分

2024年广东省网络系统管理样题第3套网络部署部分 模块A&#xff1a;网络构建 极安云科专注职业教育技能培训4年&#xff0c;包含信息安全管理与评估、网络系统管理、网络搭建等多个赛项及各大CTF模块培训学习服务。本团队基于赛项知识点&#xff0c;提供完整全面的系统性理论教…

Bridge 桥接

意图 将抽象部分与其显示部分分离&#xff0c;使他们都可以独立地变化。 结构 其中&#xff1a; Abstraction定义抽象类的接口&#xff0c;维护一个指向Implementer类型对象的指针。RefinedAbstraction扩展由Abstraction定义的接口。Implementor定义实现类的接口&#xff0c…

并发编程之ThreadLocal使用及原理

ThreadLocal主要是为了解决线程安全性问题的 非线程安全举例 public class ThreadLocalDemo {// 非线程安全的private static final SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public static Date parse(String strDate) throws ParseExc…

Spring源码刨析之配置文件的解析和bean的创建以及生命周期

public void test1(){XmlBeanFactory xmlBeanFactory new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));user u xmlBeanFactory.getBean("user",org.xhpcd.user.class);// System.out.println(u.getStu());}先介绍一个类XmlBeanFac…

服务器主机关机重启告警

提取时间段内系统操作命名&#xff0c;出现系统重启命令&#xff0c;若要出现及时联系确认 重启命令&#xff1a; reboot / init 6 / shutdown -r now&#xff08;现在重启命令&#xff09; 关机命令&#xff1a; init 0 / shutdown -h now&#xff08;关机&#…

防汛物资仓库管理系统|实现应急物资仓库三维可视化

系统概述 智慧应急物资仓库可视化系统&#xff08;智物资DW-S300&#xff09;采用了 B/S 架构的设计&#xff0c;通过浏览器即可快速登录操作。实现对库房内的应急物资从申购入库、出库、调拨、库内环境监测、维修保养、检测试验、处置报废等全周期、科学、规范的管理。系统以…

恢复MySQL!是我的条件反射,PXB开源的力量...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

如何进行计量经济分析

计量经济分析是定量分析的常用方法&#xff0c;在经济分析领域有着广泛且重要的应用。计量经济分析以一定的经济理论和统计数据为基础&#xff0c;运用数学、统计学相关方法&#xff0c;通过建立计量模型&#xff0c;并运用软件进行操作&#xff0c;从而实现对经济问题的定量分…

时间序列模型:lag-Llama

项目地址&#xff1a;GitHub - time-series-foundation-models/lag-llama: Lag-Llama: Towards Foundation Models for Probabilistic Time Series Forecasting 论文地址&#xff1a;https://arxiv.org/pdf/2310.08278.pdf hugging-face镜像&#xff1a;https://hf-mirror.c…

QQ农场-phpYeFarm添加数据教程

前置知识 plugin\qqfarm\core\data D:\study-project\testweb\upload\source\plugin\qqfarm\core\data 也就是plugin\qqfarm\core\data是一个缓存文件,如果更新农场数据后,必须要删除才可以 解决种子限制(必须要做才可以添加成功) 你不更改加入了id大于2000直接删除种子 D…

Unity类银河恶魔城学习记录12-14 p136 Merge Skill Tree with Sword skill源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili CharacterStats.cs using System.Collections; using System.Collections.…

如何搭建SearXNG搜索引擎

小白如何搭建SearXNG搜索引擎 前言 国内用户在使用百度、360、搜狗等主流搜索引擎时&#xff0c;面临搜索结果精确度不高、广告泛滥及隐私顾虑等问题。虽然Google以其出色性能备受推崇&#xff0c;但由于无法在国内访问&#xff0c;部分用户转而选择Bing作为折衷方案&#xff…

LeetCode617:合并二叉树

题目描述 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重…

OSCP靶场--PayDay

OSCP靶场–PayDay 考点(公共exp文件上传密码复用sudo -l all提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -sV -sC 192.168.153.39 -p- -Pn --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-04-13 04:52 EDT Nmap scan report for 192…