控制流平坦化流量分析

极客

别慌,这事儿真没你想的那么玄乎!

说真的,第一次听到“控制流平坦化流量分析”这个词的时候,我脑袋嗡了一下——这都什么跟什么啊?又是控制流,又是平坦化,还扯上流量分析,感觉像是在听天书,但后来我硬着头皮啃了一阵子,发现哎,其实也没那么吓人,今天就跟大伙儿唠唠这个东西,保证说人话,不整那些虚头巴脑的。

控制流平坦化流量分析

先说控制流平坦化吧,你可能写过代码,知道程序一般是怎么走的——if 走这边,else 走那边,for 循环转几圈,函数调来调去,整个执行路径像一棵树,枝枝杈杈的,但控制流平坦化干了件什么事儿呢?它把这棵树给“拍扁”了,所有的基本块被塞进一个大的 switch-case 结构里,由一个“调度器”决定下一步跳哪儿,你看着代码,表面上就是个大循环加一堆 case,真正的逻辑被藏得严严实实,第一次见这玩意儿的时候,我心想:好家伙,这是给代码穿了件迷彩服啊!

那为啥要搞这个?说白了,防逆向、防分析呗,恶意代码作者特别喜欢用这招,让你静态分析的时候看得头皮发麻,你想想,你打开 IDA,本来指望顺着流程图一路跟下去,结果迎面一个巨大的分发器,几百个 case 绕来绕去,谁看谁迷糊,我第一次遇到的时候,差点没把键盘掀了——这也太折磨人了吧!

咱们做流量分析的,不能光盯着静态代码看啊,这就引出了“流量分析”这个关键词,控制流平坦化流量分析,核心思路就是:你代码再怎么混淆,程序跑起来总得联网吧?总得发包收包吧?那咱们就从流量入手,看它到底在干嘛,这就像什么呢?就像一个人化了妆、戴了面具,你认不出他的脸,但他走路的姿势、说话的口音改不了啊!流量就是那个“口音”。

我在实际做控制流平坦化流量分析的时候,一般会这么干:先抓包,看看这个样本跟哪些 IP 通信,用的什么协议,请求长什么样,然后结合动态调试,把平坦化后的调度器跟流量行为对上号,比如说,某个 case 分支执行完之后,紧接着就发了一个 HTTP 请求,那这个分支大概率跟网络通信有关,一点点拼,一点点对,虽然费劲,但特别有成就感,有一次我熬夜分析一个样本,凌晨三点终于把它的 C2 通信逻辑理清楚了,当时那个激动啊,差点把室友吵醒,哈哈。

当然了,控制流平坦化流量分析也不是万能的,有些样本加了多层混淆,流量还加密,那就得更耐心地去剥,但我想说的是,别被“控制流平坦化”这几个字吓住,它本质上就是一种混淆手段,而流量是程序行为的“刚需”——你总不能不通信吧?所以从流量切入,往往能找到突破口。

最后唠叨一句:做控制流平坦化流量分析,工具要用好,但别迷信工具,IDA 的插件、动态调试器、抓包工具,都是帮手,真正靠的还是你的耐心和思路,遇到绕不出来的地方,出去溜达一圈,回来可能就有灵感了,行了,今天就聊到这儿,希望对正在啃这块硬骨头的你有帮助,有啥问题评论区见,咱们一起琢磨!

文章版权声明:除非注明,否则均为极客网安-咸鱼原创文章,转载或复制请以超链接形式并注明出处。

目录[+]