-
-
[原创]分析实战读书笔记6_样本实战之初探树形逻辑
-
发表于: 2021-1-7 11:27 4263
-
本章分析下Lab9-1这个样本,书中给出的分析方法中以OD为主,这里我将以IDA为主,OD为辅来分析一下这个恶意样本,推荐各位小伙伴在阅读此篇文章后去看一下书中给出的分析思路
拿到样本肯定第一件事是先初步了解样本,必不可少的操作
程序无壳,是个控制台程序. 看区段感觉没啥复杂的东西,貌似是个比较简单的样本
过滤掉API、乱码等数据, 剩余比较敏感的就是红框中的数据
无导出表
可以看到样本还是导入了很多功能函数, 具体每个API的功能就不说了, 百度都可以查到, 大致包括文件操作 网络操作 命令执行 注册表操作 服务操作
等
静态大致看一遍, 不能说明什么问题, 我们将样本拖入火绒剑跑一下
没看到什么行为, 上来就是直接自删除
幸运的是我们在提串时候看到了几个疑似参数的东西, 我们尝试随便提供一个参数再执行
并未像我们预想一样有什么改变 , 样本依然直接自删除了, 看来内部有一些逻辑我们没有成功触发, 只能在后面的分析中去验证了
将样本拖入IDA, 定位至main函数00402AF0
可以看到main函数是很长一段, 这样硬读汇编太可怕了, 我们按下空格
切换至树形视图
将树形图缩小, 观察大致流程, 我们可以总结出一条信息: main函数主体分为两大分支, 其中右分支为多个ifelse的组合判断
清晰的看到了main函数的结构,我们则需要关注为什么main函数会出现两个大分支
将中心放在分支处观察代码
可以看到一句cmp [ebp+argc], 1
, 学过C或C++的同学应该知道对于控制台程序而言, 参数从左到右依次为:参数个数 参数数组 环境变量 对于无参数的程序而言,参数个数为1,内容为程序自身全路径
这里判断参数个数是否大于1, 如果不大于(无参数)则执行左分支, 若有参数则执行右分支
由于我们第一次运行时并未给出参数, 程序执行了自删除后退出了, 因此我们也先分析左分支
观察左分支代码, 首先调用了一个call 401000, 然后根据返回值去调用402410或402360
需要注意 这里402410后面没有流程线了, 这不是IDA的解析错误, 而是说明进入了这个call后就不会再出来了,而符合这种代码的情况可能是创建窗口 函数内部有退出
, 而对于我们这个控制台程序, 很明显402410内部存在退出程序的代码
再看402360, 执行完这个call后主程序正常退出
一个一个来分析, 先进入401000
进来就是一套经典的获取注册表值得操作 , 路径为"SOFTWARE\\Microsoft \\XPS"
下的"Configuration"
项
关注红框与紫框内的逻辑, 可以发现当成功获取到注册表值时返回1, 否则返回 0
知道逻辑了,我们可以按下N将函数重命名为GetRegVal_Cfg
回到外层,我们知道了当注册表值获取成功后返回1, 也就是跳转不生效执行402360
函数后退出
当获取失败后执行402410然后就没然后了, 那么我们就先进入402410看看
这实在没啥好看的了, 就是一个拼接命令串然后执行自删除的功能, 也就是我们最先无参数执行时看到的结果, 代码也是无分子的顺序结构
402360函数需要让注册表内有值才可以执行, 具体什么值目前我们还不知道, 应该是main函数右分支进行设置的,我们这里只做静态分析看看行为
进入函数就是熟悉的while循环,而且跳出的方式不在条件判断处(40236D), 而是内部代码块实现的跳出, 可以理解为死循环了, 每次循环需要sleep一秒钟
分析结构, 可以发现跳出循环共有两种方式 : 401280返回值为0 402020返回值为0
,402408处的跳出永远不会触发
接下来就是对这两个call的分析了
观察调用处, 可以收集到的信息为: 函数有8个参数, 其中4个为常量0x400(1024), 每个常量与一个lea传递的指针为一对 , 形似为指针内容赋指定大小的值
函数为cdcal调用, 外平栈, 参数从右至左压栈
进入401280
观察函数结构 , 可以发现当注册表值获取失败后会退出函数, 成功时会执行右侧一大段代码, 我们在分析右侧代码前需要整理下函数参数
刚刚我们看到了8个push ,这里ida识别成了4个参数, 也证实了每个参数与0x400配对的猜想
根据压栈顺序为参数重命名
简单观察这段代码, 可以很明显看出来是字符串拷贝, 将从注册表中取出的数据复制到参数中(前面已经说过参数是通过lea传递的指针,是4个out型参数), 这里有3个拷贝不能明显看出从哪里复制的, 暂时先不管
当成功对参数进行赋值后会返回0, 否则返回1
将String转整型后压栈, 将name压栈, 外平栈 cdcal 参数从右至左入栈
进入call内部
可以看到首先执行一个call ,然后根据返回值执行不同分支
这里就不带着各位进call看了, 进去后看到call就点进去, 当你点到401AF0你就会发现很多网络相关API, 简单梳理代码逻辑就能发现这是个从服务端接收内容的函数
401E60就是用于从服务端接收数据,如果接收到了数据然后会执行右侧分支
右侧分支很清晰的展示了代码操作: 逐个进行字符串比较,根据字符串不同执行不同功能:
402020处的函数进去看见call就点进去大致看一看 , 根据API函数就可以知道是什么意思了, 因此就不细致分析了
到这里main函数左分支的分析就大致完成了, 总体行为是 : 当注册表中有值时会从服务端接收命令,根据不同命令执行不同功能
, 而注册表中保存的是什么目前还不知道,我们需要继续分析main函数的右分支
回到main函数 观察右分支结构 可以发现有五大块判断, 五个判断组成了ifelse结构, 每个判断下分别有自己的逻辑分支, 因此我们将从上至下依次分析这5条分支
观察代码结构, 发现当402510的返回值不为0时执行下一个判断, 当为0时执行402410函数, 前文已经分析过402410负责自删除+退出程序, 我们将其命名方便后面的分析
观察402510的参数, 可以看出参数是启动参数的最后一个参数
也就是说要想要继续执行,这里的跳转必须成立, 我们进入402510看看代码是什么样子的
好家伙, 一堆字符判断, 而能直观看出来字符的只有第一个 'a' ,要想知道具体的判断字符是什么则需要细致分析汇编配合OD动态调试, 不过我们已经知道了这个函数是验证启动参数最后一个参数是否是某个字符串, 并且如果验证成功, 这个函数的返回值不是0
知道了这些, 我们就不用管他汇编代码是啥了, 用OD打开样本, 在402510处修改汇编代码为mov eax,1 retn
即可, 这样就可以跳过启动参数的内容验证
继续观察第二个判断, 可以发现是将argv + 4
也就是第二个参数(我们的启动参数)与-in
做判断, 如果相同则走左侧分支, 不相同则继续右侧分支的判断. 那么我们就去左侧分支看看干了什么事
首选判断参数个数, 如果既不是3也不是4, 那么执行402410处的自删除+退出
如果参数为3个时, 则首先执行4025B0处的取程序路径, 然后执行402600处的函数, 该函数内部用于将自身拷贝至系统目录下,并注册成一个服务, 具体代码就不贴了, 前几篇文章已经分析过这类功能
如果参数为4个时, 则执行402600注册服务, 服务名从启动参数中获取(这也是为什么多了一个参数的原因)
判断3判断4判断5的分析思路也都大同小异, 在经历过前几章的分析后只需要关注外层代码逻辑即可, 内层功能如果前几章练习做的用心, 大致看一眼就知道什么功能了.
判断3: -re 卸载服务, 删除系统目录下的恶意文件
判断4: -c 设置注册表值
判断5: -cc 控制台打印注册表内容
9-1的练习相比前几章的练习仅多了一些判断和逻辑分支, 也没出现什么超纲的内容, 如果前文的练习做的认真, 这里内层的功能基本一眼就能看出来, 只需关注外层的逻辑就行
对于大量汇编代码且多个跳转, IDA的树形视图是一个很不错的选择, 可以帮分析者梳理程序执行流程, 将代码分成若干部分, 一点点分析
Configuration
/
/
不知道是啥
SOFTWARE\Microsoft \XPS
/
/
一个注册表路径 需要注意的是Microsoft后面多了个空格
\kernel32.dll
/
/
没啥可疑的
HTTP
/
1.0
/
/
HTTP协议
GET
/
/
请求类型 样本有网络通信操作
'`'
`'
/
/
这是什么玩意?
`
'`'
`
/
/
这是什么玩意?
NOTHING
/
/
未知功能字符串
CMD
/
/
未知功能字符串
DOWNLOAD
/
/
未知功能字符串
UPLOAD
/
/
未知功能字符串
SLEEP
/
/
SLEEP大写 可能用于字符串比较用来执行真正的sleep函数
cmd.exe
/
/
可能存在执行命令的功能?
>> NUL
/
/
在批处理中将提示信息输出到空设备, 简而言之就是屏蔽提示信息
/
c
del
/
/
删除文件?
ups
/
/
未知功能字符串
http:
/
/
www.practicalmalwareanalysis.com
/
/
一个URL
Manager Service
/
/
样本会涉及服务操作
.exe
/
/
不知道用来干什么
%
SYSTEMROOT
%
\system32\
/
/
系统目录
k:
%
s h:
%
s p:
%
s per:
%
s
/
/
未知功能字符串
-
cc
/
/
-
开头,类似命令行参数
-
re
/
/
-
开头,类似命令行参数
-
in
/
/
-
开头,类似命令行参数
Configuration
/
/
不知道是啥
SOFTWARE\Microsoft \XPS
/
/
一个注册表路径 需要注意的是Microsoft后面多了个空格
\kernel32.dll
/
/
没啥可疑的
HTTP
/
1.0
/
/
HTTP协议
GET
/
/
请求类型 样本有网络通信操作
'`'
`'
/
/
这是什么玩意?
`
'`'
`
/
/
这是什么玩意?
NOTHING
/
/
未知功能字符串
CMD
/
/
未知功能字符串
DOWNLOAD
/
/
未知功能字符串
UPLOAD
/
/
未知功能字符串
SLEEP
/
/
SLEEP大写 可能用于字符串比较用来执行真正的sleep函数
cmd.exe
/
/
可能存在执行命令的功能?
>> NUL
/
/
在批处理中将提示信息输出到空设备, 简而言之就是屏蔽提示信息
/
c
del
/
/
删除文件?
ups
/
/
未知功能字符串
http:
/
/
www.practicalmalwareanalysis.com
/
/
一个URL
Manager Service
/
/
样本会涉及服务操作
.exe
/
/
不知道用来干什么
%
SYSTEMROOT
%
\system32\
/
/
系统目录
k:
%
s h:
%
s p:
%
s per:
%
s
/
/
未知功能字符串
-
cc
/
/
-
开头,类似命令行参数
-
re
/
/
-
开头,类似命令行参数
-
in
/
/
-
开头,类似命令行参数
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
赞赏
- 利用OLLVM编译windows驱动 30404
- [求助]SetWindowLong、SetWindowLongPtr无效问题 6912
- [求助]大佬们求一份21H2镜像,最好是VM镜像,原版也可以 6970
- [原创]X86内核笔记_6_APC相关 22425
- [原创]X86内核笔记_5_句柄 15487