静态分析诈欺术Windows x86下IDA Pro混淆技巧1

      静态分析诈欺术Windows x86下IDA Pro混淆技巧1无评论

  0x00 前言

  此文为我在台湾骇客年会2015社群场中以TDOHacker社群名义发表的「欺骗IDA Pro Hex Rays插件!让逆向分析者看见完全不同的结果 」这边把我在HITCON上发表的一些观念、技巧整理成简单入门的文章方便以后的人想学比较好入门,拓展了些有趣的观念。

  以前分析恶意软体、破解企业产品、找产品弱点??总是得动态分析追组合语言指令并且对系统架构、API有很深的概念才能深入分析出一支软体架构、功能、手法;但近日各式静态分析工具(大名鼎鼎如IDA Pro)掘起,使数位a识、软体破解、逆向工程??等的门槛降低许多(令许多破解者舒适的F5功能)

  但其实静态分析工具虽是依照真实程序内组合语言状况来做反组译「推论」出原本C语言状况下可能是如何开发的,那麽既然是透过「推论」来还原原始程式码状况,那必定静态分析工具会对一些组合语言排列状况的「特徵」或者「性质」来判定编译器编译特徵,例如说VC编译的圈会往下跳执行一段程式码然后回跳,中间插入一句判断句来离开向上跳的行为,这就是一种VC标准圈的特徵,当然还有更多种特徵,不一一举例。

  说其实这类手花诈欺静态工具已经是老伎俩了,这边为初心者入门提供了一些简易入门的手花技巧,如何简易的做到让IDA Pro这类静态反推原始码的工具不好做分析、程序开发者如何自行插入一些手花在程式码来扰乱这类静态工具(而非只是去花钱买一些Themida、VMP之类的壳来帮程序保护,我们也能自己做些小手段做扰乱分析者)最后目标是做到让破解者以静态工具去分析程序原始程式码和实质执行状况不同的一些小伎俩,欺骗那些只会用静态工具做分析的猴子们吧!

  附注:此篇所有手花伎俩都是建立于诈欺IDA Pro为基础上、并不保证对所有类型静态分析工具皆有效果而测试的IDA Pro版本号为6.6版本,编译环境为Visual C++ 2013(并且保留pdb完整资讯给IDA Pro做参考做分析)0x01 试探IDA Pro静态分析(逻辑顺序)

  0x01 试探IDA Pro静态分析(逻辑顺序)

  在一开始我们完全对IDA Pro静态分析的模式完全没有任何认识的情况下,我用VC写了一个简单的程序并透过逐步加一些手花来测试IDA Pro反组译后的反应如何,首先我写了一个大家都能看明白的Hello World程序:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  接著可想而知IDA Pro一定能准确的分析出原始编写状况:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  那么接著可以试著尝试做一些简易的改变,例如说简易的跳转但是Jmp太简单了,我试著改成push地址与return,看看IDA Pro反组译的反应如何

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  状况一如预期的直接无视了push+return的组合(就跟Jmp一样)反组译过程中IDA Pro直接将跳跃后的状况解析进来了,忽视掉跳转指令

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  好吧,没关系 那我们可以再试试看别的!例如说我们知道push会先在堆栈上申请一个DWORD的空间并且写入你要push的资料,意思是例如push 00可拆解为sub esp,04 + mov [esp], 00,于是我们可以把上述跳转的手法再改写:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  不过IDA Pro反组译起来的结果令人感到有些失望:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  不过到此我们可以得知的是:1. IDA Pro反组译会根据跳转顺序做一定的推敲 2.除了基础的跳转(jmp、Jl、Je…)也会对ret与堆迭上最后返回的地址做相当的推敲来根据顺序拼凑出原始编写程式码的状况;那如果我们在做些改变呢?例如往下跳转后在做记忆体的往上回跳,是否IDA Pro会误会是一个Loop来处理呢?于是把程式码改写一下:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  这时候会看到我们已经成功阻止IDA Pro做逻辑跳转的进阶解析了(至于为什么可以显示出Next01,编译时候的pdb资讯是有给IDA Pro参考的)如果点击Next01标`,IDA Pro是无法进阶跳转进去的(会被阻止进阶解析进入)看来IDA Pro认为这原本应该会是一个圈结构但是找不到判断句跳出所以就当作跳入不再出来了(这也是为什么反组译结果仅显示returun &Next01)

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  咦,不过就有人会想“既然不过就是诈欺IDA Pro误判为圈吗?那为什么不直接这么写就好?”于是撰写了以下程式码:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  不过很可惜的是IDA Pro遇到push+return的组合就直接作为Jmp处理了,所以这方面解析是完全没有问题的不会有任何误判的,到这边我们可以得到一些结论如下:

  IDA Pro对于Jmp的跳转是完全没有任何问题的(废话)IDA Pro可识别push+return的组合等价于Jmp指令IDA Pro对于纯暂存器搬移处理[ESP]在做条件/return返回的分析能力是很弱的

  逻辑跳转大致上用的手法如上介绍,当然不一定要把跳转写在函数内也可写在外部函数,如下:

  这边在入口做了一个简单的长程跳跃,而跳跃后的函数地址保存于全域变数中

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  而效果也是令人感到不eM意的,H@示一return Label

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  如果c袅_next()嘶`做解析,此rIDA Pro就嬷韵沦Y:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  仅告知它是全域变数,偏移地址为多少,至于这个手法虽然不能很有效的避免分析(可透过人工阅读组合语言程式码来做分析跳转位置)但在一些自动化的加壳、混淆工具上做保护,「逻辑混淆」便也是依此方式做大量的来回跳转来扰乱静态分析工具的追踪。

  0x02 举个栗子

  这种手法可以用在哪e?例如说有一个小型的CTF ― AIS3中有个Crypto考题这麽出的:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  图中可以看到在入口处(public start)可以看到从入口处有个红色箭头往底下指了下去,但是指下去后又跳回了loc_4000CF的位置上(灰色箭头返回处)而透过IDA Pro的反组译功能观察到的程式码如下:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  这边就用了这样一个很有趣的做法来增加Crypto考题的难度,避免参加CTF比赛者完全没有阅读组合语言的能力,仅透过反组译工具来静态阅读、分析,考出了「组合语言阅读能力」,到这个题目上可以看到它用的跳转是Jmp,由文章开头到此我们可以对IDA Pro的「函数结尾」判定解析有了一些了解:

  正常情况下,遇到ret视为函数结束若找查不到ret则以Jmp当作结尾Jmp在函数内来回跳可做解析Jmp往下跳则无法解析回C(但可点击至该地址)Jmp往下跳后又往上跳(往回跳)则无法做出明确反组译

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  接著讲到此,顺道提一下由知名资安厂商出的CTF ― Flare-On,解完第一题后通关会获得第二道题目,第二道题目中也不巧用了这个手法,所以就顺道写进来介绍了XD

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  首先我们可将此道题目透过IDA Pro分析,可看到此程序有三个函数,一个标准入口点还有两个自定函数,接著我们一一稍微检阅一下它们:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  首先看见Sub_401000,点击做进阶解析是无法做解析的,IDA Pro会提示该函数的堆栈空间坏掉了(也许是函数头、申请空间、对堆栈空间释放、使用…等状况)导致IDA Pro无法做精确的解析反组译回标准C的状态,好的 那麽先放著,看下一个。

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  接著看到sub_401084上,IDA Pro可很轻易的反组译推敲出原始状态,看这模样大概是KeyGen一部份吧,先放著不理它,来看看入口点怎么做。

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

  看到入口处可看见主要拆成红区、橘区、绿区三区,红区做了一个函数呼叫然后丢给橘区做运算处理接著绿区就用到了我们前面提到的逻辑顺序置换的手法,跳到入口的组合语言观察一下:

静态分析诈欺术Windows x86下IDA Pro混淆技巧1

发表评论