查看原文
其他

[系统安全] 十四.熊猫烧香病毒IDA和OD逆向分析(下)病毒配置

Eastmount 娜璋AI安全之家 2022-11-30

如果你想成为一名逆向分析或恶意代码检测工程师,或者对系统安全非常感兴趣,就必须要认真分析一些恶意样本。熊猫烧香病毒就是一款非常具有代表性的病毒,当年造成了非常大的影响,并且也有一定技术手段。本文主要学习姜晔老师视频,结合作者逆向经验进行总结,详细讲解了熊猫烧香的行为机理,并通过软件对其功能行为进行分析,这将有助于我们学习逆向分析和反病毒工作。后续作者还将对其进行逆向调试,以及WannaCry勒索蠕虫、各种恶意样本及木马的分析。基础性文章,希望您喜欢!

IDA和OD作为逆向分析的“倚天剑和“屠龙刀”,学好它们的基本用法至关重要。本文重点分析熊猫烧香病毒的功能函数,大家掌握这些技巧后才能更好地分析更多的代码。同时,本文部分实验参考姜晔老师的视频分析,真的非常佩服和值得去学习的一位老师。技术路上哪有享乐,为了提升安全能力,别抱怨,干就对了~

上一篇文章讲解了“熊猫烧香”病毒样本核心函数,我们利用OD和IDA工具结合调用函数的参数进行分析,它将有助于我们更好地理解病毒行为。这篇文件将继续分析sub_408024核心函数,分析每一个CALL函数,改为我们能够理解的名字,这往往也有助于对后续程序的理解。作者结合三篇文章绘制了一张分析图,希望加深大家对熊猫烧香的了解。这系列文章写得不容易,希望大家给点个赞和收藏,也欢迎评论和交流。

从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵!

接下来我将开启新的安全系列,叫“安全攻防进阶篇”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~

推荐前文:网络安全自学篇系列-100篇

https://blog.csdn.net/eastmount/category_9183790.html

话不多说,让我们开始新的征程吧!您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行,如果有写得不好或侵权的地方,可以联系我删除。基础性文章,希望对您有所帮助,作者目的是与安全人共同进步,加油~

文章目录:

  • 一.实验背景

  • 二.loc_408171位置分析

  • 三.sub_403F8C子函数

  • 四.sub_4060D4子函数

  • 五.CopyFile和WinExe子函数

  • 六.分析spoclsv.exe

  • 七.总结


作者的github资源:

  • 逆向分析:https://github.com/eastmountyxz/

    SystemSecurity-ReverseAnalysis

  • 网络安全:https://github.com/eastmountyxz/

    NetworkSecuritySelf-study


声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该样本不会分享给大家,分析工具会分享。(参考文献见后)


一.实验背景

对病毒进行逆向分析,可以彻底弄清楚病毒的行为,从而采取更有效的针对手段。为了节省篇幅,在这里我不打算将“熊猫烧香”进行彻底的分析,只会讲解一些比较重要的部分,大家只要掌握了这些思想,那么就可以处理很多的恶意程序了。

这里主要使用的工具包括:

  • PEiD:病毒加壳、脱壳基础性分析

  • IDA Pro:静态分析

  • OllyDbg:动态分析


实验文件:

  • setup.exe:熊猫烧香病毒


基本流程:

  • 利用查壳工具检查病毒是否带壳

  • 利用OD动态分析病毒

  • 利用IDA静态分析病毒


注意:由于OD工具会将程序运行起来,所以我们在进行恶意代码分析时尽量在搭建好的虚拟机中操作。如果病毒传播性较强如WannaCry,建议断开网络和断开共享分析。

实验思路:

  • 1.利用OD分析每一个CALL的功能

  • 2.使用IDA Pro在宏观上把握程序的功能并及时对函数进行重命名操作


上篇主要分析sub_408024核心函数:

  • 0x0040804D call sub_40277C

    – 重命名为:GetFilePathAndName
    – 功能:获取文件的完整路径及文件名称

  • 0x0040805E call sub_405684

    – 重命名为:GetFilePath
    – 功能:获取去除病毒文件名后的路径
    – IDA位置:0x0040805E
    – 技巧:循环将病毒的完整路径从后往前检索,直到遇到斜杠(\)、反斜杠(/)、冒号(:)结束,从而提取病毒的路径或病毒的文件名(如setup.exe)

  • 0x0040806E call sub_403ED4

    – 重命名:StringCat
    – 功能:拼接字符串,包含“Desktop_.ini”后缀

  • 0x00408079 call sub_4057A4

    – CheckFileExist
    – 功能:检测文件“Desktop_.ini”是否存在

  • 0x00408105 call sub_4040CC

    – CheckPathIsExist
    – 功能:检测文件的路径是否存在

  • 0x00408126 call sub_4078E0

    – WriteVirusInfoToMem
    – 功能:写入病毒信息到内存中,病毒作者企图利用暴力P解的方式,来攻破计算机中的某些验证机制

  • 0x0040812E call sub_403C44

    – SetZeroFlag
    – 功能:设置零标志位,将其设置为0

  • 0x00408136 call sub_403ECC

    – GetFileLen
    – 功能:获取PE文件的长度

  • CMP语句就是验证PE文件最后一个数据是否为零


二.loc_408171位置分析

这次我们会继续跟着姜晔老师分析,接着上一篇博客讲解。同时这次分析会和之前有一些不一样的情况。

如果我们按照流程顺序一步步往下分析,确实能够弄清楚病毒的行为,但某些分支中的重要代码是执行不到的,所以我们需要采取一些策略,走完每个分支,彻底分析出病毒的行为。这也是逆向分析中非常重要的方法。

第一步,我们打开IDA Pro和OD载入病毒样本。
现在程序执行到了loc_408171位置处,我们让OD也跳转到对应的位置。

右键转到->表达式,输入408171。

按下F2增加断点,再按F9直接执行过来。

思考:OD重新打开断点为什么还保留着?
在OllyDbg中,它会把所有与程序后模块相关的信息保存在单独的文件中,以便在模块重新加载时继续使用。这些信息包括标签、注释、断点、监视、分析数据、条件等。


第二步,在OD中分析0x00408171位置。
首先是一个CMP比较操作(Compare),接着查看EBP-0x8的内容。

  • 0x00408171 cmp dword ptr ss:[ebp-0x8], 0x0


我们可以看到它的内容是0,它的比较对象也是0。


第三步,分析JNZ跳转指令。
接着按下F8,可以看到比较后,ZF变成了1。由于二者都为0,所以在比较过后ZF=1,那么接下来的跳转并不执行,继续执行下面的内容。

  • JNZ 0x004082F0

  • JNZ(jump if not zero)结果不为零则转移,即z=1时跳转,但是z=1时,zf=0。故JNZ跳转的条件也是零标志位zf=0,由于指令执行的结果为0,此时的ZF值为1,故不执行跳转


CF(进位标志)=1:算术操作最高位产生了进位或借位,=0 最高位无进位或借位 ;
PF(奇偶标志)=1:数据最低8位中1的个数为偶数, =0 数据最低8位中1的个数为奇数;
AF(辅助进位标志)=1:D3→D4位产生了进位或借位, =0 D3→D4位无进位或借位;
ZF(零标志)=1:操作结果为0, =0 结果不为0;
SF(符号标志)=1:结果最高位为1,=0 结果最高位为0;
OF(溢出标志)=1:此次运算发生了溢出, =0 无溢出。


第四步,分析函数sub_40532C。
在IDA中继续查看代码内容。

首先上一篇博客已经分析并重命名了sub_40277C函数的功能,它是获取文件路径和名称(GetFilePathAndName)。

  • C:\Users\14551\Desktop\setup.exe


接下来将EDP-0x3D4赋值给EDX,F8执行并在数据窗口中跟随,发现它此时还是空值。

按F8执行到sub_40532C函数,在IDA中我们双击进去,查看该函数。发现该函数的主要功能是API函数CharUpperBuffA。

  • CharUpperBuffA函数作用:把缓冲区中指定数目的字符转换成大写字

总结,重命名及对应功能如下:

  • sub_40532C -> CharToUpper

  • 功能:缓冲区中指定数目的字符转换成大写字母


PS:IDA中按ESC键返回上一层再重命名。


第五步,分析函数sub_4054BC。
在IDA中双击查看该函数的内容。可以发现它主要是调用了GetSystemDirectory函数,从而获取系统的路径。

总结,重命名及对应功能如下:

  • sub_4054BC -> GetSystemDir

  • 功能:获取系统路径



三.sub_403F8C子函数

由于之前直接调用系统API函数,其功能分析还是很直观的。接下来我们继续分析函数sub_403F8C。

第一步,我们让OD跳转到0x004081AB的位置。
直接按F8执行下来,在这里可以看到PUSH是将刚才利用GetSystemDirectory函数所获取的系统路径字符串进行压栈。

压栈内容为system32这个目录。

  • C:\Windows\system32



第二步,按下F8继续分析,发现它又将drivers压栈,将spoclsv.exe字符串压榨。

  • drivers

  • spoclsv.exe


注意,上图仅显示了setup.00408658,没有将具体的值显示出来。

思考:OD如何查看堆栈中的值?
选中ESP堆栈指针寄存器(主要用于存放堆栈内存储单元的偏移量),在“堆栈窗口中跟随”。然后依次选择值“0x00408644”和“0x00408658”,右键在“数据窗口中跟随”,即可查看堆栈中的值。



发现对应的值为“drivers”和“spoclsv.exe”,如下图所示。


写到这里,我们可以推测:下面这个函数的功能是将压入堆栈的字符串进行拼接,成为一个新的路径。


第三步,按下F8执行到这个Call函数进行分析。
按下F8执行过来后,选中EAX在数据窗口中跟随。

  • EAX是累加器(accumulator),它是很多加法乘法指令的缺省寄存器。

  • EBX是基地址(base)寄存器, 在内存寻址时存放基地址。

  • ECX是计数器(counter),是重复(REP)前缀指令和LOOP指令的内定计数器。

  • EDX则总是被用来放整数除法产生的余数。


在数据窗口中右键“转到”->“表达式”,然后输入值:

  • 020F7E08


接着在CALL函数处按下F8,我们需要关注数据窗口中的前后变化情况。我们可以看到它新生成了一个路径字符串。

  • C:\Windows\system32\drivers\spoclsv.exe


前后对比如下图所示:

总结,重命名及对应功能如下:

  • sub_403F8C -> TwoStringCat

  • 功能:将两个字符串进行连接



四.sub_4060D4子函数

事实上,这段程序的功能如下:

  • 首先通过这个函数将字符串连接;

  • 再将路径字符串转换为大写字母;

  • 然后将这个字符串与这里进行对比。


第一步,我们通过OD来分析下比较功能,在OD中执行到4081E3位置,然后按F9执行过去。

  • 0x004081E3 call sub_404018



第二步,分析sub_404018函数。
我们在这里看下它比对的是什么字符串,在数据窗口中跟随值,可以看到两个字符串分别是拼接的字符串和当前OD分析程序的字符串。

  • C:\USERS\14551\DESKTOP\SETUP.EXE

  • C:\WINDOWS\SYSTEM32\DRIVERS\SPOCLSV.EXE


很明显,我们分析的熊猫烧香病毒程序在桌面上,而比对的是DRIVERS路径下。

sub_404018函数的目的是分析当前这个程序是不是drivers目录下的这个程序,如果是的话执行一段代码,否则执行另一段代码。

因为目前不是在drivers路径下,因此它执行另一段代码,我们按下F8继续执行。JE跳转不成立,继续出现一个新的CALL。

  • 0x004081F3 CALL setup.004060D4


第三步,sub_4060D4函数的参数分析。
该函数存在一个参数存在EAX中,通过数据窗口跟随发现值为:

  • spoclsv.exe


我们回到IDA查看该函数的基本组成,双击进入sub_4060D4函数。可以看到这个函数非常长,并且内部包括很多CALL函数,如果说一个个CALL分析,会发现它调用了很多的API函数。通过分析归纳该函数的作用如下:

  • 查找当前内存中指定的进程,即查找当前是否有spoclsv.exe这个进程


总结,重命名及对应功能如下:

  • sub_4060D4 -> SearchAndTerminateProcess

  • 功能:查找当前内存中的指定进程,若存在,则将其终止


读者可以下来详细分析下该函数的细节,这里仅补充一张图片。


五.CopyFile和WinExe子函数

下面很长一段代码因为之前已经分析过,并且有很多的注释,这里就不再赘述。

在CopyFile函数位置我们停下来分析。

  • 0x004082A6 call CopyFileA


第一步,我们将OD跳转到文件名0x0040828C的位置,按下F2增加断点。

  • 0x0040828C push eax


程序执行过来后,在这里我们跟踪下这个EAX地址。这里可以看到想要拷贝的地址就是刚才我们所连接成的字符串地址。

  • C:\Windows\system32\drivers\spoclsv.exe


那么,它所拷贝的内容是什么呢?


第二步,继续分析拷贝文件的内容。
按下F8执行到0x004082A5位置,可以看到它是将当前这个病毒文件复制到drivers目录下,通过CopyFile来实现。

事实上,它是将我们的当前文件改为spoclsv.exe之后,再复制到drivers目录中。


第三步,我们继续往下分析,看到一个WinExec函数。

通过OD来到4082E3位置,我们看看这个参数来判断它想执行什么程序。

第四步,按下F2增加断点,然后F9执行过来,并在数据窗口中跟随EAX值。
可以看到,它实际想执行的就是这个spoclsv.exe程序。也就是说,它在把当前这个病毒样本复制到drivers目录之后,那么这句代码就是将它执行起来。再往下ExitProcess是结束当前正在运行的进程,即熊猫烧香的病毒样本。

注意,当病毒本体将自身复制到“drivers”中并改名后,这里就是对改了名字的病毒程序执行运行的操作,然后主体程序就退出了。如果想继续用OD进行动态分析,要么载入“spoclsv.exe”,要么对之前的一处条件跳转进行修改,令程序以为自己就是“spoclsv.exe”。


第五步,回到跳转位置0x004081E8,对其进行分析。

在OD中跳转到该位置,然后按下F2下一个断点,并执行到断点处。

  • 0x004081E8 JE 004082F0


正常来说,由于我们当前所分析的程序并不是drivers目录下的那个病毒样本,因此这个跳转是不成立的。这里为了使其成立,可以将JZ修改为JNZ,但是这改变了病毒程序。最好的办法是改变ZF标志位,将原来的0改为1就可以了


第六步,双击ZF标志位,它会变成1。
双击后可以看到提示“跳转已实现”,现在这个病毒就以为自己是spoclsv.exe。

第七步,按下F8执行到4082F0位置。

前面我们已经分析过,真正实现病毒功能的也就是“spoclsv.exe”这个程序。

  • [系统安全] 八.那些年的熊猫烧香及PE病毒行为机理分析



六.分析spoclsv.exe

虽说这个程序和“熊猫烧香.exe”是完全一样的,可是毕竟其内部的执行流程是不同的。为了得到病毒完整的资料,这里我利用OD载入“spoclsv.exe”进行动态分析。

第一步,接着上面的步骤,OD和IDA都跳转到4082F0位置。

第二步,可以看到这里出现了sub_40416C函数,我们在IDA中双击进入查看。

由于sub_40416C这个函数也比较抽象,不太容易分析,这需要耐心与细致,在此将过程省略。总结其功能如下:

  • sub_40416C -> DeleteStringBuff

  • 功能:删除字符串中的一些信息,其中EAX保存的是想要操作字符串的地址,ECX保存的是想要删除的字符的个数,可以看到已经通过GetFileLen获取了字符的个数。


接着就将sub_40416C重命名为:DeleteStringBuff,然后程序跳转到loc_4085D3。


第三步,让IDA和OD跳转到4085D3位置。

OD跳转后按F2增加断点,再按F9执行过来。


第四步,分析call sub_4041B4前的参数。
按下F8执行到sub_4041B4函数调用出,我们查看EAX中保存的内容,在数据窗口中跟随。

可以看到这里的EAX保存的是一个标记数值,即为0x01。之后的CALL就是查找文件中是否包含有这个标记,如果包含有这个标记,那么就执行跳转,否则不跳转。

由此我们可以假设,这个0x01标记应该就是病毒将这个正常的PE程序感染后,在原本正常的程序中添加的01标记,用于标识该程序是否被感染。如果真是这样的话,若想分析跳转后的程序内容,要么在OD中修改标志位,要么对一个被感染的程序进行分析。这里我不再赘述,有兴趣的读者可以拿一个被感染的程序自行分析。

总结,重命名及对应功能如下:

  • sub_4041B4 -> SearchSignPos

  • 功能:查找标记的位置



我们再回到OD, 由于我现在分析的是病毒程序,他自身没有0x01标志位,因此跳转不成立,它就继续往下执行。

我们可以看到,这部分代码主要用于收尾工作,最后的CALL用于删除堆栈中所保存的地址,这些地址指向的是病毒写入的一些信息,继续按F8执行。

可以看到一个RETN,我们继续执行。发现熊猫烧香三个核心函数,其中sub_408024就执行完毕了。

  • sub_408024

  • sub_40CA5C

  • sub_40C97C


sub_408024是熊猫烧香病毒三大功能的第一项功能,分析至此,可见这第一项功能主要用于病毒的初始化工作。余下的两大功能我在此就不进行分析,有兴趣的读者可以独立研究试试看。


七.总结

写到这里,关于sub_408024核心函数的部分功能就介绍完毕,它主要完成熊猫烧香的基础功能。请大家一定要动手跟着调试,感受下这部分的实验。同时作者是跟着姜晔老师的视频,一步步逆向分析熊猫烧香病毒的,后续还有WannaCry蠕虫等恶意样本的分析。这些分析技术是病毒分析和逆向分析的基础,相信大家只有掌握这些基本方法,才能更好地深入这个领域。

如果你是一名新人,一定要踏踏实实亲自动手去完成这些基础的逆向分析,相信会让你逐步提升,过程确实很痛苦,但做什么事又不辛苦呢?加油!希望你能成长为一名厉害的系统安全工程师或病毒分析师,到时候记得回到这篇文章的起点,告诉你的好友。

最后再给出这张图,希望加深大家对熊猫烧香的了解。这系列文章写得不容易,您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行,如果有写得不好或侵权的地方,可以联系我删除。基础性文章,希望对您有所帮助,作者目的是与安全人共同进步,加油~

setup.exe的熊猫烧香病毒程序,并衍生出一个spoclsv.exe程序。位置信息为:

  • C:\WINDOWS\system32\drivers\spoclsv.exe


它的后续功能如下,你可以试着继续分析。

  • 第1点行为:创建spoclsv.exe程序并位于WINDOWS\system32\drivers目录

  • 第2点行为:命令行模式下使用net share解除共享功

  • 第3点行为:删除安全类软件在注册表中自动启项

  • 第4点行为:在注册表CurrentVersion\Run创建svcshare自启动项,每次开机时会自动运行病毒

  • 第5点行为:禁用文件夹隐藏选项,修改注册表使得隐藏文件无法通过普通设置显示,从而隐藏病毒自身

  • 第6点行为:将自身拷贝到根目录并命名为setup.exe,创建autorun.inf用于病毒的启动,这两个文件的属性都是“隐藏”。同时,会创建Desktop_.ini隐藏文件


学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全和系统安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。编程没有捷径,逆向也没有捷径,它们都是搬砖活,少琢磨技巧,干就对了。什么时候你把攻击对手按在地上摩擦,你就赢了,也会慢慢形成了自己的安全经验和技巧。加油吧,少年希望这个路线对你有所帮助,共勉。

前文回顾(下面的超链接可以点击喔):




2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。2021年继续加油!

(By:Eastmount 2021-01-08 周六夜于武汉)


参考文献:

姜晔老师真的非常佩服和值得去学习,希望自己和大家的技术能不断提升,加油!

  • [1] [网络安全自学篇] 木马原理详解、远程服务器IPC $漏洞及木马植入实验

  • [2] 姜晔老师的技术空间目录 - CSDN

  • [3] 腾讯安全联合实验室 - 知乎文章

  • [4] [网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解

  • [5] 姜晔老师技术分享 - B站

  • [6] [网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存