目录

安全攻防进阶篇-九.熊猫烧香病毒机理IDA和OD逆向分析上

[安全攻防进阶篇] 九.熊猫烧香病毒机理IDA和OD逆向分析(上)

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

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

https://i-blog.csdnimg.cn/blog_migrate/5e22d3c8219b766b711eb3021c8fc3d6.png#pic_center

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

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

  • 推荐前文:

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

文章目录


一.实验背景

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

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

  • PEiD:病毒加壳、脱壳基础性分析
  • IDA Pro:静态分析
  • OllyDbg:动态分析

实验文件:

  • setup.exe:熊猫烧香病毒

基本流程:

  • 利用查壳工具检查病毒是否带壳
  • 利用OD动态分析病毒
  • 利用IDA静态分析病毒

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

https://i-blog.csdnimg.cn/blog_migrate/c0bf30826b957f5ccbb7c72ef2a85010.png#pic_center


二.PEiD加壳检查

我们在分析病毒之前,首先需要调用工具检查是否带壳,如果病毒还需要先进行脱壳操作。这次研究的“熊猫烧香”程序并没有加壳,但后续的文章我会详细分享加壳与脱壳的内容,更好地帮助大家理解病毒分析及保护措施。

首先打开PEiD工具人,然后将熊猫烧香病毒拖进去,会发现病毒的基本信息。

https://i-blog.csdnimg.cn/blog_migrate/43bebfc8cb108c50886134fe673cbcc3.png#pic_center

分析信息如下:

  • 该程序并没有加壳,采用Delphi Borland Delphi 6.0-7.0编写

注意,这里补充姜老师对Delphi编写代码和VC++编写代码的理解。

  • 区别:Delphi在函数调用时参数的传递不完全用栈,主要用寄存器。而C++程序函数调用前会使用push语句将参数入栈,然后再进行call。Delphi一般将第一个参数放入eax寄存器,第二个参数放入edx,第三个参数放入ecx寄存器,其余参数按照与VC程序类似的方式压栈。总之,Delphi编译器默认以register方式传递函数参数。这一点与VC编译的程序完全不同。
  • 提示:栈上给局部变量分配空间的时候,栈是向下增长的,而栈上的数组、字符串、结构体等却是向上增长的。理解这一点可以帮助识别栈上的变量。

三.IDA静态分析和OD动态分析

当我们完成病毒样本的检测后,接下来就需要使用反汇编工具进行分析了。

1.基本载入

第一步,使用IDA Pro载入病毒样本。

https://i-blog.csdnimg.cn/blog_migrate/d3a413d2baa5444a53ea7769b8933822.png#pic_center

下图为Delphi自己生产的内容,并不是我们关心的重点。我们更关心病毒程度的功能代码,本文主要讲解病毒的关键函数。

https://i-blog.csdnimg.cn/blog_migrate/2e1422961c1898a97041f965bf18b749.png#pic_center


第二步,定位到0x0040CB7E位置,发现这两个call是调用了同一个函数sub_403C98。

  • 0x0040CB7E
  • sub_403C98

https://i-blog.csdnimg.cn/blog_migrate/e7ceb15defd77d18ebdae0b4f9d99091.png#pic_center

注意:某些病毒在IDA中会自动分析出字符串“感谢艾玛…”,并且是在调用sub_403C98函数之前,我们可以推测上面那个函数也传递了一个字符串。接着可以通过OD动态调试获取字符串对应的值。

https://i-blog.csdnimg.cn/blog_migrate/b26e4eacb4d329cae3f89ac19e9a6073.png#pic_center

但是,我目前的IDA并没有自动解析出字符串的值,只能通过经验进行分析或OD动态调试。我们发现EBP是堆栈基址,接近着两次调用sub_403C98函数,前面的mov赋值经过是参数传递的工作,从而猜测出它的功能是:参数传递给函数调用。

https://i-blog.csdnimg.cn/blog_migrate/ba04bcb3b21c0f1052461c44cd67ded1.png#pic_center


2.sub_403C98函数分析

第三步,调用OD进行动态分析,查看sub_403C98函数调用前传递的参数。

  • 0x0040CB79
  • sub_403C98

https://i-blog.csdnimg.cn/blog_migrate/d76e2f003206220b74e306e185db93e7.png#pic_center

打开OD如上图所示,我们需要定位到0x0040CB79位置。直接按F8执行代码(单步步过),当执行到0x0040CB79位置可以看到对应的值为“武汉男生感染下载者”。

https://i-blog.csdnimg.cn/blog_migrate/198e7f4cdc1853cff7b64096c945eca3.png#pic_center

当然某些OD不会显示该值,只会显示“0040CC40=setup.0040CC40”,此时需要我们进一步在数据窗口跟随。

  • 数据窗口右键->转到->表达式

https://i-blog.csdnimg.cn/blog_migrate/77e828d1fa968cd994aae9b68aa8ad21.png#pic_center

接着输入“40CC40”,查找传递参数对应的值。

https://i-blog.csdnimg.cn/blog_migrate/57624759e2eded10e65f4c3bc66d80f3.png#pic_center

显示结果如下图所示,可以看到“武汉男生感染下载者”,包括“艾玛…”,这就是病毒作者的信息。早些年病毒作者处于炫耀目的,都会加入一些自己的特征。同样,现在APT攻击溯源也会通过文件路径等获取病毒作者的信息。

  • 0x0040CC40

https://i-blog.csdnimg.cn/blog_migrate/abe4ff99463355b5f0dd2e37fa453c6a.png#pic_center


第四步,分析病毒程序利用00403C98函数做了什么。

  • call 00403C98

https://i-blog.csdnimg.cn/blog_migrate/2a5ba073045620615d1dab3cf52f1715.png#pic_center

接着再这个位置(0x0040CB7E)按下F2增加断点,然后按F9执行过来,按下F7进入call函数,进入的函数如下图所示。

https://i-blog.csdnimg.cn/blog_migrate/40f5f79a405a6d27d5ade92eadf31346.png#pic_center

接着按F7执行,遇到call 00403D08继续按下F7进入,再进入call 00402520,继续进入。

  • call 00403D08
  • call 00402520
  • call dword ptr ds:[0x40D030]
  • call 00401860

https://i-blog.csdnimg.cn/blog_migrate/9bc5093b03fe3f65a50f34513638021b.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/5772ecef24a6ff3d014a95f633089805.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/ef9526c08b9261ef0a6959506f307717.png#pic_center

当进入call 00401860函数后,我们分析这里的两个API函数,它是对互斥空间进行初始化。

  • 00401876 . E8 39F9FFFF call 004011B4 ;InitializeCriticalSection
  • 00401889 . E8 2EF9FFFF call 004011BC ;EnterCriticalSection

https://i-blog.csdnimg.cn/blog_migrate/17f240690b4729d246eeca842e71e805.png#pic_center

我们继续按下F8单步步过执行往下分析,发现在0x004018B3位置调用LocalAlloc函数,该函数用于内存分配。它会分配大小为FF8的空间,Flags为LMEM_FIXED表示分配一个固定的内存。该函数执行结果会返回一个指向新分配的内存对象的句柄。

  • LocalAlloc

https://i-blog.csdnimg.cn/blog_migrate/9c2d562339afdf094ef305fc309aa476.png#pic_center

写到这里,基本就确定了这个call 00403D08的功能,即分配一定大小的内存空间。我们已经进入了好几层Call,那怎么返回的呢?接下来我们再回到IDA进行分析。


第五步,打开IDA进入sub_403C98函数。

  • 0x0040CB7E call sub_403C98

https://i-blog.csdnimg.cn/blog_migrate/20b11cade3972fad5af52bda14ff2e3e.png#pic_center

整个sub_403C98函数由两个函数组成,刚才我们所进入的是第一个call sub_403D08的位置,并且分析了其功能是分配一定大小的空间。接着我们尝试分析下一个函数sub_402650。

  • 0x00403CB3 call sub_402650

https://i-blog.csdnimg.cn/blog_migrate/f4a45e45ec03baf251d04db41a5fed57.png#pic_center

接着记住这个地址“403CB3”,我们回到OD进行动态调试分析其功能。

  • 转到->表达式->输入403CB3

https://i-blog.csdnimg.cn/blog_migrate/7aedbb5584736a8f5a886e5f767eca37.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/3c79968adb787737a085412f4f13c986.png#pic_center

显示结果如下图所示,然后我们按下F2增加断点,再按F9执行程序至此处,继续按下F7单步进入该函数。

https://i-blog.csdnimg.cn/blog_migrate/22e68985efe0d545d46fad8384c5fea4.png#pic_center


第六步,分析sub_402650函数的功能。

上一步最终显示结果如下图所示,需要注意的是REP位置。

https://i-blog.csdnimg.cn/blog_migrate/bdf207babb9a638367e5c4b14137928c.png#pic_center

按下F8单步步过执行至0x0040267D位置。

  • 0x0040267D rep movs dword ptr es:[edi],dword ptr ds:[esi]

注意,该REP是将ESI指向地址的值以4字节方式拷贝到EDI指向的地址中。下图展示了ESI和EDI,重执行ECX次,每次执行后ESI+4、EDI+4、ECX-1,OD中在这段代码中下断后按F7单步步入就可以观察到这3个寄存器的变化。

  • ecx=00000008 (十进制 8.)
  • ds:[esi]=[0040CC5C]=2A2A2ADF
  • es:[edi]=[021C0028]=00000000

https://i-blog.csdnimg.cn/blog_migrate/9d738c5a1f67ab6d9f039b2be960a009.png#pic_center

我们先看看它复制的内容是什么,选择ESI右键“数据窗口钟跟随地址”。

https://i-blog.csdnimg.cn/blog_migrate/2b48e3db9b3d275cf617a819e28d1de6.png#pic_center

ESI显示“武汉男生”信息,所要复制的空间是EDI为空白空间。

https://i-blog.csdnimg.cn/blog_migrate/49d9138ef29e14b04b8b04436aa2b42a.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/0e69623bfab2636de5262771f8e7d2ea.png#pic_center

按下F8运行后发现该空间被赋值“武汉男生”。写到这里,基本确定了sub_402650函数功能就是字符串的复制。

https://i-blog.csdnimg.cn/blog_migrate/1ef890c4d2c29c565cda62b94ff29048.png#pic_center

总结,Sub_403C98主要包括两个函数,其对应功能如下:

  • sub_403D08:分配内存空间
  • sub_402650:字符串拷贝功能

https://i-blog.csdnimg.cn/blog_migrate/f4a45e45ec03baf251d04db41a5fed57.png#pic_center

同时,我们可以在IDA中对sub_403C98进行重命名操作,命名为“AllocStackAndCopyString”。重命名能将整个程序中该函数进行修改,便于我们理解及分析整个病毒。

sub_403C98函数有两个参数,由于采用的是Delphi编译器,因此在反汇编中,第一个参数保存在eax中,第二个参数保存在edx中。这个函数首先完成堆空间的申请,然后将edx中保存的字符串复制到新申请的空间中。这个函数在最初赋值的时候,eax的值均为0,而在执行后,eax中保存的就是新申请的堆空间中,所复制的字符串的首地址。为了易于观察,我把IDA Pro中的sub_403C98重命名为AllocStackAndCopyString。

https://i-blog.csdnimg.cn/blog_migrate/cee9c4f0fae5d784680661b0c5e72800.png#pic_center

下面补充一段姜老师的注释,对大家逆向分析和汇编理解很有帮助。

CODE:00403C98 sub_403C98    proc near    ; CODE XREF: sub_403ED4+8j
CODE:00403C98                            ; sub_403F18+6j ...
CODE:00403C98               test    edx, edx
    ; 对edx进行验证这里的test相当于and不同的是test只进行比较而不会将结果保存
    ; 在edx中由于edx保存的是病毒作者所编写的一段字符串因此这里的结果一定是非0的
CODE:00403C9A               jz      short loc_403CC0
    ; 由于上一条语句的结果是非0的因此这条跳转语句并不会被执行到
CODE:00403C9C               mov     ecx, [edx-8]
    ; 利用OD进行动态分析可知[edx-8]是将edx-8这个地址中的值取出来赋给ecx那么赋值
    ; 完以后ecx的值为0x0FFFFFFFF
CODE:00403C9F               inc     ecx
    ; ecx自增1那么ecx的值就变为了0x0注意这个自增的运算会使得ZF的值变为1
CODE:00403CA0               jg      short loc_403CBC
    ; 这里的jg表明不大于则跳转或者更准确地说其跳转条件是SF=OF且ZF=0由于经过上一步
    ; 的运算ZF=1因此本跳转不成立
CODE:00403CA2               push    eax
CODE:00403CA3               push    edx
CODE:00403CA4               mov     eax, [edx-4]
    ; 经过赋值后eax中保存的值为0x20
CODE:00403CA7               call    sub_403D08
    ; 结合OD在虚拟机中进行动态分析进入一层又一层的调用可以得知这个CALL主要是调用了
    ; LocalAlloc函数它从堆中分配大小为0xFF8的空间函数参数uFlags=0
    ; LMEM_FIXED意思是分配固定内存返回值是指向一个内存对象的指针LocalAlloc函数
    ; 如果执行成功则返回一个指向新分配的内存对象的句柄
CODE:00403CAC               mov     edx, eax
CODE:00403CAE               pop     eax
CODE:00403CAF               push    edx
CODE:00403CB0               mov     ecx, [eax-4]
CODE:00403CB3               call    sub_402650
    ; 结合OD在虚拟机中进行动态分析这个CALL的主要功能是将之前保存在edx中的字符串
    ; 毒信息与作者感言拷贝到上面所分分配的堆空间中如图5所示
CODE:00403CB8               pop     edx
CODE:00403CB9               pop     eax
CODE:00403CBA               jmp     short loc_403CC0

3.sub_405360函数分析

第七步,继续从0x0040CB92位置往下分析,将该地址复制到OD中动态调试。

https://i-blog.csdnimg.cn/blog_migrate/3406bd6cbe8b99c9954deacc752d0d07.png#pic_center

操作如下:

  • 转到->表达式->输入“40CB92”
  • 按下F2增加断点
  • 按下F9执行,将代码调试到该位置

https://i-blog.csdnimg.cn/blog_migrate/aa6ed3552f2c1b8776fe9abacec3d0ee.png#pic_center

然后按F8单步执行,可以看到0x0040CB9A存储的值,某些情况还需要去数据窗口跟随。

  • 数据窗口右键->转到->表达式->输入40CCA4

https://i-blog.csdnimg.cn/blog_migrate/dc42718ffe5b46ea014a83ac6efbff31.png#pic_center

可以发现在“40CCA4”位置保存了一段字符串,它可能是一段乱码,目前无法分析它的含义。

https://i-blog.csdnimg.cn/blog_migrate/30b06713747515041a8b5fafecaec909.png#pic_center

继续按下F8执行到0x0040CB9F,按下F7进入函数。

  • 0x0040CB9F call 00405360

https://i-blog.csdnimg.cn/blog_migrate/a7d4ba68839d7b19314e194db3245efe.png#pic_center

进入后先简单浏览下这个函数,发现后续有一个粗线循环,我们在0x004053CC下个断点跳转到这个循环处,并进入循环。

  • F2按下在0x004053CC处增加断点
  • F9执行到循环处
  • F8进入循环

https://i-blog.csdnimg.cn/blog_migrate/d096cfbd08855ccd9da2495ab04707dc.png#pic_center

按下F8单步执行代码,此时发现字符串“xboy”,我们暂时不知道它是做什么的。

https://i-blog.csdnimg.cn/blog_migrate/80592a156af35dd16de9c220e5e36e8b.png#pic_center

接着继续按下F8调试,发现它将字母“b”赋值给了EAX,我们怀疑它跟“xboy”有关。

https://i-blog.csdnimg.cn/blog_migrate/b0b0911330a7a22b0f718bbdc786ca26.png#pic_center

接下来的代码分析如下:

  • MOV ECX, 0xA

    将常量“A”赋值给ECX。通常存在两种可能性,一种可能是ECX作为循环的此时,即可能循环A次;另一种可能是EXC作为一个运算的除数。

  • XOR EDX, EDX

    异或操作将自身清空。

  • DIV ECX

    可以发现它是一个除法操作,除数即为ECX。结果显示如下图所示,除法的商EAX为9,余数EDX为8。

通常除法有两种可能,要么获取EAX的商值,要么获取余数EDX的内容。那么这个程序究竟需要哪一个值呢?

  • MOVX eax, byte ptr ds:[eax+ebx-0x1]

    该语句将值赋给EAX,所以上述程序做除法的目的是获取EDX这个值。

https://i-blog.csdnimg.cn/blog_migrate/6f43a75e1a33d2e67e5648d8788df104.png#pic_center

接着在数据窗口中跟随地址,查看这个值保存的是什么内容。

https://i-blog.csdnimg.cn/blog_migrate/4a44cf9d22952c5a5eaec09efbab9e7d.png#pic_center

输出结果如下图所示,它是刚才我们发现的乱码,暂时还不知道它的具体作用。继续按下F8执行程序。

  • XOR EDX, EAX

    EDX和EAX异或操作,其值保存在EDX中,即除法的余数EDX和乱码EAX进行异或操作。

https://i-blog.csdnimg.cn/blog_migrate/cfe881fb86f9c3b4ccdabed4f9e9fdcb.png#pic_center

继续按下F8单步走,在0x00405408处出现了个地址,我们在数据窗口中跟随数值。

https://i-blog.csdnimg.cn/blog_migrate/13a30b6f4d7eadd56fd1452ac29dbbd7.png#pic_center

发现这个结果是“2A”,该值正式刚才异或出来的EDX结果。

https://i-blog.csdnimg.cn/blog_migrate/585d09ff06deedf24e714369e6fc3105.png#pic_center

接着我们尝试在下列两个位置增加断点。

  • 0x004053E8
  • 0x00405408

https://i-blog.csdnimg.cn/blog_migrate/6e20d41de901bddfd66497d752ef3622.png#pic_center

接着按下F9运行,查看输出的结果,分析如下:

  • 将“xboy”的第三个字母“o”取出解密
  • 数据窗口新增很多内容,完成字符串拷贝

https://i-blog.csdnimg.cn/blog_migrate/f55839f653b2d5f5333dfdf8f2437f36.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/63b78aa7853c9484c1df533ba1d566b7.png#pic_center

反复继续按F9调试,发现它依次获取“xboy”中的值,再进行异或操作。

https://i-blog.csdnimg.cn/blog_migrate/3a7891d1f8d3183dd3df647646919178.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/36b5fe7c87dc2ee7ac9b8594d69e9f30.png#pic_center

小结:最终解密的值如下图所示,“武汉男生感染下载者”逐渐出现。sub_405360函数我们在IDA中重命名为“DecodeString”,即解密字符串。

https://i-blog.csdnimg.cn/blog_migrate/1963792dec80f25b98454998ba3c8369.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/353f5b83253ccec9cf444a47f807e3a9.png#pic_center

补充汇编代码:

CODE:004053D1 loc_4053D1:         ; CODE XREF: sub_405360+B5 j
CODE:004053D1                 mov     eax, [ebp+var_14]
CODE:004053D4                 call    sub_403ECC
CODE:004053D9                 push    eax
CODE:004053DA                 mov     eax, ebx
CODE:004053DC                 pop     edx
CODE:004053DD                 mov     ecx, edx
CODE:004053DF                 cdq
CODE:004053E0                 idiv    ecx
CODE:004053E2                 mov     edi, edx
CODE:004053E4                 inc     edi
CODE:004053E5                 mov     eax, [ebp+var_14]
CODE:004053E8                 movzx   eax, byte ptr [eax+edi-1]
    ; 每次循环逐字节取出xboy中的字符进行运算注意这里首先取出的是b”。
CODE:004053ED                 mov     ecx, 0Ah
    ; 将ecx赋值为0x0A作为接下来除法运算的除数
CODE:004053F2                 xor     edx, edx
    ; 清空edx
CODE:004053F4                 div     ecx
    ; 做除法运算商保存在eax中余数保存在edx中
CODE:004053F6                 mov     eax, [ebp+var_4]
    ; 这里由于给eax重新赋值说明程序实际想使用的是edx中的余数
CODE:004053F9                 movzx   eax, byte ptr [eax+ebx-1]
    ; 每次循环逐字节取出乱码中的字符赋值给eax进行接下来的运算
CODE:004053FE                 xor     edx, eax
    ; 异或运算结果保存在edx中也就是通过运算最终得出的字符
CODE:00405400                 lea     eax, [ebp+var_18]
CODE:00405403                 call    sub_403E2C
CODE:00405408                 mov     edx, [ebp+var_18]
CODE:0040540B                 lea     eax, [ebp+var_10]
CODE:0040540E                 call    sub_403ED4
CODE:00405413                 inc     ebx
CODE:00405414                 dec     esi
CODE:00405415                 jnz     short loc_4053D1

4.sub_404018函数分析

第八步,继续分析sub_404018函数的功能。

记住地址0x0040CBA4,复制到OD中进行调试。

https://i-blog.csdnimg.cn/blog_migrate/f1cb3410f4820e3a5279e362f42ba2a0.png#pic_center

首先取消刚才解密的两个断点,然后跟随表达式“40CBA4”,在该位置按下F2增加断点,然后F9执行过来。

https://i-blog.csdnimg.cn/blog_migrate/05a3293da54922575817753e61d7b5dd.png#pic_center

首先看到两条赋值语句,将值赋给EDX和EAX中,由于这个程序是使用Delphi编写,所以在call之前会将参数放到寄存器中,我们首先看看EDX中的内容。

https://i-blog.csdnimg.cn/blog_migrate/c20acb402acab28ddad58d7bacab4438.png#pic_center

在数据窗口中跟随数值,发现它们都是“武汉男生感染下载者”。注意第一个是我们刚才解密出来的内容。

  • 0040CBA4 . 8B55 EC mov edx,dword ptr ss:[ebp-0x14]
  • 0040CBA7 . A1 D4E74000 mov eax,dword ptr ds:[0x40E7D4]

https://i-blog.csdnimg.cn/blog_migrate/bceda6396b9ee0e5a73b703357a8b577.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/6187d1a9e6a51941b1f8cbf4fff78f17.png#pic_center

接着按下F8执行,再按F7进入Call 0040018函数。大致浏览该函数后,发现又存在一个循环,我们的重点就是分析该循环,按下F2增加断点,再按F9执行过来。

  • 0x00404041

https://i-blog.csdnimg.cn/blog_migrate/dd9edc25171c9f41b23b61f1f1fdbe35.png#pic_center

在数据窗口中跟随,发现ECX和EBX就是刚才所说的两个参数,一个是原始的“武汉男生感染下载者”,另外一个是解密之后的“武汉男生感染下载者”。再按F8发现这个函数比较两个字符串是否相同的操作。

  • CMP ECX, EBX

https://i-blog.csdnimg.cn/blog_migrate/a4eca0642d3f293babfcf047a3cdc75a.png#pic_center

总结:回到IDA,我们将函数sub_404018重命名为字符串比较函数“CMPString”。

https://i-blog.csdnimg.cn/blog_migrate/2055963da5bda2fb10f609aaf83cbc23.png#pic_center


5.loc_40CBBC功能分析

第九步,分析loc_40CBBC功能。

继续往下看,发现只要CMPString两个字符串相同,就会跳转到loc_40CBBC的位置。

https://i-blog.csdnimg.cn/blog_migrate/ccbbd6db83cef8533f7d4fce53722d3a.png#pic_center

继续分析发现这里同样存在字符串解密和字符串比较的操作,并且解密字符编程了武汉男孩(whboy),这里不再进行解读。

https://i-blog.csdnimg.cn/blog_migrate/953191b9a099ffc086c40a89850835d8.png#pic_center

解密比较成功之后,继续跳转到loc_40CBE6的位置。这里看到了三个call函数,它们又是什么功能呢?这三个call是熊猫烧香病毒最重要的功能,我们下一篇论文继续分析。

https://i-blog.csdnimg.cn/blog_migrate/ed453359dd89442cc78f5a88238cafef.png#pic_center


四.总结

写到这里,熊猫烧香病毒起始阶段的逆向分析就介绍完毕,简单总结如下:

  • 0x0040CB7E call sub_403C98

    – 重命名为:AllocStackAndCopyString

    – sub_403D08:分配内存空间

    – sub_402650:字符串拷贝功能

  • 0x0040CB9F call sub_00405360

    – 重命名为:DecodeString

    – 0x004053CC:循环入口点

    – 0x004053E8:获取“xboy”解密字符

    – 0x00405408:完成异或解密操作

  • 0x0040CBAC call sub_404018

    – 重命名为:CMPString

    – 0x00404041:循环入口点

    – 功能:字符串比较“武汉男生感染下载者”

  • 0x0040CBCC loc_40CBBC

    – 功能:字符串解密和比较操作,解密字符“whboy”

    – DecodeString

    – CMPString

后续会继续分析熊猫烧香病毒的核心功能三个函数,正如姜老师所说“由于反汇编代码总会出现各种调用与跳转,所以分析时会显得很是凌乱,可能会打消大家的积极性。但也可以看见逆向分析工作需要各位读者的耐心与细致,需要大家沉得住气,不断跟踪每一个可疑的CALL;需要大家时刻留意寄存器中的内容,才能够找到我们需要的信息。当然经验也是非常重要的。” 再次感谢姜老师的分享,真的受益匪浅,也希望自己不断深入,真正能在逆向分析和恶意代码中学到东西,加油!

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

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

https://i-blog.csdnimg.cn/blog_migrate/0fc98760b03e4a9516d1722c19061a92.png

(By:Eastmount 2020-12-08 星期二 晚上9点写于武汉 )


参考文献:

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

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]