[系统安全] 十四.熊猫烧香病毒IDA和OD逆向分析--病毒释放过程(下)

举报
eastmount 发表于 2021/12/17 21:07:14 2021/12/17
【摘要】 本文将详细讲解熊猫烧香的行为机理,并通过软件对其功能行为进行分析,这将有助于我们学习逆向分析和反病毒工作。后续作者还将对其进行逆向调试,以及WannaCry勒索蠕虫、各种恶意样本及木马的分析。基础性文章,希望您喜欢!

系统安全系列是想更好地帮助初学者了解病毒逆向分析和系统安全,该专栏准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~

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

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

在这里插入图片描述

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

在这里插入图片描述


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

作者的github资源:

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


一.实验背景

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

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

  • 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”这个程序。

在这里插入图片描述


六.分析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隐藏文件

在这里插入图片描述

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

感恩能与大家在华为云遇见!
希望能与大家一起在华为云社区共同成长,原文地址:https://blog.csdn.net/Eastmount/article/details/111712482

(By:娜璋之家 Eastmount 2021-12-17 夜于贵阳)


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。