信息系统安全——缓冲区溢出和恶意代码分析

实验 1 缓冲区溢出和恶意代码分析

1.1 实验名称

《缓冲区溢出和恶意代码分析》

1.2 实验目的

1 、熟练使用恶意代码分析工具 OD  IDA

2 、通过实例分析,掌握缓冲区溢出的详细机理

3 、通过实例,熟悉恶意样本分析过程

1.3 实验步骤及内容

第一阶段:利用 IDA  OD 分析 bufferoverflow 攻击实例(见实验 1 代码和样

本文件 bufferoverflow.exe)

1 、分析 bufferoverflow 实例中的关键汇编代码

2 、分析程序执行过程中寄存器和栈地址及其数据的变化(包含程序开始执行前、开始执行

时、溢出前、溢出后几个阶段)

3、解释为什么该实例中在 XP 环境下需要输入 17 个任意字符就可以绕过密码比较的判断功

第二阶段:分析恶意样本实例(见实验 1 代码和样本文件 example.exe

1 、分析 example 恶意代码关键汇编代码

2 、结合汇编代码说明该恶意软件样本的主要功能

第三阶段:分析真实勒索软件样本(可选,见实验 1 代码和样本文件 radman.rar

1 、搭建服务器,成功执行该恶意代码

2 、分析 radmant 勒索软件恶意代码关键汇编代码

3 、结合汇编代码说明该恶意软件样本的主要功能

1.4 实验关键过程及其分析(需截图说明)

1.4. 1 bufferoverflow 分析

首先打开 IDA_Pro ,根据函数名找到 main()函数的代码起始地址是 0x004123B0

需要注意的是,由于 IDA_Pro 是静态编译工具,在存在重定位的情况下(比如 Windows11 操作系统的真实机)与 OllyDBG 所加载的动态内存里的地址并不一致,这时需要在打开 IDA_Pro 的时候手动更改 Image Base ,才能与 OD 中的地址保持一致。

由于在 XP 操作系统中不存在重定位,所以 IDA_Pro 中显示的地址与 OD 中一致,因此 直接打开 OD ,将断点设置在 0x004123B0 作为程序的入口。

可以看到 main()函数是由 0x004116FE 转来的。

 IDA_Pro 中使用 ctrl+x  main()函数不断交叉编译,可以看到调用 main()的的函数 _main_0 的调用者地址为 00412BBC ,这也正是程序的真正入口地址。设置断点。

首先执行到该断点处,然后进入call 语句。可以看到现在将要执行的地址内容是 main() 函数内容,并且 0x0012FF7C 处保存的是 main()函数的返回地址,EBP 指向地址的内容是 call 语句所在函数的 EBP 地址。之后执行到 push ebx 上方,表明系统为局部变量分配了 0xDC 220 字节)大小的内存空间(选择显示 ASCII 数据,可以看到其中是有数据的)。

执行到 MOV DWORD 上方,是系统对分配的内存空间进行了初始化,全部置为 CC   int 断点,这样如果有位置程序跳到这片区域就不会出现崩溃情况而是直接被中断下来。 可以看到初始化后复函数的返回地址和 EBP 依旧存在。

继续向下执行,在地址 0x004123DE 处是调用命令行输入的一个 CALL 语句(往里多步 入几层可以发现实际上是调用了 kernel32GetMessage.dll 中一个函数,用于获取命令行输入 并存放在内存的合适位置,这里的存放位置是 0x0012FF60 处) 。接着执行到 0x004123EF 位置的 CALL 语句上方,发现两句 PUSH 语句是将数据段的“ 12345 ”和内存中的输入压栈 (同时也可以看出我们输入的内容被存放在了 SS:[EBP- 18] ,即 0x0012FF60 )。

继续执行来到 0x004123EF 位置的 CALL 语句,作用是比较栈顶两个元素的值是否相等, 如果相等则置 EAX  0(也就是输入正确字符串“ 12345 ”时),不等就置为 0xFFFFFFFF 并且再接下来会把两个栈顶元素弹栈。然后,程序根据 EAX 的值是否为零决定输出的内容, 具体方式是通过对 SS:[EBP-8]赋值为 0  1 判断跳转位置。

可以看到,SS:EBP-8 的值决定程序的输出,这个位置距离我们输入内容的存放位置 SS:EBP- 18 只有 0x10 也就是 16 。因此当我们输入长度超过 17 个字节的内容、并保证第 17  个字节的十六进制最低位是 1 时(比如 17* 1 ),就能够成功覆盖 SS:[EBP-8] ,让程序 输出“Welcome ”。此外,输入更长的内容还能覆盖到 pre EBP 和返回地址,从而进行提权 等攻击。

1.4.2 example 分析

我们开始使用静态分析基础技术,研究 PE 文件结构和字符串列表。我们看到这个恶意 代码导入了一些联网功能函数、服务操作函数和注册表操作函数。在下面的列表中,我们关 注到一些有趣的字符串。

我们看到域名、注册表位置(如字符串 SOFTWARE\Microsoft(XPS; DOWNLOADUPLOAD 这样的命令字符串,以及 HTTP/1.8 字符串等。这些表明恶意代码可能是一个 HTTP 后门程序。字符串-cc -re -in 应该是一些命令行参数(例如-in 可能是 install 的缩写)

我们尝试运行一下 example,但它看起来似乎立即删除了自身,除此以外没有别的发现。

接下来,我们使用 procmon 工具,设置一个 example.exe 进程名称上的过滤器。依然没 有任何有趣的如 writeFile RegSetValue 之类的事件。

但是通过深入挖掘后,我们发现了一个 Process Create 的条目。双击该条目将看到如下 图所示的对话框,可以发现,恶意代码是通过使用"C:\WINDOWS\system32\cmd.exe /c del Z:\Lab03-84.exe >>NUL 来从系统中删去自身的。

静态分析到此就没有太多值得分析的了,接下来尝试动态分析 example

首先,我们使用OllyDbg 调试恶意代码。我们使用F8 step-over,直至到达地址0x403945, 此处 是对 main 函数的调用(最简单找出 main 函数位于地址 0x402AF0 的方法,是使用 IDA  Pro)。接下来,使用 F7  step-into  main 函数调用。我们使用 F7 键和 F8 键继续向前单步, 同时注意样本的行为。

首先,恶意代码在地址 0x402AFD 查看命令行参数的数量是否等于 1 。我们没有指定任 何参数,所以检查成功,并且在地址 0x401000 处恢复运行。接下来,它试图打开注册表项 HKLM\SOFTWARE\Microsoft XPS ,然而由于注册表项不存在,函数返回 0 ,所以调用进入 0x402410 处的函数。

 0x40240C  F7 进去可以看到,程序似乎在某个时刻将一个网址

"http://www.practicalmalwareanalysis.com"压入了寄存器,推测 example 是具有网络能力的恶 意代码。

0x402410 处的函数使用 GetModuleFilenameA 获取当前可执行文件的路径,并构造出一  ASCII 字符串:/c del path-to-executable>>NUL 。图 9- 1L 展示了在 OllyDbg 的寄存器面板 窗口中的这个字符串实例。注意,EDX 寄存器值是 0x12E248 ,但是 OllyDbg 正确地解释它  ASCII 字符串指针。

恶意代码通过在 ShellExecuteA 调用中结合构造的字符串和 cmd.exe 来尝试着从硬盘上 删除自己。

综合以上信息,我推测恶意代码创建一个注册表项 HKLM\SOFTWARE\Microsoft\XPS Microsoft 之后的空格使得它成为一个独特的主机感染标识。它在地址 0x4011BE 处,用 EDX  寄存器指向的缓冲区内容,来填充注册表下名为 Configuration 的键值。为了找出缓冲区的  内容,我们在地址 0x4011BE 处设置断点,并且运行恶意代码。在寄存器面板窗口中,右键 单击 EDX 寄存器的内容,选择 Follow in Dump 。十六进制的转储视图显示了 4 个以 NULL   结束的字符串,随后是多个 0 ,字符串包含值 ups http://www.practicalmalwareanalysis.com 80  68

综合以上信息,加上查阅资料,发现恶意代码构造一个 HTTP/1.0 GET 请求,并且连  接一个远程系统。这种连接不太可能被防火墙拦截,因为它是一个向外的合法 HTTP 请求。 由于我的恶意代码分析虚拟机禁用了网络,向外的连接永远不会成功,运行恶意代码就会失 败。然后,仔细跟踪反汇编列表,会看到恶意代码事实上是尝试着连接注册表键值配置中记 录的域名和端口。进一步分析反汇编代码显示,恶意代码在服务器返回的文档中搜索特殊的 字符串(反引号、单引号、反引号、单引号、反引号) ,并且用它们来表示命令控制协议。

1.5 问题及思考

1)在 WINXP 中,栈是怎么分布的?栈中可以存放代码吗?

栈的结构如下。可以

2)为什么该实例中在 XP 环境下需要输入 17 个任意字符就可以绕过密码比较的判断功

能?

17 个字符能够覆盖返回结果的判断条件。

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

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

相关文章

ClickHouse基础知识(五):ClickHouse的SQL 操作

基本上来说传统关系型数据库(以 MySQL 为例)的 SQL 语句,ClickHouse 基本都支持, 这里不会从头讲解 SQL 语法只介绍 ClickHouse 与标准 SQL(MySQL)不一致的地方。 1. Insert 基本与标准 SQL(My…

71内网安全-域横向网络传输应用层隧道技术

必备知识点; 代理和隧道技术的区别? 代理主要解决的是网络访问问题,隧道是对过滤的绕过, 隧道技术是为了解决什么 解决被防火墙一些设备,ids(入侵检测系统)进行拦截的东西进行突破&#xff0…

迪杰斯特拉(Dijkstra)算法详解

【专栏】数据结构复习之路 这篇文章来自上述专栏中的一篇文章的节选: 【数据结构复习之路】图(严蔚敏版)两万余字&超详细讲解 想了解更多图论的知识,可以去看看本专栏 Dijkstra 算法讲解: 迪杰斯特拉算法(Di…

pip install skopt安装显示没有对应版本问题及解决

一、问题描述以及分析 (一)问题描述 ModuleNotFoundError: No module named skopt pip install skopt Note: you may need to restart the kernel to use updated packages.ERROR: Could not find a version that satisfies the requirement skopt (fro…

C语言编译器(C语言编程软件)完全攻略(第十三部分:VS2010使用教程(使用VS2010编写C语言程序))

介绍常用C语言编译器的安装、配置和使用。 十三、VS2010使用教程(使用VS2010编写C语言程序) 提示:VS2010 可以在 XP、Win7 和 Win8 下完美运行,但在 Win10 下可能会有兼容性问题,使用 Win10 的读者建议安装 VS2015 或…

JDBC练习查询所有内容

MySql表代码 -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,-- 品牌名称brand_name varchar(20),-- 企业名称company_name varchar(20),-- 排序字段ordered int…

解决VNC连接Ubuntu服务器打开终端出现闪退情况

服务器环境 阿里云ECS服务器 操作系统:Ubuntu 20.0.4 如何使用VNC连接阿里云ECS服务器 1.阿里云官方指导:通过VNC搭建Ubuntu 18.04和20.04图形界面 2.新手入门ECS——ubuntu 20.04安装图形化界面和本地VNC连接 问题描述 使用VNC连接上新申请阿里云服…

C# 如何读取Excel文件

当处理Excel文件时,从中读取数据是一个常见的需求。通过读取Excel数据,可以获取电子表格中包含的信息,并在其他应用程序或编程环境中使用这些数据进行进一步的处理和分析。本文将分享一个使用免费库来实现C#中读取Excel数据的方法。具体如下&…

LLM之RAG实战(九)| 高级RAG 03:多文档RAG体系结构

在RAG(检索和生成)这样的框架内管理和处理多个文档有很大的挑战。关键不仅在于提取相关内容,还在于选择包含用户查询所寻求的信息的适当文档。基于用户查询对齐的多粒度特性,需要动态选择文档,本文将介绍结构化层次检索…

实现文件拖拽上传的功能

1 先来看一下效果 2 我们来看一下代码执行的结果: 我们创建目标的容器盒子 和可以展示数据的ul 监听进入目前盒子的事件 3 文件进入目标容器中解析文件

使用echarts制作柱状图并且下方带表格

实现效果: 调试地址: Examples - Apache ECharts 源码: option { title: { left: center, top: 0, text: 2022-05月 制造产量 达成情况(单位: 吨) (图1)\n\n集团目标产量: 106,675吨 集团实际产量: 2,636吨, textStyle:{ fontSize:20, colo…

3D Gaussian Splatting复现

最近3D Gaussian Splatting很火,网上有很多复现过程,大部分都是在Windows上的。Linux上配置环境会方便简单一点,这里记录一下我在Linux上复现的过程。 Windows下的环境配置和编译,建议看这个up主的视频配置,讲解的很细…

QT基础知识

QT基础知识 文章目录 QT基础知识1、QT是什么2、Qt的发展史3、为什么学习QT4、怎么学习QT1、工程的创建(环境的下载与安装请百度)2、创建的工程结构说明3、怎么看帮助文档1、类使用的相关介绍2. 查看所用部件(类)的相应成员函数(功…

【LeetCode】修炼之路-0001-Two Sum(两数之和)【python】【简单】

前言 计算机科学作为一门实践性极强的学科,代码能力的培养尤为重要。当前网络上有非常多优秀的前辈分享了LeetCode的最佳算法题解,这对于我们这些初学者来说提供了莫大的帮助,但对于我这种缺乏编程直觉的学习者而言,这往往难以消化吸收。(为什么别人就能想出这么优雅…

牛刀小试 - C++实现贪吃蛇

参考文档 借鉴了这位大佬的博客及代码,键入代码后发现有很多报错,依次解决后成功运行 c 实现贪吃蛇(含技术难点解析和完整代码) 技术点: C中_kbhit()函数与_getch()函数 Windows API 坐标结构 COORD 句柄 HANDLE 获…

有能力,但是不赚钱,往往是因为没有这三个能力!2024最适合创业的细分行业,2024最适合创业的行业

很多人非常有能力,在学校是学霸,在公司是高管,但是出来自己创业就不行了。觉得是自己的能力不够,其实不是你的能力不够,而是你欠缺下面这三种能力。如果你能掌握这三种能力,就算之前是普通人尝试创业&#…

Hotspot源码解析-第十二章-线程栈保护页

了解保护页,先从几个问题开始吧 1、为什么线程栈有栈帧了,还要有保护页? 答:在操作系统中内存可以看成是一个大数组,这就有一个问题,线程之间可能会互相踩了别人的内存空间,所以栈空间也存在这…

UI自动化测试之Jenkins配置

背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试,但由于各种原因,接口自动化测试那部分功能整个废弃掉了,其中和…

word中MathType公式编号

直接上效果图: 步骤如下: 安装MathTypeword中安装MathType选项卡。设置MathType选项卡添加分隔符插入公式,自动生成右编码 接下来介绍每一步。 文章目录 1. 安装MathType2. Word中安装MathType选项卡3. 配置MathType选项4. 添加分隔符5. 插…

Halcon阈值处理的几种分割方法threshold/auto_threshold/binary_threshold/dyn_threshold

Halcon阈值处理的几种分割方法 文章目录 Halcon阈值处理的几种分割方法1. 全局阈值2. 基于直方图的自动阈值分割方法3. 自动全局阈值分割方法4. 局部阈值分割方法5. var_threshold算子6 . char_threshold 算子7. dual_threshold算子 在场景中选择物体或特征是图像测量或识别的重…