GalaXY403 发表于 2022-3-21 11:12

Cobalt Strike剖析及免杀系列(一)cs原始壳分析

今儿砸门就随便搞点cs的artifact马的壳逆向玩玩吧
首先打开cs生成一个原始exe马

生成完马在虚拟机里od打开做下动态分析

中途win10的吾爱破解机子更新坏了我又重新配了个win7的破解机子,不过无伤大雅。
打开文件进入入口点

打开文件后先不要着急分析,首先看下这个pe文件的整体结构和各地址段位置,对于病毒木马的逆向分析着重关注exe的输入表信息,还有异常段信息,还有数据段位置。

首先看到位置信息知道代码没做重定向处理,一般exe的位置都会在00400000加载,如果加载位置不是这个,那么看pe头中对应的加载基址
基址的位置在pe头的image_option_header中的imagebase

可以看图中信息也可以在pe文件中按偏移一点一点找,也可以使用windbg的内存查看指令看,不做过多的解释了。
继续这个重定向话题往下聊,如果看到基址偏移与文件的pe头信息不匹配那么病毒木马就一定会修改重定位表信息,所以需要提前打个预防针,如果看到基址信息不是平常熟悉的00400000就得注意重定位段reloc中的基址偏移信息,并且自己在写马的时候也需要注意一些pe文件上的细节,在编译完成后重新修改pe机器码的前提下,如果重定向的话没有修改重定向表可能也会导致之前被编译的pe文件运行失败,这也是维护程序的健壮性的一些细节,希望能注意。
从大局往里面看,再看有没有异常的段,就是些自定义的段,并且看下有没有使用rwx三种权限或者rx权限,反正着重看下有没有执行权限,不过基本一些比较好的壳不太会把马的位置这么快就暴露。

就是看下访问这里,并且在动态是也着重关注每一步执行的访问权限变化。
然后再看每个段信息,包括地址与段含义,着重输入表。
再就是一些dll,和调用函数信息,静态文件就可以查看,使用ida也可以看比较清晰的结构,不过可能不是真正的所有调用函数,看经验的判断吧


导入表的int信息也是在pe头查看,看静态的调用信息主要还是给自己打个预防针,看下pe文件的总体结构,像cs的原生exe马中connectnamedpipe等一些函数都暴露了出来,还是挺容易被看出来的

这些命名管道的通信在cs源码中也会体现,这篇文章中也是单独对exe马进行分析利弊,所以源码也是提一嘴

关于cs源码这里不做过多赘述

关于逆向我们大可不必直接对着汇编看,我的习惯是先在ida里反编译一下,了解下整个文件的逻辑结构,然后再进入到od汇编调试,而且这种exe马绝大多数的shellcode做了加密,需要动态中解密。
了解了文件的整体属性后,我们进入ida进入反编译(新款的ida7.7免费版仅带有64位反编译,今天我们使用的是32位)
首先进入到ida找到main函数的位置

入口点做一些c运行库初始化操作,这里不再赘述

找到main函数位置后在od中对main函数做断点处理,od中初始断点不一定停在入口点和main函数中
像这个exe马是直接停在了tls回调函数中

至于什么函数的判断在ida反编译中查看

直接进入main函数中

对于软件的逆向分析我比较喜欢先使用ida做下逻辑梳理,然后需要啥动态信息就到od中去打断点、找位置、看信息。
首先看到main函数中第一个执行函数

首先前两个for循环做了一个执行函数指针的操作
进入函数指针的位置

查看sub40210发现是一个dll的一段操作,先放下不看进入到第二个函数中

继续跟进

发现了dllonexit和onexit等系统api,对于进程退出注册函数,可以判断再main函数中的第一个函数还是做了对进程各个属性的更新操作
接下来返回到main函数,再次进入到第二个函数

首先一个获取执行时间的gettickcount可以不用管,后面往全局变量buffer中输入标识,这个用作与cs服务端通信使用,先不用管
看到一个线程函数,还有下面一个函数,再次进入线程函数

发现了一个全局变量地址和一个size,我们可以先查看全局变量内容,也可以直接进入函数中先看下,我这边是直接进入到数据段查看内容

往下还有很长的一段数据没有截图,可以看到一段非常长的8位数据数组,这个可以做下初步推断为shellcode,也就是壳里封装的马,但是不确定,先返回到函数中跟进。

可以看到是一段命名管道操作,往里面写入shellcode,因为线程的缘故所以推断下面会有一个函数接收管道中的数据,还是先返回看线程函数后面的一个函数内容


一段sleep函数可以确定这个函数与线程函数是对应的输入输出操作
进入while的第一个函数

可以看到是往函数的第一个参数读取管道操作

经过前面看,这个第一个参数是申请的一段内存空间
接下来进入while后面的第二个函数

典型的解密操作,这下就可以正式判断前面往命名管道中写入的就是加密后的shellcode,然后再主线程中读取并解密后又来一个线程执行startaddress。
总体文件逻辑看完这边直接步入调试,我们的目的是为了找到解密完的数据,可以直接在解密函数执行完设断点,这里为了方便我直接把文件执行完,然后进入到动态申请的内存地址查看
首先先找到申请的地址空间位置

找到v3这个变量的内容

找到4015b5位置,并找到v3
这段virtualalloc就是申请的位置,然后返回在eax寄存器中的内容就是动态申请到的内存地址,我们到od中在4015b5打下断点

可以看到返回在eax中的位置为00020000
继续执行完整个进程做完解密操作,再在反汇编窗口跳转到shellcode位置

这下可以看到完整的shellcode了

这里是cs生成的payload可以查看与od中的重合了,这就是对于这种比较简单的payload壳整个解密过程。
这里对于stager的分析就下次再进行分享吧,今天就先分析原生的cs exe马。

蓝纹鲸 发表于 2022-4-12 23:39

GalaXY403 发表于 2022-3-21 14:40
是,但是基本刚出破解的就来了。

在哪里找破解的,github还是哪里呀?

暮光之城 发表于 2022-3-21 12:47

cs是不是收费的

ren619818859 发表于 2022-3-21 13:38

win10破解机还有吗

GalaXY403 发表于 2022-3-21 14:40

暮光之城 发表于 2022-3-21 12:47
cs是不是收费的

是,但是基本刚出破解的就来了。

GalaXY403 发表于 2022-3-21 14:42

ren619818859 发表于 2022-3-21 13:38
win10破解机还有吗

被我删了哈哈哈

求知者 发表于 2022-3-22 17:40

大佬6666

GalaXY403 发表于 2022-3-22 17:55

这个只是cs原始马的壳部分,后面动态解码出来的payload在系列(三)里,需要的可以继续看下

GalaXY403 发表于 2022-4-13 10:48

蓝纹鲸 发表于 2022-4-12 23:39
在哪里找破解的,github还是哪里呀?

朋友互发资源

w759003376 发表于 2022-4-13 21:13

尽管是个小白,但是个人觉得,还是写的挺好的
页: [1] 2
查看完整版本: Cobalt Strike剖析及免杀系列(一)cs原始壳分析