这是[信安成长计划]的第 6 篇文章

关注微信公众号[信安成长计划]

0x00 目录

0x01 C2Profile 分析

0x02 set userwx "true"

0x03 set userwx "false"

CobaltStrike 提供了一个内存混淆功能,它会在 Sleep 的时候将自身混淆从而避免一定的检测

0x01 C2Profile 分析

因为 sleep_mask 是从 C2Profile 中设置的,所以就需要先搞清楚 TeamServer 是如何解析的

很明显它还跟其他的设置项有关,这里我们重点关注一下 rwx 的设置

首先会将 text 段的结尾地址存储到 index=41 的位置

接着判断了 text 段与 rdata 段中间的空白位置够不够 256 个字节,推测会将加解密函数放在这里

obfuscate 就让它默认为 false,它不是我们这次关注的重点,接下来就会将 0 和 4096 添加到其中

再看一眼 text 段的 Virtual Address,这块很明显就是 PE 头的那段内容

接下来就是循环添加内容了,可以很明显的看到 do while 的循环条件是 text 段且不允许使用 rwx,这也就意味着,当我们不允许使用 rwx 的时候,text 段并不会被添加到 index=42 的项中,应该也就不会被混淆了,在最后还添加了零,用于标示结尾

0x02 set userwx "true"

为了快速定位到加解密函数所在,可以设置断点来完成,因为按照之前的分析,使用 rwx 的时候,text 段也会被混淆的,所以跟入函数以后,直接滑倒开头下写入断点即可

接着直接放过也就到达了位置

接着根据这个位置到 IDA 中进行查找,然后通过回溯也很容易能够找到整个的调用链

在主循环的最后有一个用于处理 Sleep 的函数

它通过判断 0x29 来决定是否直接调用 Sleep,如果使用了 sleep_mask,0x29 中存储的就是 text 段的结尾地址

首先它会将自己当前函数与加解密函数一起传入

在函数中先计算了两个函数地址的差值,通过对比很明显能够看出这个就是加解密函数的长度

接着从 0x29 中取出 text 段的结尾地址,并从全局变量中取出 PE 头的位置,相加也就得到了在内存中的 text 的结尾地址,也就是后面要存放加解密函数的地址,接着传统的拷贝也就不提了,重点是后面的赋值操作

申请了 0x20 的空间,也就是 32 个字节,8 个字节存储 PE 头地址,8 个字节存储 0x2A 的地址

这个 0x2A 也就是之前构造的那一串结构

然后将加 16 的位置传入

第一个使用 CryptoAPI 生成密钥

如果失败的话,用第二个自己实现的算法生成密钥

最后就来调用加解密函数了,第一个是构造的结构,第二个是 Sleep 函数,第三个是时间

接着就来分析加解密函数,根据中间 Sleep 调用可以推断出,上面是加密函数,下面是解密函数

参数是指针类型,取数组,下标 1,也就是 0x2A 所取到的值了

然后 v6 就是第一个值 sectionAddress,v7 就是第二个值 sectionEnd,然后将 v3 再后移

用来判断跳出规则的就是最后添加的两个零

do while 的混淆条件就是 sectionAddress<sectionEnd,也就是将所有的代码都进行混淆

之后的解密也是一样的逻辑就不提了

接下来就是验证的时候了

Sleep 时候的状态

此时的代码段

接收命令时候的状态

此时的代码段

在允许 RWX 权限的时候,代码段是混淆的

0x03 set userwx "false"

理论在之前也都讲完了,这里就是验证一下最终的效果

Sleep 时候的状态

此时的代码段

接收命令时的状态

此时的代码段

在禁止 RWX 权限的时候,代码段是不混淆的

CobaltStrike逆向学习系列(6):Beacon sleep_mask 分析的更多相关文章

  1. CobaltStrike逆向学习系列(3):Beacon C2Profile 解析

    这是[信安成长计划]的第 3 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller 端分析 0x02 Beacon 端分析 0x03 展示图 在上一篇文章中完成了 S ...

  2. CobaltStrike逆向学习系列(2):Stageless Beacon 生成流程分析

    这是[信安成长计划]的第 2 篇文章 关注微信公众号 [信安成长计划] 0x00 目录 0x01 Patch Beacon 0x02 Patch Loader 0x03 文件对比 0x04 流程图 C ...

  3. CobaltStrike逆向学习系列(8):Beacon 结果回传流程分析

    这是[信安成长计划]的第 8 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 接收与处理 0x02 结果回传 Beacon 在接受完命令并执行后,会将数据加密回传给 T ...

  4. CobaltStrike逆向学习系列(4):Beacon 上线协议分析

    这是[信安成长计划]的第 4 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Beacon 发送 0x02 TeamServer 处理 0x03 流程图 0x04 参考文章 在上一篇 ...

  5. CobaltStrike逆向学习系列(11):自实现 Beacon 检测工具

    这是[信安成长计划]的第 11 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 检测原理 0x02 检测方案 0x03 存在的问题 0x04 解决方案 0x05 示例代码 0x06 ...

  6. CobaltStrike逆向学习系列(1):CS 登陆通信流程分析

    这是[信安成长计划]的第 1 篇文章 关注微信公众号[信安成长计划][SecSource] 0x00 目录 0x01 密码校验 0x02 aggressor.authenticate 0x03 agg ...

  7. CobaltStrike逆向学习系列(12):RDI 任务发布流程分析

    这是[信安成长计划]的第 12 篇文章 0x00 目录 0x01 任务构建 0x02 结果处理 0x03 功能 DLL 分析 之前的分析都是针对整个 CS 的框架来进行的,但是功能也是整个 C2 中相 ...

  8. CobaltStrike逆向学习系列(10):TeamServer 启动流程分析

    这是[信安成长计划]的第 10 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 基本校验与解析 0x02 初始化 0x03 启动 Listeners 在之前的分析中,都是针对 Cob ...

  9. CobaltStrike逆向学习系列(13):RDI 任务执行流程分析

    这是[信安成长计划]的第 13 篇文章 0x00 目录 0x01 任务号 0x02 功能执行 0x03 结果接收 在上一篇文章中已经讲明了 RDI 类型的任务在发布时候的流程,接下来就是执行了,文中不 ...

随机推荐

  1. 【Android】安卓四大组件之Activity(二)

    [Android]安卓四大组件之Activity(二) 前言 在这篇文章之前,我已经写过了一篇有关Activity的内容,是关于activity之间的页面跳转和数据传递,而这篇文章着重强调的是Acti ...

  2. Elasticsearch使用系列-ES简介和环境搭建

    一.简介 Elasticsearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java语言开发的,并 ...

  3. golang中的udp编程

    1. udp server package main import ( "fmt" "net" ) func main() { // udp server li ...

  4. Go 面向对象三大特性

    #### Go 中面向对象的三大特性上周因为有一些事情,停更了; 停更的这段时间,花了点时间做了一个小项目(https://github.com/yioMe/node_wx_alipay_person ...

  5. pycharm下载安装教程

    简介: 首先,PyCharm操作简便,拥有一般IDE具备强大的功能,既适合新手,也可以满足开发人员的专业开发需求,接下来介绍一下如何下载和安装pycharm. ### 一:Pycharm下载 1.首先 ...

  6. linux中awk命令(最全面秒懂)

    目录 一:linux中awk命令 1.awk命令简介 2.awk作用 3.awk的语法格式 4.解析awk使用方法 5.参数 6.awk的生命周期 二:awk中的预定义变量 三:awk运行处理规则的执 ...

  7. uni微信小程序优化,打包后的import vue路径是可删除的

    这次的优化我公司项目主包只减小了32kb,但是减小的不仅仅是主包,所有分包均在没有改动任何业务代码的情况下完成了压缩空间的优化. 主包分包压缩空间的优化都要视项目而定,32kb只是我公司的小程序项目. ...

  8. Lesson1——NumPy NumPy 安装

    NumPy 教程目录 NumPy 安装 Python 官网上的发行版是不包含 NumPy 模块的.(pip list 测试一下) 我们可以使用以下几种方法来安装. 1 使用已有的发行版本 对于许多用户 ...

  9. java中使用反射获取pojo(实体)类的所有字段值

    出处:https://developer.aliyun.com/article/239346 说起反射,不得不说它实在是太强大了,通过反射就可以轻轻松松拿到各种东东,如果你想在项目中解除对某个类的依赖 ...

  10. foreEach 跳出循环

    const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; const _ = require('lodash'); let outArr = []; try { arr. ...