b2b电商系统搭建的关键步骤与最佳实践解析,助力企业数字化转型
1212
2022-05-30
IDA和OD作为逆向分析的“倚天剑和“屠龙刀”,学好它们的基本用法至关重要。本文重点分析熊猫烧香病毒的功能函数,大家掌握这些技巧后才能更好地分析更多的代码。同时,本文部分实验参考姜晔老师的视频分析,真的非常佩服和值得去学习的一位老师。技术路上哪有享乐,为了提升安全能力,别抱怨,干就对了~
文章目录:
一.实验背景
二.PEiD加壳检查
三.IDA静态分析和OD动态分析
四.总结
逆向分析:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
网络安全:https://github.com/eastmountyxz/NetworkSecuritySelf-study
前文分析:
[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向
[系统安全] 二.如何学好逆向分析及吕布传游戏逆向案例
[系统安全] 三.IDA Pro反汇编工具初识及逆向工程解密实战
[系统安全] 四.OllyDbg动态分析工具基础用法及Crakeme逆向破解
[系统安全] 五.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏
[系统安全] 六.逆向分析之条件语句和循环语句源码还原及流程控制
[系统安全] 七.逆向分析之PE病毒原理、C++实现文件加解密及OllyDbg逆向
[系统安全] 八.Windows漏洞利用之CVE-2019-0708复现及防御详解
[系统安全] 九.Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御
[系统安全] 十.Windows漏洞利用之SMBv3服务远程代码执行漏洞(CVE-2020-0796)及防御详解
[系统安全] 十一.那些年的熊猫烧香及PE病毒行为机理分析
[系统安全] 十二.熊猫烧香病毒IDA和OD逆向分析(上)病毒初始化
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该样本不会分享给大家,分析工具会分享。(参考文献见后)
一.实验背景
对病毒进行逆向分析,可以彻底弄清楚病毒的行为,从而采取更有效的针对手段。为了节省篇幅,在这里我不打算将“熊猫烧香”进行彻底的分析,只会讲解一些比较重要的部分,大家只要掌握了这些思想,那么就可以处理很多的恶意程序了。
这里主要使用的工具包括:
PEiD:病毒加壳、脱壳基础性分析
IDA Pro:静态分析
OllyDbg:动态分析
实验文件:
setup.exe:熊猫烧香病毒
基本流程:
利用查壳工具检查病毒是否带壳
利用OD动态分析病毒
利用IDA静态分析病毒
注意:由于OD工具会将程序运行起来,所以我们在进行恶意代码分析时尽量在搭建好的虚拟机中操作。如果病毒传播性较强如WannaCry,建议断开网络和断开共享分析。
二.PEiD加壳检查
我们在分析病毒之前,首先需要调用工具检查是否带壳,如果病毒还需要先进行脱壳操作。这次研究的“熊猫烧香”程序并没有加壳,但后续的文章我会详细分享加壳与脱壳的内容,更好地帮助大家理解病毒分析及保护措施。
首先打开PEiD工具人,然后将熊猫烧香病毒拖进去,会发现病毒的基本信息。
分析信息如下:
该程序并没有加壳,采用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载入病毒样本。
下图为Delphi自己生产的内容,并不是我们关心的重点。我们更关心病毒程度的功能代码,本文主要讲解病毒的关键函数。
第二步,定位到0x0040CB7E位置,发现这两个call是调用了同一个函数sub_403C98。
0x0040CB7E
sub_403C98
注意:某些病毒在IDA中会自动分析出字符串“感谢艾玛…”,并且是在调用sub_403C98函数之前,我们可以推测上面那个函数也传递了一个字符串。接着可以通过OD动态调试获取字符串对应的值。
但是,我目前的IDA并没有自动解析出字符串的值,只能通过经验进行分析或OD动态调试。我们发现EBP是堆栈基址,接近着两次调用sub_403C98函数,前面的mov赋值经过是参数传递的工作,从而猜测出它的功能是:参数传递给函数调用。
2.sub_403C98函数分析
第三步,调用OD进行动态分析,查看sub_403C98函数调用前传递的参数。
0x0040CB79
sub_403C98
打开OD如上图所示,我们需要定位到0x0040CB79位置。直接按F8执行代码(单步步过),当执行到0x0040CB79位置可以看到对应的值为“武汉男生感染下载者”。
当然某些OD不会显示该值,只会显示“0040CC40=setup.0040CC40”,此时需要我们进一步在数据窗口跟随。
数据窗口右键->转到->表达式
接着输入“40CC40”,查找传递参数对应的值。
0x0040CC40
第四步,分析病毒程序利用00403C98函数做了什么。
call 00403C98
接着在这个位置(0x0040CB7E)按下F2增加断点,然后按F9执行过来,按下F7进入call函数,进入的函数如下图所示。
接着按F7执行,遇到call 00403D08继续按下F7进入,再进入call 00402520,继续进入。
call 00403D08
call 00402520
call dword ptr ds:[0x40D030]
call 00401860
当进入call 00401860函数后,我们分析这里的两个API函数,它是对互斥空间进行初始化。
00401876 . E8 39F9FFFF call 004011B4 ;InitializeCriticalSection
00401889 . E8 2EF9FFFF call 004011BC ;EnterCriticalSection
我们继续按下F8单步步过执行往下分析,发现在0x004018B3位置调用LocalAlloc函数,该函数用于内存分配。它会分配大小为FF8的空间,Flags为LMEM_FIXED表示分配一个固定的内存。该函数执行结果会返回一个指向新分配的内存对象的句柄。
LocalAlloc
写到这里,基本就确定了这个call 00403D08的功能,即分配一定大小的内存空间。我们已经进入了好几层Call,那怎么返回的呢?接下来我们再回到IDA进行分析。
第五步,打开IDA进入sub_403C98函数。
0x0040CB7E call sub_403C98
整个sub_403C98函数由两个函数组成,刚才我们所进入的是第一个call sub_403D08的位置,并且分析了其功能是分配一定大小的空间。接着我们尝试分析下一个函数sub_402650。
0x00403CB3 call sub_402650
接着记住这个地址“403CB3”,我们回到OD进行动态调试分析其功能。
转到->表达式->输入403CB3
显示结果如下图所示,然后我们按下F2增加断点,再按F9执行程序至此处,继续按下F7单步进入该函数。
第六步,分析sub_402650函数的功能。
上一步最终显示结果如下图所示,需要注意的是REP位置。
按下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
我们先看看它复制的内容是什么,选择ESI右键“数据窗口钟跟随地址”。
ESI显示“武汉男生”信息,所要复制的空间是EDI为空白空间。
按下F8运行后发现该空间被赋值“武汉男生”。写到这里,基本确定了sub_402650函数功能就是字符串的复制。
总结,Sub_403C98主要包括两个函数,其对应功能如下:
sub_403D08:分配内存空间
sub_402650:字符串拷贝功能
同时,我们可以在IDA中对sub_403C98进行重命名操作,命名为“AllocStackAndCopyString”。重命名能将整个程序中该函数进行修改,便于我们理解及分析整个病毒。
sub_403C98函数有两个参数,由于采用的是Delphi编译器,因此在反汇编中,第一个参数保存在eax中,第二个参数保存在edx中。这个函数首先完成堆空间的申请,然后将edx中保存的字符串复制到新申请的空间中。这个函数在最初赋值的时候,eax的值均为0,而在执行后,eax中保存的就是新申请的堆空间中,所复制的字符串的首地址。为了易于观察,我把IDA Pro中的sub_403C98重命名为AllocStackAndCopyString。
下面补充一段姜老师的注释,对大家逆向分析和汇编理解很有帮助。
3.sub_405360函数分析
第七步,继续从0x0040CB92位置往下分析,将该地址复制到OD中动态调试。
操作如下:
转到->表达式->输入“40CB92”
按下F2增加断点
按下F9执行,将代码调试到该位置
然后按F8单步执行,可以看到0x0040CB9A存储的值,某些情况还需要去数据窗口跟随。
数据窗口右键->转到->表达式->输入40CCA4
可以发现在“40CCA4”位置保存了一段字符串,它可能是一段乱码,目前无法分析它的含义。
继续按下F8执行到0x0040CB9F,按下F7进入函数。
0x0040CB9F call 00405360
进入后先简单浏览下这个函数,发现后续有一个粗线循环,我们在0x004053CC下个断点跳转到这个循环处,并进入循环。
F2按下在0x004053CC处增加断点
F9执行到循环处
F8进入循环
按下F8单步执行代码,此时发现字符串“xboy”,我们暂时不知道它是做什么的。
接着继续按下F8调试,发现它将字母“b”赋值给了EAX,我们怀疑它跟“xboy”有关。
接下来的代码分析如下:
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这个值。
接着在数据窗口中跟随地址,查看这个值保存的是什么内容。
输出结果如下图所示,它是刚才我们发现的乱码,暂时还不知道它的具体作用。继续按下F8执行程序。
XOR EDX, EAX
EDX和EAX异或操作,其值保存在EDX中,即除法的余数EDX和乱码EAX进行异或操作。
继续按下F8单步走,在0x00405408处出现了个地址,我们在数据窗口中跟随数值。
发现这个结果是“2A”,该值正式刚才异或出来的EDX结果。
接着我们尝试在下列两个位置增加断点。
0x004053E8
0x00405408
接着按下F9运行,查看输出的结果,分析如下:
将“xboy”的第三个字母“o”取出解密
数据窗口新增很多内容,完成字符串拷贝
反复继续按F9调试,发现它依次获取“xboy”中的值,再进行异或操作。
小结:最终解密的值如下图所示,“武汉男生感染下载者”逐渐出现。sub_405360函数我们在IDA中重命名为“DecodeString”,即解密字符串。
补充汇编代码:
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中进行调试。
首先取消刚才解密的两个断点,然后跟随表达式“40CBA4”,在该位置按下F2增加断点,然后F9执行过来。
首先看到两条赋值语句,将值赋给EDX和EAX中,由于这个程序是使用Delphi编写,所以在call之前会将参数放到寄存器中,我们首先看看EDX中的内容。
在数据窗口中跟随数值,发现它们都是“武汉男生感染下载者”。注意第一个是我们刚才解密出来的内容。
0040CBA4 . 8B55 EC mov edx,dword ptr ss:[ebp-0x14]
0040CBA7 . A1 D4E74000 mov eax,dword ptr ds:[0x40E7D4]
接着按下F8执行,再按F7进入Call 0040018函数。大致浏览该函数后,发现又存在一个循环,我们的重点就是分析该循环,按下F2增加断点,再按F9执行过来。
0x00404041
在数据窗口中跟随,发现ECX和EBX就是刚才所说的两个参数,一个是原始的“武汉男生感染下载者”,另外一个是解密之后的“武汉男生感染下载者”。再按F8发现这个函数比较两个字符串是否相同的操作。
CMP ECX, EBX
总结:回到IDA,我们将函数sub_404018重命名为字符串比较函数“CMPString”。
5.loc_40CBBC功能分析
第九步,分析loc_40CBBC功能。
继续往下看,发现只要CMPString两个字符串相同,就会跳转到loc_40CBBC的位置。
继续分析发现这里同样存在字符串解密和字符串比较的操作,并且解密字符编程了武汉男孩(whboy),这里不再进行解读。
解密比较成功之后,继续跳转到loc_40CBE6的位置。这里看到了三个call函数,它们又是什么功能呢?这三个call是熊猫烧香病毒最重要的功能,我们下一篇论文继续分析。
四.总结
写到这里,熊猫烧香病毒起始阶段的逆向分析就介绍完毕,简单总结如下:
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;需要大家时刻留意寄存器中的内容,才能够找到我们需要的信息。当然经验也是非常重要的。” 再次感谢姜老师的分享,真的受益匪浅,也希望自己不断深入,真正能在逆向分析和恶意代码中学到东西,加油!
感恩能与大家在华为云遇见!
希望能与大家一起在华为云社区共同成长,原文地址:https://blog.csdn.net/Eastmount/article/details/111769346
(By:娜璋之家 Eastmount 2021-11-12 夜于贵阳)
参考文献:
姜晔老师真的非常佩服和值得去学习,希望自己和大家的技术能不断提升,加油!
[1] [网络安全自学篇] 木马原理详解、远程服务器IPC $漏洞及木马植入实验
[2] 姜晔老师的技术空间目录 - CSDN
[3] 腾讯安全联合实验室 - 知乎文章
[4] [网络安全自学篇] 七十九.Windows PE病毒原理、分类及感染方式详解
[5] 姜晔老师技术分享 - B站
[6] [网络安全自学篇] 四十九.Procmon软件基本用法及文件进程、注册表查看
[7] [安全攻防进阶篇] 八.那些年的熊猫烧香及PE病毒行为机理分析
[8] [网络安全自学篇] 七十三.WannaCry勒索病毒复现及分析(四)蠕虫传播机制源码详解
[9] https://blog.csdn.net/ioio_jy/article/details/41207265
网络 通用安全
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。