学习札记
利用strings分析样本字符串
利用sigcheck分析数字签名
利用OD去除混淆
利用OD找出隐藏的数据
//以下皆为level-easy//轻喷//
利用Strings分析样本字符串
步骤:在TC下方输入 strings 样本路径 > 新的文件名称。
通过这个新的文件对程序的字符串进行分析,是否含有敏感字符 (如和键盘相关的backspace、esc等以及前文提到的杀软的名称等等) 。
利用sigcheck分析数字签名
它是对电子形式的消息进行签名的一种方法,一个签名消息能在一个通信网络中传输。基于公钥密码体制和私钥密码体制都可以获得数字签名,主要是基于公钥密码体制的数字签名。当一些恶意程序的作者想要在一些大型软件的dll文件上加入恶意代码,此时数字签名就发挥了很大的作用。
在这利用sigcheck分析名为某知名软件的恶意程序.dll文件 发现这里的verified的状态并非为signed 并且很多文件来源信息是空的 先查看下该正常程序的数字签名。
尝试修改在这黄色标注的地方原本是00。
可以看到修改后sigcheck再次查看时 verified变成了unsigned 与前边分析的P1相似 基本可以判定是DLL劫持了。
样本二:
伪装成windows文件。
Self summary
经过学习发现早期windows版本的系统软件是没有数字签名的,嗯..对于数字签名的分析并不能作为对这个程序的完全判断标准,即数字签名没有问题并不代表这个程序没有问题倘若有问题即可认为其是一个fake。
利用OD去除混淆
混淆:恶意程序的作者将想要隐藏执行的PE文件经过加密后植入自身内部,当运行的时候进行解密的操作将隐藏在自身的程序释放出来达到目的,即为恶意程序作者自己发明的壳。
virtualalloc:可以通过并行多次调用提交一个区域的部分或全部来保留一个大的内存区域。多重调用提交同一块区域不会引起失败。这使得一个应用程序保留内存后可以随意提交将被写的页。当这种方式不在有效的时候,它会释放应用程序通过检测被保留页的状态看它是否在提交调用之前已经被提交。
因此可以利用virtualAlloc这一类分配函数作为断点,因为恶意程序要去解密时会为自己分配一块内存空间,然后在这块内存空间做解密操作,这样每当进程调用这个函数时就会被我们断下来了。
F9对其进行单步执行,这里关注VirtualAlloc函数的返回值即其新开辟的内存大小。
根据空间大小对其进行锁定判断,F8。
通过右上角寄存器提示的首地址可以选择数据窗口跟随F9进行运行 并在其中开启硬件断点-word。
接着F8对其步过,可以发现jmp、jbe、jb等可判断其为跳转区域,很大可能作用为解密。
每单步执行后可以发现区域中数据变多了且头两个字符逐步解密为MZ,可以判断为是隐藏的PE文件。同时可以将文件导出,导出的即为病毒的本体了。
利用OD找出隐藏的数据
如上同一样本,来到VirtualAlloc断点返回值为903680处找到对该函数调用后的下一条语句进行F4,在右上角对ESI对其数据窗口跟随,同样开启硬件访问断点-word,对其进行F9操作。
逐步写入了E8,此时分析语句可以发现,当前代码位置的上一个位置的语句写入了E8这个字节的内容,往后看发现dl赋值给了eax+edi,也就是将E8保存在了这俩的运算结果即02890000中。
对其F4后数据窗口查看得0xE63903发现正是之前数据源头的值。也就是说经过当前的赋值EDX中存的值为这个,那么经过新的赋值及自增操作,它再将值放回其中,这样指针就指向E8之后的那个数据,下一次拷贝的时候就可以将新的数据存入缓冲区中。
接下来的循环,将ECX与8相比较,若等于不执行JNZ跳转,若等于则清零。(JNZ,条件转移指令,结果不为零(或不相等)则转移)。而在接下来的运算中发现又将EBX+10的内容赋值给了EDX,后EDI又自增1与EDX进行比较,利用JB(Jump below)进行跳转来判断是否完全拷贝了,以此控制需要拷贝的字节数。
此时再回到0019F97D位置,可以发现这里对ECX的赋值无异于上面的操作,无非是多了个*4,也就是后移四个字节后又将数据存入缓冲区,然后又将ECX与8作比较,那么在这每轮循环中都会向其地址的指定数据中读取一个字节然后地址自增,直至读取完毕,因此可以依靠这类循环,将新开辟内存中的数据依地址次序记录即得到了其各栈空间地址的数据内容。
!小彩蛋 !
行动是治愈恐惧的良药,而犹豫拖延将不断滋养恐惧。
END
原文始发于微信公众号(Th0r安全):工具下的恶意样本分析及OD的混淆去除与隐藏数据的发现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论