本文为看雪论坛优秀文章
看雪论坛作者ID:SSH山水画
这是一篇针对初学小白的文章, 楼主也刚刚进入安全行业实习,本篇文章主要记录分析过程,思想方法,如有不对不足,欢迎指出。
样本hash:
3c8ba5a38cd1e4048c969464ab86591d9b08cba9
GetProcAddress
ReadFile
CreateFileW0040301C LoadLibraryA KERNEL32
00403020 GetProcAddress KERNEL32
00403034 ReadFile KERNEL32能作为突破点的API很少,先试着从LoadLibraryA入手。
发现样本使用了CreateFileW,推测有释放文件的操作。虚拟机打开OD,定位到调用CreateFileW处,在00401FF8 下段,看看样本创建了什么文件。观察堆栈 发现样本创建了自身,放行,样本直接结束。转为在CreateFileW函数头部下断,重新运行样本,观察堆栈。发现断下多次,我们将每一次的堆栈信息都截图下来,并且将文件备份一份:
根据以上可以推测出样本创建了第二个自身,结束第一个自身,然后释放文件
为了验证,打开火绒剑捕捉行为:
因为他释放完紧接着删除了,很不正常,我们是用火绒的拦截功能,拦截样本的删除动作,捕获被释放的文件:可以看到样本在试图删除tmp,我们点击阻止,然后分析这个tmp:可以发现tmp是0字节,是哪里出了问题,这是样本的障眼法?或者是他的写入代码没有被执行。到这里好像所有步骤都白费了,抓到的释放行为,结果是释放了一个空文件。那么他的真正功能在哪里呢,既然没被释放到磁盘,那就有可能直接在内存开辟了缓冲区去执行。接下来试着验证这条猜想,打开OD,在VirtualAlloc处下断。果然断下来了,跟出函数,看看他申请这块内存要干什么。这就是申请好的内存地址,右键数据窗口中跟随,下内存写入断点,放行。
和本体一模一样的数据,这可能就是火绒剑行为中的创建自身进程用到的数据。竟然又在alloc处断下,本来以为程序差不多结束了,没想到有意外收获。再次放行,又在alloc断下,同样方法,再次来一遍。这次你会发现,硬断触发的代码,有个循环用来向开辟的内存中赋值。跳出这段循环,被填充的代码是没见过的,但是当你F8下去的时候,会发现下面还有个循环,跳出这个循环,再次F8下去,会有一个大循环:
当这个大循环全部执行完毕时,内存中的数据变得清晰了起来 如下图:
同样是PE结构,但是这次还做了加密解密,必然有问题。正如我们猜测的,这个PE文件开始发生了变化,先将其存好。
由此看来,整个程序的真正作用就是释放第三次alloc处的代码,也就是上面那幅图。接下来的步骤我们将针对这第三个文件,我们取名为new。又是释放TMP……打开火绒,拦截删除动作,发现TMP还是空的。那就不管它,new和原版一个明显的区别就是,new没有退出,而原版直接退出了,所以原版看起来啥也没干。捕捉到了connect,自身文件属性也变为了隐藏。
数据很少,既然有了connect动作,不应该只有这么点东西。既然这样,就把壳脱掉,使用ESP定律脱掉壳子,定律可以自行百度,资料很多。内存运行代码
隐藏自身
无窗口
静默发送connect链接
遍历IP地址
敏感字符串可以推测为一个后门病毒,并可能带有扫描IP爆破的功能。PS:楼主为个人自学逆向,所以没有接受过专业的培训,可能逆向思维,实践思路有些奇葩,各位谅解。此文章希望可以帮助自学的小白建立一些逆向思维。
看雪ID:SSH山水画
https://bbs.pediy.com/user-home-867232.htm
*本文由看雪论坛 SSH山水画 原创,转载请注明来自看雪社区。