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

实验 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.mfbz.cn/a/295128.html

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

相关文章

CSS 纵向顶部往下动画

<template><div class="container" @mouseenter="startAnimation" @mouseleave="stopAnimation"><!-- 旋方块 --><div class="box" :class="{ scale-up-ver-top: isAnimating }"><!-- 元素内容 …

Python字符串

目录 1 创建字符串的三种方式2 字符串的转义3 字符串的格式化输出4 字符串的索引5 字符串的切片6 字符串的拼接7 计算字符串的长度8 判断字符串是否存在 字符串是编程中经常使用到的概念&#xff0c;熟悉字符串的常见用法是掌握编程的必经之路&#xff0c;本篇介绍一下字符串的…

Idea连接Docker在本地(Windows)开发SpringBoot

文章目录 1. 新建运行配置2. 修改运行目标3. 设置新目标Docker4. 选择运行主类5. 运行 当一些需要的服务在docker容器中运行时&#xff0c;因为docker网络等种种原因&#xff0c;不得不把在idea开发的springboot项目放到docker容器中才能做测试或者运行。 1. 新建运行配置 2. …

Spring见解3 AOP

4.Spring AOP 4.1.为什么要学习AOP? 案例&#xff1a;有一个接口Service有一个insert方法&#xff0c;在insert被调用时打印调用前的毫秒数与调用后的毫秒数&#xff0c;其实现为&#xff1a; public class UserServiceImpl implements UserService {private UserDao userDao…

书生·浦语大模型全链路开源开放体系

书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型全链路开源开放体系等你来探索~ https://github.com/internLM/tutorial 书生浦语全链条开源开放体系 1&#xff09;数据: 书生万卷 2TB数据&#xff0c;并行训练&#xff0c;极致优化涵盖多种模态与任务 预训练: I…

vmware虚拟机安装esxi7.0步骤

一、安装准备 1、下载镜像文件 下载链接&#xff1a;https://pan.baidu.com/s/12XmWBCI1zgbpN4lewqYw6g 提取码&#xff1a;mdtx 2、vmware新建一个虚拟机 2.1 选择自定义 2.2 选择ESXi对应版本 2.3 选择稍后安装操作系统 2.4 默认选择 2.5 自定义虚拟机名称及存储位置 2…

android 分享文件

1.在AndroidManifest.xml 中配置 FileProvider <providerandroid:name"android.support.v4.content.FileProvider"android:authorities"com.example.caliv.ffyy.fileProvider"android:exported"false"android:grantUriPermissions"true…

将Django项目从本地上传至宝塔服务器(踩坑记录)

文章目录 写在前面配置本地文件配置宝塔面板解决遇到问题展示运行结果热门文章 自我介绍 ⭐2022年度CSDN 社区之星 Top6 ⭐2023年度CSDN 博客之星 Top16 ⭐2023年度CSDN 城市之星 Top2&#xff08;苏州&#xff09; ⭐CSDN Python领域 优质创作者 ⭐CSDN 内容合伙人 推荐热门…

spring-boot-maven插件repackage(goal)的那些事

前言&#xff1a;在打包Springboot项目成jar包时需要在pom.xml使用spring-boot-maven-plugin来增加Maven功能&#xff0c;在我的上一篇博客<<Maven生命周期和插件的那些事&#xff08;2021版&#xff09;>>中已经介绍过Maven和插件的关系&#xff0c;在此不再赘述&…

基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码

基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于哈里斯鹰算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于哈里斯鹰优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

凝聚层次聚类及DBscan算法详解与Python实例

凝聚层次聚类及DBscan算法详解与Python实例 凝聚层次聚类DBscan算法实例演示 在本篇博客中&#xff0c;我们将深入探讨凝聚层次聚类&#xff08;Agglomerative Hierarchical Clustering&#xff09;和DBscan算法&#xff0c;并通过Python实例演示它们的应用。这两种算法都属于聚…

12 位多通道,支持 MPU 存储保护功能,应用于工业控制,智能家居等产品中的国产芯片ACM32F403/F433

ACM32F403/F433 芯片的内核基于 ARMv8-M 架构&#xff0c;支持 Cortex-M33 和 Cortex-M4F 指令集。芯片内核 支持一整套DSP指令用于数字信号处理&#xff0c;支持单精度FPU处理浮点数据&#xff0c;同时还支持Memory Protection Unit &#xff08;MPU&#xff09;用于提升应用的…

Vue中break关键字

Change() {//每次触发该事件&#xff0c;都要讲data重新赋值一次this.data JSON.parse(JSON.stringify(this.data1));// 根据选中的等级更新数据switch (this.selectedlevel) {case 1:// 更新数据为一级数据this.data this.data.filter(item > item.level "1"…

VINS-MONO拓展2----更快地makeHessian矩阵

1. 目标 完成大作业T2 作业提示&#xff1a; 多线程方法主要包括以下几种(参考博客)&#xff1a; MPI(多主机多线程开发),OpenMP(为单主机多线程开发而设计)SSE(主要增强CPU浮点运算的能力)CUDAStream processing, 之前已经了解过std::thread和pthread&#xff0c;拓展1…

Unity 打包AB 场景烘培信息丢失

场景打包成 AB 资源的时候&#xff0c;Unity 不会打包一些自带相关的资源 解决办法&#xff1a;在 Project settings > Graphics下设置&#xff08;Automatic 修改成 Custom&#xff09;

WPF 入门教程DispatcherTimer计时器

https://www.zhihu.com/tardis/bd/art/430630047?source_id1001 在 WinForms 中&#xff0c;有一个名为 Timer 的控件&#xff0c;它可以在给定的时间间隔内重复执行一个操作。WPF 也有这种可能性&#xff0c;但我们有DispatcherTimer控件&#xff0c;而不是不可见的控件。它几…

【响应式编程-03】Lambda表达式底层实现原理

一、简要描述 Lambda的底层实现原理Lambda表达式编译和运行过程 二、Lambda的底层实现原理 Lambda表达式的本质 函数式接口的匿名子类的匿名对象 反编译&#xff1a;cfr-0.145.jar 反编译&#xff1a;LambdaMetafactory.metafactory() 跟踪调试&#xff0c;转储Lambda类&#x…

产品分析 | 数据资产目录竞品分析

一、分析背景和目的 分析市场上主流的包含数据资产目录的产品&#xff0c;重新整理一篇竞品分析以供参考和学习。 二、版本信息 三、名词解释 四、需求背景 1. 产品现状 建设了数据资产目录&#xff0c;但是偏技术向&#xff0c;比较难用&#xff0c;细节流程上欠考虑。元数…

Typescript 中的namespace

命名空间&#xff1a; 类似 vuex 的 namespace 相当于一个容器。 namespace 是一种将相关代码组织在一起的方式&#xff0c;中文译为“命名空间”。 它出现在 ES 模块诞生之前&#xff0c;作为 TypeScript 自己的模块格式而发明的。但是&#xff0c;自从有了 ES 模块&#x…

护眼台灯哪个牌子好?2024年专业护眼台灯品牌排行榜!

近些年来&#xff0c;护眼台灯作为视力健康照明工具愈发受到欢迎&#xff0c;越来越多的人使用护眼台灯取代传统白炽灯&#xff0c;做护眼台灯的产品也是层出不穷。 不过&#xff0c;也有很多人对护眼台灯的效果保持怀疑的台灯&#xff0c;一是对护眼效果的疑问&#xff0c;二…
最新文章