-
-
[原创]分析实战读书笔记7_Lab9-2分析
-
发表于: 2021-1-12 15:47 4536
-
本篇文章记录下9-2样本的分析步骤, 依然以IDA为主,OD为辅. 样本中涉及到了一个简单的字符串内存解密的操作.
查壳 一个简单的无壳程序
提串看一下
排除掉垃圾信息, 只有一些API名字和一个cmd, 在之前的练习中提串总是能获取到很多有用的信息, 甚至仅提串就能知道样本行为, 看来这个样本不适用这个方法了.
简单看下导入表, 有一个创建进程的操作,后面需要留意下
无导出表, 到这里基本就知道有个创建进程的操作和一个cmd字符串, 可能是cmd动态执行命令?
将样本拖入火绒剑, 好家伙直接结束了, 看来只能靠IDA了
进入main函数401128
, 函数开始就是一大段赋值代码
可以看出来是一个字符数组, 注意最后赋值的0
,ASCII码为0的字符为\0
,通常作为字符串的结尾,所以可以推断这里是为两个字符串进行赋值, 分别是: 1qaz2wsx3edc ocl.exe
,将局部变量Str和Str1改为数组形式, 方便后面的分析
双击Str进入栈窗口
右键Str,选择Array
在Array size处填入数组长度后按回车, Str1重复刚才的操作 ,然后将str与str1重命名方便区分
回到main函数,应该变成这个样子:
继续向下分析,程序通过GetModuleFileName
获取自身程序全路径, 然后通过_strrchr
寻找路径中最后一个\
进行切割, 实际上等同于取自身文件名
操作
然后将取到的文件名
与oclExeStr
进行比较, 如果不相同则直接结束进程, 也就是一个简单的文件名自校验
操作
通过WSASartup
与WSASocketA
进行初始化网络链接, 在初始化全部成功后调用call_401089
, 紧接着调用gethostbyname
, 这个函数用于将域名解析为IP地址, 而参数是一个域名字符串
通过追溯参数eax来源可以发现是401089
处的函数返回值, 进入401089
发现很多内存操作,没有API调用没有call调用
到这里如果我们去逐行分析汇编代码是很痛苦且耗时的, 为了搞清楚到底返回什么, 我们需要用到OD去动态调试提取字符串
根据上文的分析,我们知道程序会检验自身文件名, 我们将文件更名为ocl.exe
后拖入OD, 然后在401089
处下F2断点, 按F9运行程序
可以看到1qaz2wsx3edc
被作为参数传入栈内,执行到函数结尾retn处暂停, 观察OD窗口
可以发现eax 也就是返回值
被赋值为www.practicalmalwareanalysis.com
, 现在我们知道401089
处的函数用于内存解密域名字符串
回到main函数, 继续向下分析, 程序通过htons
与connect
用于打开一个网络套接字
通过查阅百度百科或微软官方API, 可以知道connect的三个参数为套接字描述符 sockaddr结构指针 sockaddr长度
, 然后将局部变量重新命名为sockaddr
接下来程序调用了401000
函数, 并将局部变量s
作为参数传入, 也就是套接字描述符
, 之后休眠30秒再次执行循环
进入401000, 将参数重命名以作标记
观察call的调用, 可以明显的发现调用了CreateProcessA
,并将hStdInput hStdOutput hStdError
全部设置为外层创建的网络套接字
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- 利用OLLVM编译windows驱动 30404
- [求助]SetWindowLong、SetWindowLongPtr无效问题 6915
- [求助]大佬们求一份21H2镜像,最好是VM镜像,原版也可以 6970
- [原创]X86内核笔记_6_APC相关 22425
- [原创]X86内核笔记_5_句柄 15487