分析实战读书笔记_Lab9-2分析

0.前言

本篇文章记录下9-2样本的分析步骤, 依然以IDA为主,OD为辅. 样本中涉及到了一个简单的字符串内存解密的操作.

1.初步静态分析

epJCM7YmawOsKIG

查壳 一个简单的无壳程序

提串看一下

LAS3D2xUltVpERr

排除掉垃圾信息, 只有一些API名字和一个C++md, 在之前的练习中提串总是能获取到很多有用的信息, 甚至仅提串就能知道样本行为, 看来这个样本不适用这个方法了.

IaZr4LYPuwjh26n

简单看下导入表, 有一个创建进程的操作,后面需要留意下

无导出表, 到这里基本就知道有个创建进程的操作和一个cmd字符串, 可能是cmd动态执行命令?

2.火绒剑捕捉

nvWlHUTX89wuzef

将样本拖入火绒剑, 好家伙直接结束了, 看来只能靠IDA了

3.IDA分析

进入mAIn函数401128, 函数开始就是一大段赋值代码

Fi3vPu6ksXw5eoB

可以看出来是一个字符数组, 注意最后赋值的0,ASCII码为0的字符为,通常作为字符串的结尾,所以可以推断这里是为两个字符串进行赋值, 分别是: 1qaz2wsx3edc ocl.exe ,将局部变量Str和Str1改为数组形式, 方便后面的分析

双击Str进入栈窗口

SgZrNysbDx3qFUd

右键Str,选择Array

XlAaMVKuySpsq9D

在Array size处填入数组长度后按回车, Str1重复刚才的操作 ,然后将str与str1重命名方便区分

回到main函数,应该变成这个样子:

N3o6l92qAZdrpRH

继续向下分析,程序通过GetModuleFileName获取自身程序全路径, 然后通过_strrchr寻找路径中最后一个进行切割, 实际上等同于取自身文件名操作

bHRNqQDahVoUGSu

然后将取到的文件名oclExeStr进行比较, 如果不相同则直接结束进程, 也就是一个简单的文件名自校验操作

hHGqOpjxB69fvrT

通过WSASartupWSASocketA进行初始化网络链接, 在初始化全部成功后调用call_401089, 紧接着调用gethostbyname, 这个函数用于将域名解析为IP地址, 而参数是一个域名字符串

通过追溯参数eax来源可以发现是401089处的函数返回值, 进入401089发现很多内存操作,没有API调用没有call调用

到这里如果我们去逐行分析汇编代码是很痛苦且耗时的, 为了搞清楚到底返回什么, 我们需要用到OD去动态调试提取字符串

3.1 OD提取解密字符串

根据上文的分析,我们知道程序会检验自身文件名, 我们将文件更名为ocl.exe后拖入OD, 然后在401089处下F2断点, 按F9运行程序

7GHse4BCx1Qdiu6

可以看到1qaz2wsx3edc被作为参数传入栈内,执行到函数结尾retn处暂停, 观察OD窗口

khKy8RIfG5D7QaH

可以发现eax 也就是返回值被赋值为www.practicalmalwareanalysis.com, 现在我们知道401089处的函数用于内存解密域名字符串

ZxMTdRuh7wCBVmY

回到main函数, 继续向下分析, 程序通过htonsconnect用于打开一个网络套接字

通过查阅百度百科或微软官方API, 可以知道connect的三个参数为套接字描述符 sockaddr结构指针 sockaddr长度, 然后将局部变量重新命名为sockaddr

接下来程序调用了401000函数, 并将局部变量s作为参数传入, 也就是套接字描述符, 之后休眠30秒再次执行循环

4.sub_401000

FzbBw6Kh3fsH28l

进入401000, 将参数重命名以作标记

观察call的调用, 可以明显的发现调用了CreateProcessA ,并将hStdInput hStdOutput hStdError全部设置为外层创建的网络套接字

到这里我们可以知道了, 这个样本获取云端命令数据然后通过cmd进行执行, 可以说算是一个后门

5.样本行为

样本首先通过自校验文件名来干扰分析员的行为捕捉, 然后通过内存解密获取域名字符串, 通过访问域名获取命令内容, 通过cmd进行执行

6.总结

很多恶意样本为了干扰分析师的工作, 常将关键字符串进行内存解密

通过替换CreateProcess的输入输出流可以实现远程下发命令的实现

标签