恶意代码分析实战19-03

本文分析了一个利用PDF文件中CVE-2008-2992漏洞的案例,详细拆解了shellcode如何从PDF中提取文件并执行,包括shellcode的编码方式、调用的函数、留下的文件痕迹及其具体行为。

本次实验我们将会分析lab19-03相关文件。先来看看要求解答的问题
Q1.这个PDF中使用了什么漏洞?
Q2.这段shellcode是如何编码的?
Q3.这段shellcode导入了哪些函数?
Q4.这段shellcode在文件系统上留下了什么迹象?
Q5.这段shellcode做了什么?
分析文件Lab19-03.pdf以及lab19-03_sc.bin
首先我们切换到kali进行分析
先使用pdfid检查下
在这里插入图片描述

注意到有js,javascript,结合题目的问题,那么可能这个pdf文件就是利用JavaScript来进行攻击的
我们进一步在win上使用PDFStremDumper检测,将pdf载入,点击exploit_scan得到下入所示文档
在这里插入图片描述

可以看到利用的是CVE-2008-2992
Q1.这个PDF中使用了什么漏洞?
A1. PDF 文件中包含一个CVE-2008-2992漏洞
我们选择第9个data stream
在这里插入图片描述

可以看到内嵌其中的JavaScript脚本
在这里插入图片描述

具体分析如下
在这里插入图片描述

使用unescape函数和一个字符串来初始化攻击负载
可以使用脚本进行相应的解码后将其转换为二进制文件
在这里插入图片描述

检查应用程序的版本来决定它是否应该尝试漏洞利用
在这里插入图片描述

执行了堆喷射的操作,之后调用util.printf触发漏洞利用,可以看到输出一个很大的数字,这是很可疑的。这正是为了触发漏洞,因为这里存在不当的边界检查,从而造成缓冲区溢出攻击。
Q2.这段shellcode是如何编码的?
A2.这个文件中的shellcode使用的是JavaScript的percent-encoding编码形式,也就是百分号编码,并且随着JavaScript一起保存在PDF中。
我们可以先使用sctest生成调用流图
root@kali:~# sctest -Svs 1000000 -G shell.dot < Lab19-03_sc.bin > shell
root@kali:~# dot shell.dot -T png -o diagram.png
在这里插入图片描述

得到的图片如下所示
在这里插入图片描述

图中只看到了两个关键的函数
在这里插入图片描述

分别是GetFileSize和LoadLibrary
接下来使用scdbg进一步查看其导入函数
scdbg –f bin文件 –fopen pdf文件 –i
在这里插入图片描述

由上图可知调用了CreateFile创建了foo.exe,bar.pdf
对应的,之后会调用CrateProcess创建进程,调用ShellExecute打开bar.pdf
Q3.这段shellcode导入了哪些函数?
A3.如上图所示,导入了很多,这里不一一列举。
Q4.这段shellcode在文件系统上留下了什么迹象?
A4. shellcode 在文件系统上创建文件%TEMP%foo. exe与%TEMP%\bar.pdf。

我们仔细看上scdbg的回显结果,程序在临时文件夹中写入了foo.exe,bar.pdf;此外通过CreateProcessA创建了foo.exe进程,通过ShellExecute打开bar.pdf
我们可以通过IDA来分析bin文件
打开后直接按c键,将其转为代码
在这里插入图片描述

注意到上图中,sub esp,17ch。这是因为esp为栈顶指针,栈由高向低增长,这里相当于是抬高了栈帧
之后call sub_17b,这样call的这一个指令的地址也就是0d会入栈,不过这时候我们在上图注意到此时0d开头的这一部分是一些没意义的数据
双击跟入sub_17b
在这里插入图片描述

Pop esi则是把0d的地址赋给了esi
继续往下看
在这里插入图片描述

这里需要注意,在000183处调用的sub_CA,实际上就是findkernel32Base,用于查找系统中的kernel32.dll的地址。而0x195位置的是findSymbolByHash函数,用于hash值的计算
在18b处可以看到一共是是对kernel32做了0xe次操作,也就是14次操作
在19d,1a2看到两个push,我们可以将其右键转换如下所示
在这里插入图片描述

拼接起来可知,程序在19D以及1A2的位置压入了“shell32”这个字符串,作为LoadLibrary函数的参数
继续往下分析
在这里插入图片描述

注意,1c6处的call实际上是在调用GetFIleSize,给定一个句柄,这个函数会返回句柄对应的文件大小。在1b6处的xor指令首先将句柄初始化为0,然后在1bb处每次迭代都加上4.
得到的结果会与shellcode嵌入数据区偏移量为0x3c处的值比较,这个偏移处应该是有一个给定的值的,不过由于我们现在是静态分析,无法获得。
我们猜测这应该是shellcode在启动漏洞攻击之前,先判断当前pdf文件的大小是否和lab19-03.pdf的大小一致。
继续往下分析
在这里插入图片描述

这里需要注意,1ef处的call是调用SetFilePointer
在1e9处注意到基于嵌入数据区的偏移量为0x40
这里是通过调用SetFilePointer调整文件指针在恶意pdf中的位置,基于嵌入数据区的偏移量为0x40处的值,从恶意pdf中提取出第一个文件的文件偏移量。之后调用sub_13d来读取文件内容。
继续往下分析
在这里插入图片描述

这里注意,21e处的call实际上是调用GetTempPathA
这里shellcode是构造了一个输出文件路径,调用GetTempPathA,然后会追加字符串
追加的内容可以在22f,235处可以看到,这里需要转换成如下所示
在这里插入图片描述

可以看到追击的字符串的内容为foo.exe
继续往下分析
在这里插入图片描述

252处的sub_EB实际是用于将缓冲区内容写入磁盘,注意到在调用它之前有5个连续push,说明其有5个参数,它会使用246处的0x4a与输入缓冲区中的每个字符串异或,然后将解密的缓冲区写入到245处的eax中的值(也就是说此处eax的内容就是该函数的输出文件名)
结合前一段指令的分析结果,我们知道这里是会写入文件foo.exe
注意286处的call实际是调用CreateProcessA,这个文件名会被传递给CreateProcessA调用,它负责用刚刚写入磁盘的文件创建一个新进程
继续往下分析
在这里插入图片描述

这一部分shellcode是在重复相同的过程来提取存储在恶意pdf中的第二个文件
在294处,shellcode根据存储在嵌入数据偏移量0x4c处的文件的大小来分配一个内存空间,然后会根据2a6处的偏移量0x48存储的文件偏移量,来调整文件指针的位置
继续往下分析
在这里插入图片描述

这里shellcode使用与第一个文件相同的临时文件路径,但是在2c3,2c9处的表示的文件名换了,我们可以转换后看到如下所示
在这里插入图片描述

看到是用bar.pdf替换了文件名
2e3处的sub_EB使用2d7处给出的0x4a来解码文件内容,并将其写入%temp%bar.pdf
继续往下分析
在这里插入图片描述

这里先把2f0处的数字转换一下
在这里插入图片描述

看到是open
注意310处的call是调用ShellExecute
这里shellcode调用ShellExecute打开它刚刚写入到%temp%bar.pdf中的pdf文件
之后shellcode传入命令字符串open和PDF的路径使得系统可以使用已注册的应用程序打开这个指定的文件
Q5.这段shellcode做了什么?
A5. shellcode 从PDF中提取其中存储的两个编码文件,并且将它们写入%TEMP%目录。同时,它运行foo.exe文件,并打开bar.pdf文档。

基础篇-0-Java虚拟机导学课程 11:33 基础篇-1-初识JVM 22:27 基础篇-2-Java虚拟机的组成 04:47 基础篇-3-字节码文件的组成-以正确的姿势打开字节码文件 10:41 基础篇(补)-3.5-字节码文件的组成-基础信息 15:54 基础篇-4-字节码文件的组成-常量池和方法 25:51 基础篇-5-字节码文件常见工具的使用1 11:43 基础篇-6-字节码文件常见工具的使用2 22:20 基础篇-7-类的生命周期加载阶段 22:09 基础篇-8-类的生命周期2连接阶段 19:58 基础篇-9-类的生命周期3初始化阶段 26:27 基础篇-10-类加载器的分类 13:56 基础篇-11-启动类加载器 13:36 基础篇-12-扩展和应用程序类加载器 16:26 基础篇-13-双亲委派机制 18:43 基础篇-14-打破类的双亲委派机制-自定义类加载器 25:16 基础篇-15-打破双亲委派机制2-线程上下文类加载器 20:17 基础篇-16-打破双亲委派机制3-osgi和类的热部署 11:53 基础篇-17-JDK9之后的类加载器 09:05 基础篇-18-运行时数据区-程序计数器 15:42 基础篇-19--局部变量表 19:20 基础篇-20--操作数栈和帧数据 12:08 基础篇-21--内存溢出 15:28 基础篇-22-堆内存 25:56 基础篇-23-方法区的实现 16:25 基础篇-24-方法区-字符串常量池 20:40 基础篇-25-直接内存 12:39 基础篇-26-自动垃圾回收 11:32 基础篇-27-方法区的回收 11:32 基础篇-28-引用计数法 15:41 基础篇-29-可达性分析法 20:25 基础篇-30-软引用 24:40 基础篇-31-弱虚终结器引用 12:08 基础篇-32-垃圾回收算法的评价标准 13:31 基础篇-33-垃圾回收算法1 10:05 基础篇-34-垃圾回收算法-分代GC 20:19 基础篇-35-垃圾回收器1 15:54 基础篇-36-垃圾回收器2 11:44 基础篇-37-垃圾回收器3 15:51 基础篇-38-g1垃圾回收器 26:23 实战-1-内存泄漏和内存溢出 21:25 实战-2-解决内存泄漏-监控-top命令 12:16 实战-3-解决内存泄漏-监控-visualvm 12:50 实战-4-解决内存泄漏-监控-arthas tunnel 15:18 实战-5-解决内存泄漏-监控-prometheus-grafana 17:53 实战-6-解决内存泄漏-堆内存状况对比 08:39 实战-7-解决内存泄漏-内存泄漏产生的几大原因 16:01 实战-8-内存泄漏产生的原因2 13:30 实战-9-内存泄漏产生的原因3 10:43 实战-10-内存泄漏产生的原因4 10:04 实战-11-内存泄漏产生原因2-并发请求问题 17:30 实战-12-导出堆内存快照并使用MAT分析 08:38 实战-13-MAT内存泄漏检测原理 17:23 实战-14-服务器导出内存快照和MAT使用小技巧 13:31 实战-15-实战1-查询大数据量导致的内存溢出 26:24 实战-16-实战2-mybatis导致的内存溢出 10:34 实战-17-实战3-k8s容器环境导出大文件内存溢出 26:13 实战-18-系统不处理业务时也占用大量的内存 14:13 实战-19-文章审核接口的内存问题 18:28 实战-20-btrace和arthas在线定位问题 20:15 实战-21-GC调优的核心目标 11:23 实战-22-GC调优的常用工具 12:05 实战-23-GC调优的常见工具2 14:25 实战-24-常见的GC模式 13:38 实战-25-基础JVM参数的设置 28:31 实战-26-垃圾回收器的选择 18:04 实战-27-垃圾回收参数调优 07:56 实战-28-实战-GC调优和内存调优 30:43 实战-29-性能问题的现象和解决思路 10:49 实战-30-定位进程CPU占用率高的问题 18:52 实战-31-接口响应时间很长问题的定位 14:44 实战-32-火焰图定位接口响应时间长的问题 12:03 实战-33-死锁问题的检测 14:37 实战-34-基准测试框架JMH的使用 28:24 实战-35-实战-性能调优 26:36 高级篇-01-GraalVM介绍 12:13 高级篇-02-GraalVM的两种运行模式 15:43 高级篇-03-使用SpringBoot3构建GraalVM应用 15:08 高级篇-04-将GraalVM应用部署到函数计算 25:13 高级篇-05-将GraalVM应用部署到Serverless 09:14 高级篇-06-参数优化和故障诊断 22:31 高级篇-07-垃圾回收器的技术演进 13:09 高级篇-08-ShenandoahGC 22:50 高级篇-09-ZGC 14:35 高级篇-10-实战案例-内存不足时的垃圾回收测试 09:47 高级篇-11-JavaAgent技术 12:16 高级篇-12-JavaAgent环境搭建 15:24 高级篇-13-查看内存的使用情况 18:48 高级篇-14-生成内存快照 13:47 高级篇-15-获取类加载器的信息 16:26 高级篇-16-打印类的源码 18:00 高级篇-17-使用ASM增强方法 29:45 高级篇-18-使用ByteBuddy打印方法执行的参数和耗时 21:55 高级篇-19-APM系统和数据采集 24:30 原理篇-01-栈上的数据存储 15:05 原理篇-02-boolean在栈上的存储方式 22:48 原理篇-03-对象在堆上的存储1 17:27 原理篇-04-对象在堆上的存储2 25:14 原理篇-05-方法调用的原理1-静态绑定 19:26 原理篇-06-方法调用的原理2-动态绑定 15:25 原理篇-07-异常捕获的原理 12:00 原理篇-08-JIT即时编译器 14:49 原理篇-09-JIT即时编译器优化手段1-方法内联 16:49 原理篇-10-JIT即时编译器优化手段2-逃逸分析 09:03 原理篇-11-g1垃圾回收器原理-年轻代回收 27:57 原理篇-12-g1垃圾回收器原理-混合回收 17:24 原理篇-13-ZGC原理 26:27 原理篇-14-ShenandoahGC原理 09:39 面试篇-01-什么是JVM 16:38 面试篇-02-字节码文件的组成 15:02 面试篇-03-什么是运行时数据区 20:09 面试篇-04-哪些区域会出现内存溢出 11:56 面试篇-05-JDK6-8内存区域上的不同 14:36 面试篇-06-类的生命周期 17:17 面试篇-07-什么是类加载器 17:05 面试篇-08-什么是双亲委派机制 12:15 面试篇-09-如何打破双亲委派机制 18:10 面试篇-10-tomcat的自定义类加载器 31:18 面试篇-11-如何判断堆上的对象有没有被引用 10:05 面试篇-12-JVM中都有哪些引用类型 16:58 面试篇-13-theadlocal中为什么要使用弱引用 12:16 面试篇-14-有哪些垃圾回收算法 24:54 面试篇-15-有哪些常用的垃圾回收器 18:55 面试篇-16-如何解决内存泄漏问题 23:52 面试篇-17-常见的JVM参数 11:11 这是目前我学习的视频集合,要不要全看,或者少了什么,有哪些重要内容需要进行学习汇总或刷题或通过小实例验证
最新发布
10-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值