当前位置: 首页 > news >正文

【网络安全】逆向工程 练习示例

1. 逆向工程简介

逆向工程 (RE) 是将某物分解以了解其功能的过程。在网络安全中,逆向工程用于分析应用程序(二进制文件)的运行方式。这可用于确定应用程序是否是恶意的或是否存在任何安全漏洞。
在这里插入图片描述
例如,网络安全分析师对攻击者分发的恶意应用程序进行逆向工程,以了解是否有任何可归因的指标将二进制文件与攻击者联系起来,以及任何可能的防御恶意二进制文件的方法。一个著名的例子是2017 年 5 月的WannaCry勒索软件。安全研究员Marcus Hutchins对勒索软件应用程序进行了逆向工程,并发现了应用程序中的一项特定功能,如果特定域已注册并可用,恶意软件就不会运行。

随后,Marcus 注册了这个域名,阻止了全球性的 WannaCry 攻击。这只是逆向工程在网络安全防御中运用的众多著名案例之一。

2. 二进制文件

在计算领域,二进制文件是从源代码编译而来的文件。例如,在计算机上启动可执行文件时,会运行二进制文件。在某个时间点,此应用程序可能是用 C# 等编程语言编写的。然后对其进行编译,编译器将代码转换为机器指令。

二进制文件具有特定的结构,具体取决于它们设计用于运行的操作系统。例如,Windows 二进制文件遵循可移植可执行 (PE) 结构,而在Linux上,二进制文件遵循可执行和可链接格式 (ELF)。这就是为什么您无法在 MacOS 上运行.exe文件的原因。话虽如此,所有二进制文件至少包含:

代码部分:此部分包含CPU将执行的指令
数据部分:此部分包含变量、资源(图像、其他数据)等信息
导入/导出表:这些表引用二进制文件使用(导入)或导出的其他库。二进制文件通常依赖库来执行功能。例如,与 Windows API交互以操作文件
今天的任务中的二进制文件遵循PE结构。整个任务将解释此结构。

3. 反汇编与反编译

对二进制文件进行逆向工程时,您将使用两种主要技术。本任务部分将向您介绍反汇编和反编译,解释它们的主要区别及其优缺点。

反汇编二进制文件会显示二进制文件将执行的低级机器指令(您可能将其称为汇编)。由于输出是翻译后的机器指令,因此您可以详细了解二进制文件在哪个阶段将如何与系统交互。IDA、Ghidra和 GDB 等工具可以做到这一点。

在这里插入图片描述
然而,反编译会将二进制文件转换为高级代码,例如 C++、C# 等,使其更易于阅读。但是,这种转换通常会丢失变量名称等信息。如果您想从高层次了解应用程序的流程,这种对二进制文件进行逆向工程的方法非常有用。
在这里插入图片描述
在某些特定情况下,您会选择一种方法而不是另一种方法。例如,反编译有时是基于您使用的工具的“最佳猜测”,并不提供实际的完整源代码。

4. 多阶段二进制

网络安全的最新趋势是,攻击者越来越多地在攻击活动中使用所谓的“多阶段二进制文件”——尤其是恶意软件。这些攻击涉及使用负责不同操作的多个二进制文件,而不是一个执行整个攻击的二进制文件。通常,涉及多个二进制文件的攻击将如下所示:

第 1 阶段 - Dropper:此二进制文件通常是一个轻量级的基本二进制文件,负责枚举操作系统以查看有效负载是否有效等操作。一旦验证了某些条件,二进制文件就会从攻击者的基础设施下载第二个更恶意的二进制文件。

第 2 阶段 - 有效载荷:此二进制文件是攻击的“核心”。例如,在发生勒索软件时,此有效载荷将加密并泄露数据。
经验丰富的攻击者可能会进一步将攻击链(例如横向移动)的行为拆分为其他二进制文件。使用多个阶段有助于逃避检测并使分析过程更加困难。

例如,与执行恶意操作(例如加密)的完整二进制文件相比,较小的、更“无害”的初始二进制文件更有可能逃避电子邮件过滤检测。此外,将这些功能拆分为多个阶段可让攻击者获得更大的控制权(即,仅在满足时间等条件后下载特定阶段)。

下图显示了涉及多个阶段二进制文件的攻击可能是什么样子。
在这里插入图片描述

5. 使用 .NET

对于今天的任务,您将使用反编译器 ILSpy 对两个 .NET 二进制文件进行逆向工程。您可以按照下面的演练,使用名为的示例应用程序进行逆向工程demo.exe。然后,您将在本任务结束时自行逆向应用程序。

在分析目标之前,我们需要学习并找到一种方法来识别原始二进制文件、修改它或将其用作证据。此外,对我们正在处理的文件有一个大致的了解也是一种很好的做法,这样我们就可以选择所需的适当工具。

让我们首先通过右键单击名为demo 的文件并单击来导航到机器桌面上demoProperties文件夹中的文件位置。
在这里插入图片描述
我们可以观察到该文件的扩展名是.exe,表明它是一个 Windows 可执行文件。
在这里插入图片描述
由于它是一个 Windows 文件,我们将使用PEStudio,这是一款旨在调查潜在恶意文件并从中提取信息而无需执行的软件。这将帮助我们专注于调查的静态分析方面。 让我们从任务栏打开 PEstudio,然后单击 文件>打开demo.exe并选择位于的文件,C:\Users\Administrator\Desktop\demo\demo.exe如下所示。

如下所示,PEStudio 将显示有关该文件的信息,因此让我们开始列举我们可以从中获得的一些最重要的方面。使用左侧面板,我们可以浏览不同的部分,这些部分将共享有关该文件的不同类型信息。在打开文件时显示的常规信息输出中,我们可以看到SHA-256形式的文件哈希值、体系结构类型(在本例中为x64)、文件类型以及用于编译可执行文件的语言的签名(在本例中为使用 C# 语言的. NET 框架) 。

在这里插入图片描述
让我们关注一些我们可以获得的关键数据。首先,如果我们想要识别文件并提供其被更改的证据,我们需要记下文件的 SHA-256 哈希值(如上所述),以及 PE 文件上每个部分的哈希值。PE 代表可移植可执行文件,它是 Windows 可执行文件的排列格式;您可以在此处了解更多信息。

这些部分代表了 PE 格式的 Windows 可执行文件的不同内容的内存空间。我们可以计算这些部分的哈希值,以便正确识别可执行文件。这次我们将重点关注两个哈希值:一个来自.text部分,它是包含可执行代码的文件部分;此部分通常标记为已读和可执行,因此在复制文件时不应对其进行任何更改。我们可以在下面的屏幕截图中看到它们:

在这里插入图片描述
我们可以使用另一个重要部分来获取有关二进制文件的信息,即“指标”部分。此部分告诉我们有关二进制文件的潜在指标,例如 URL 或其他可疑属性。

在这里插入图片描述
上面的截图显示了文件中的几个字符串,如文件名、URL 和函数名。根据文件的执行流程,这可能非常重要。此外,寻找 IP 地址、URL 和加密钱包等人工信息可以“快速”收集一些识别情报。我们将在下一节中了解这一点。

现在我们已经掌握了有关正在调查的文件的信息,让我们尝试了解可执行文件正在做什么。我们需要了解它的流程。如果我们尝试通过打开文件来读取它,我们将无法做到这一点,因为它是二进制格式。在上一节中,我们了解到该文件是使用.NET该语言使用的框架编译的;我们可以使用ILSpyC#等反编译工具将二进制代码反编译为 C# 。

此工具将反编译代码,为我们提供可读信息,我们可以使用这些信息来确定执行流程。让我们首先从任务栏打开 ILSpy,然后单击File > Open,然后导航到C:\Users\Administrator\Desktop\demo 并选择文件demo.exe。该工具ILSpy可能需要长达 30 秒才能显示在屏幕上。

在这里插入图片描述
从上面我们可以看出,左侧面板包含框架使用的库,而实际的反编译代码位于文件名为demo的部分。我们点击它展开,看看它包含什么。

在这里插入图片描述
如上图所示,ILSpy 可以提供很多信息,例如元数据和引用。但是,实际显示的内容显示在括号符号 {} 上,在本例中,在 下DemoBinary > Program > Main,这实际上是可执行文件的 Main 函数。现在我们可以访问二进制文件上运行的代码,让我们对其进行分析。

private static void Main(string[] args)
{Console.WriteLine("Hello THM DEMO Binary");Thread.Sleep(5000);string address = "http://10.10.10.10/img/tryhackme_connect.png";string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "thm-demo.png");using (WebClient webClient = new WebClient()){try{Console.WriteLine("Downloading file...");webClient.DownloadFile(address, text);Console.WriteLine("File downloaded to: " + text);Process.Start(new ProcessStartInfo(text){UseShellExecute = true});Console.WriteLine("Image opened successfully.");}catch (Exception ex){Console.WriteLine("An error occurred: " + ex.Message);}}Console.WriteLine("Bye Bye leaving Demo Binary");Thread.Sleep(5000);
}

上面的代码显示了 main 函数及其代码。我们可以观察到,它首先使用Console.Writeline 方法将消息“Hello THM DEMO Binary”打印到屏幕上。

Console.WriteLine("Hello THM DEMO Binary");

然后它使用Sleep方法等待 5 秒。

Thread.Sleep(5000);

然后,它将一个值分配给两个字符串变量: address 和 text ,第一个变量是访问 PNG 文件的 URL ,第二个变量是用户桌面上名为thm-demo.png 的文件名。

string address = "http://10.10.10.10/img/tryhackme_connect.png";
string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "thm-demo.png");

然后,它将尝试连接到地址变量上的 URL,并使用WebClient 类将内容保存到桌面上的文件中,然后它将使用Process 类 和Start 方法执行分配给文本变量的下载文件路径,如下所示。

using (WebClient webClient = new WebClient()){try{Console.WriteLine("Downloading file...");webClient.DownloadFile(address, text);Console.WriteLine("File downloaded to: " + text);Process.Start(new ProcessStartInfo(text){UseShellExecute = true});Console.WriteLine("Image opened successfully.");}catch (Exception ex){Console.WriteLine("An error occurred: " + ex.Message);}}

最后,它再次向控制台打印消息“ Bye Bye,离开THM DEMO Binary ”,并使用Sleep方法等待 5 秒钟后再关闭。

Console.WriteLine("By bye leaving THM Demo Binary");
Thread.Sleep(5000);

太棒了!我们现在明白二进制文件在做什么了。它将从 URL下载一个 PNG 文件到用户的桌面: http://10.10.10.10/img/tryhackme_connect.png。让我们执行该文件,看看这是否属实。 二进制文件启动后,等待文本“ ”出现,然后按下载文件。Hello THM DEMO BinaryEnter

注意: 我们仅执行二进制文件,因为我们处于沙盒环境中;不建议在主机上执行未知二进制文件。

在这里插入图片描述
执行文件后,我们可以观察到它已下载到桌面,并且消息按预期打印到屏幕上。此外,使用 PNG Paint的默认应用程序执行并打开下载的文件。太好了,我们成功逆向了 代码流程。

相关文章:

【网络安全】逆向工程 练习示例

1. 逆向工程简介 逆向工程 (RE) 是将某物分解以了解其功能的过程。在网络安全中,逆向工程用于分析应用程序(二进制文件)的运行方式。这可用于确定应用程序是否是恶意的或是否存在任何安全漏洞。 例如,网络安全分析师对攻击者分发…...

Oracle Database 21c Express Edition数据库 和 Sqlplus客户端安装配置

目录 一. 前置条件二. Win10安装配置Oracle数据库2.1 数据库获取2.2 数据库安装2.3 数据库配置确认2.4 数据库访问 三. Win10配置Oracle数据库可对外访问3.1 打开文件和打印机共享3.2 开放1521端口 四. 端口与地址确认4.1 查看监听器的状态4.2 Win10查看1521端口是否被监听4.3 …...

arcgisPro将面要素转成CAD多段线

1、说明:正常使用【导出为CAD】工具,则导出的是CAD三维多线段,无法进行编辑操作、读取面积等。这是因为要素面中包含Z值,导出则为三维多线段数据。需要利用【复制要素】工具禁用M值和Z值,再导出为CAD,则得到…...

相机内外参知识

已知相机的内外参数矩阵,可以求得相机在世界坐标系下的原点坐标。这里需要理解几个概念: 内参数矩阵(Intrinsic Matrix): 描述相机本身的属性,比如焦距、主点位置等。外参数矩阵(Extrinsic Matrix&#xf…...

从代币角度介绍solana账户体系

1、solana 的账户概念介绍 Solana的账户体系是其区块链的核心组成部分,它允许数据和价值在链上存储和转移。以下是Solana账户体系的一些关键特点: • 账户模型: • 在Solana上,所有数据都存储在所谓的“账户”中,类似…...

前端引入字体文件

1. 字体下载 阿里矢量图图标库地址 https://www.iconfont.cn/,页面打开后选中,素材库 > 字体库 左侧两个标签页可以切换,右侧放大镜图标可以搜索自己需要的字体 字体预览区域可以自行调整进行字体预览 右上角点击字体包下载,下…...

qemu启动后网络怎么设置?配合qemu-system-riscv64的命令设置

QEMU启动的时候,可以选择组网方式,一般有两种选择,user模式和tap模式 user模式就是用NAT,tap模式就是用bridge网桥模式。以前也有过一次实践:FreeBSD RISCV 在QEME中实践-网络配置_pkg.txz: not found-CSDN博客 user…...

如何测量分辨率

一、什么是分辨率? 分辨率指的是分清物体细节的能力。分辨率是一个成像系统还原空间频率的能力。一些人只是简单的用分辨率去描述极限分辨率,但是相机在在不同的对比度的情况下还原低,中和高频率的能力,也可以显示全面综合的信息。…...

汇总贴:cocos creator

1 cocoscreator-doc-TS:目录-CSDN博客 访问节点和组件 常用节点和组件接口 创建和销毁节点 加载和切换场景 获取和设置资源 监听和发射事件 节点系统事件 缓动系统(cc.tween) 使用计时器 使用对象池 使用 TypeScript 脚本 模块化脚本 脚本执行顺序 全局…...

[N1CTF 2018]eating_cms

[N1CTF 2018]eating_cms 知识点 文件上传 解题 这个题感觉还好,知识点真心不难,就是全混在一起。 思路差不多挺离谱 首先看到,有一个登录界面,然后猜测有注册界面 admin注册不了,随便注册一个账号。 注册之后&…...

重拾设计模式--建造者模式

文章目录 建造者模式(Builder Pattern)概述建造者模式UML图作用:建造者模式的结构产品(Product):抽象建造者(Builder):具体建造者(Concrete Builder&#xff…...

【机器学习】以机器学习为翼,翱翔网络安全创新苍穹

我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 在数字化浪潮汹涌澎湃的当下,网络安全如同守护数字世界的坚固堡垒,其重要性不言而喻。而机器学习技术的蓬勃…...

人工智能在VR展览中扮演什么角色?

人工智能(AI)在VR展览中扮演着多重关键角色,这些角色不仅增强了用户体验,还为展览的组织者提供了强大的工具。 接下来,由专业从事VR展览制作的圆桌3D云展厅平台为大家介绍AI在VR展览中的一些主要作用: 个性…...

mysql,创建数据库和用户授权核心语句

一.库操作1.创建库create database if not exists 库名 default 字符集 default 校对规则2.删除库drop database if exists 库名3.修改库的,字符集,校对规则alter databse 库名 default 字符集 default 校对规则4.查看当前使用的库seclect databse();5.查看库show databases;…...

日期区间选择器插件的操作流程

我们知道,在开发过程中,为了能够在规定时间内完成项目,有时候我们都会使用插件来大大提高我们的开发效率,有些插件是可以直接拿来用,但是有些插件拿过来之后是需要进行修改,在使用插件的时候还有很多的注意…...

【WRF教程第3.2期】预处理系统 WPS详解:以4.5版本为例

预处理系统 WPS 详解:以4.5版本为例 WPS 嵌套域(WPS Nested Domains)USGS 和 MODIS 土地利用重力波拖拽方案静态数据(Gravity Wave Drag Scheme Static Data)1. 什么是重力波拖拽方案(GWDO)静态…...

深度学习的DataLoader是什么数据类型,为什么不可用来索引

在 Python 中,DataLoader是torch.utils.data.DataLoader类的实例对象,用于加载数据,它本身不是一种基本数据类型,而是一种特殊的迭代器类型,主要用于按批次加载数据,以下是其通常不可索引的原因&#xff1a…...

物理信息神经网络(PINN)八课时教案

物理信息神经网络(PINN)八课时教案 第一课:物理信息神经网络概述 1.1 PINN的定义与背景 物理信息神经网络(Physics-Informed Neural Networks,简称PINN)是一种将物理定律融入神经网络训练过程中的先进方…...

Linux setfacl 命令详解

文章目录 Linux setfacl 命令详解一、ACL 和 setfacl 简介二、基本语法三、常用操作1. 查看 ACL2. 为用户设置权限3. 为组设置权限4. 删除 ACL 条目5. 设置默认 ACL6. 递归设置 ACL 四、示例操作1. 创建示例目录和文件2. 设置 ACL3. 验证 ACL 五、注意事项六、总结 Linux setfa…...

电商环境下的财务ERP系统架构

先介绍一下自己的工作经历,2002年开始进入ERP实施行业,专注于O记EBS系统,正好赶上中国经济和信息化高度发展的阶段,先后实施过很多大国企和民企的大型ERP项目,在实施过程中逐渐对ERP系统的架构、模块设计有更深入的认识…...

Linux相关概念和易错知识点(25)(信号原理、操作系统的原理、volatile)

目录 1.信号的产生 (1)kill (2)raise、abort 2.对block、pending、handler表的管理 (1)信号集(sigset_t) (2)block表的管理 ①操作相关的函数 ②sigpr…...

线上问题——频繁 Full GC 问题的排查思路

文章目录 一、查看 GC 日志二、分析内存泄漏三、检查对象生命周期四、优化代码五、调整垃圾回收策略六、使用监控工具 一、查看 GC 日志 启用 GC 日志 在 Java 应用中,需要在启动参数中添加适当的参数来启用 GC 日志记录。可以使用-XX:PrintGCDetails、-XX:PrintGCD…...

《探秘 Qt Creator Manual 4.11.1》

《探秘 Qt Creator Manual 4.11.1》 一、Qt Creator 4.11.1 概述二、功能特性全解析(一)跨平台能力展示(二)代码编辑优势(三)版本控制集成(四)特定 Qt 功能呈现(五&#…...

level2逐笔委托查询接口

沪深逐笔委托队列查询 前置步骤 分配数据库服务器 查询模板 以下是沪深委托队列查询的请求模板&#xff1a; http://<数据库服务器>/sql?modeorder_book&code<股票代码>&offset<offset>&token<token>查询参数说明 参数名类型说明mo…...

在Linux系统安装配置 MySQL 和 hive,hive配置为远程模式

前提&#xff1a;已安装配置好了Hadoop环境&#xff0c;因为hive的底层是Hadoop 1 Mysql安装 搜索Centos7自带的mariadb rpm -qa|grep mariadb 卸载mariadb rpm -e mariadb-libs-5.5.64-1.el7.x86_64 --nodeps 再搜索一次看看是否还存在 rpm -qa|grep mariadb 安装mysql 创…...

如何写好一份科技报告

如何写好一份技术文档 一、科技报告写作的整体框架封面与摘要&#xff1a;引言&#xff1a;理论框架与文献综述&#xff1a;实验方法与材料&#xff1a;实验结果&#xff1a;结果分析与讨论&#xff1a;结论&#xff1a;参考文献&#xff1a;附录&#xff1a; 二、科技报告写作…...

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…...

《图解机器学习》(杉山将著)第一部分绪论学习笔记

《图解机器学习》&#xff08;杉山将著&#xff09;第一部分绪论学习笔记 《图解机器学习》&#xff08;杉山将著&#xff09;第一部分绪论学习笔记一、什么是机器学习1.1 学习的种类1.2 机器学习任务的例子1.3 机器学习的方法 二、学习模型2.1 线性模型2.2 核模型2.3 层级模型…...

【WPF】RenderTargetBitmap的使用

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;RenderTargetBitmap 是一个非常有用的类&#xff0c;它允许你将任何可视元素&#xff08;如 UIElement 或 Visual 的实例&#xff09;渲染到位图中。这在需要生成图像快照、导出可视化内容为图片文…...

编辑, 抽成组件

问题 错误思路&#xff1a; 1 dept不能修改&#xff0c; 用watch监听一下&#xff1a;赋值给新的变量进行修改&#xff0c; 问题&#xff1a; currentDept 发生改变&#xff0c; depth也发生了改变&#xff0c;因为是浅拷贝&#xff0c; 用了json.pase(json.stringify(value…...