Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【技术分享】如何手脱Locky自定义壳

0
0
【技术分享】如何手脱Locky自定义壳

2017-08-14 14:11:19

阅读:481次
点赞(0)
收藏
来源: 安全客





【技术分享】如何手脱Locky自定义壳

作者:我来学英语





【技术分享】如何手脱Locky自定义壳

译者:我来学英语

预估稿费:130RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿


前言

Locky是一款勒索软件,因其加密后的文件后缀为.locky而得名。不同于一般的软件,Locky使用了自定义壳对代码进行保护,增加了对其进行静态分析的难度。这篇文章将教你一些小技巧并向你演示如何对Locky进行脱壳。

我将向你演示如何使用Ollydbg来给Locky脱壳。这个壳其实是比较简单的一种,但是需要你去分析。你可以从Hybrid-Analysis上去下载样本。

我要做的第一件事是使用PE静态分析工具来对待脱壳样本进行静态检测,比如你可以使用PortexAnalyzer。如果分析结果是类似于下图的,那么这就告诉我们这个样本是加了壳的。样本的多个节都是高熵值的,包括.rdata段


【技术分享】如何手脱Locky自定义壳
类似于die(detect it easy)这样的查壳工具是不知道如何对这个样本进行脱壳的,因为这个壳是自定义壳。在恶意样本中,自定义壳是经常出现的。

【技术分享】如何手脱Locky自定义壳

Locky的加壳器有一个比较奇怪的特征,它总是在文件版本信息中添加“32-bit Edition”字样,其他信息每次都会变化。

StringFileInfo --------------- languageID:0x0409 codepage:0x04b0 CompanyName:Doubtsoftware.com FileDescription:AdvancedTaskScheduler32-bitEdition FileVersion:4.1.0.612 InternalName:#dvencedTaskScheduler32-bitEdition LegalCopyright:CopyrightSouthsoftware.com,2002-2015 OriginalFilename:Bifscheduler_edmin.exe ProductName:AdvancedTaskScheduler32-bitEdition ProductVersion:4.1.0.612

Debug Information也是未知类型,因此Portex也无法给出进一步分析信息。

DebugInformation ***************** TimeDateStamp:ThuDec0905:07:00CET2083 Type:4102553603nodescriptionavailable

如果你研究过这个样本(你可以使用hex editor搜索“RSDS”),就会知道样本中包含一个调试路径,这个路径看起来是随机的,当然也可能是被故意修改成看起来随机的:

Z:\as\28cxkoao\azoozykz\l0t\jx\w9y4cni\jyc6mq3\mvnt.pdb

尽管这个信息没法帮助我们脱壳,但是它可以作为这种加壳器的特征。以后再碰到这条信息,我们就可以知道是使用这种加壳器加壳的了。对样本进行字符串和导入表检查似乎也没什么用。

如果你拿到这个样本时还比较早,通过动态调试你可以很轻松的认出他就是Locky。但是如果你拿到的样本比较老,或者他的C&C服务器不再使用,那么它就不会进行加密动作。

现在使用Ollydbg来调试它,别忘了给你的虚拟机做快照。程序加载后可以一直按F8步过,按得时候看着点别跑飞了。如果你不小心在下面这个call上步过了,你就会看到样本执行了一大堆动作,这时你只能重新载入这个样本了。你要做的是按F7步进这个call。


【技术分享】如何手脱Locky自定义壳

下面这个call也是一样的,按F7步进


【技术分享】如何手脱Locky自定义壳

后面的操作类似,仔细盯着屏幕,只要没执行一堆作就一直按F8步过。

在地址0x402364处你会注意到代码正在写.rdata段(地址0X417EE)。如果你在这下一个断点,一直按F9并且在数据窗口中看着.rdata所在的内存位置,你就可以看到.rdata段是怎样被解密成那个代码的。


【技术分享】如何手脱Locky自定义壳

跳转到.rdata段的jump命令在地址0x4020F0出现。


【技术分享】如何手脱Locky自定义壳

【技术分享】如何手脱Locky自定义壳

这个地方需要注意,push命令后紧跟ret相当于一个jump操作。ret命令会使你跳转到0x41577A。与上面PortexAnalyzer生成的报告进行对比,或者从Ollydbg的内存窗口你可以确认,这就是.rdata段的虚拟地址。

但是我们的工作并没有结束,rdata段处被解密的代码仍然是加壳stub(用于将加壳后的代码解密的代码)。所以我们还需要按F8跟踪这段代码一会。在跟踪的过程中你会看到代码开始使用GetProcAddress收集常见DLL方法的地址,其中一个方法是RtlDecompressBuffer,这个方法经常被加壳器用来执行脱壳操作。


【技术分享】如何手脱Locky自定义壳

【技术分享】如何手脱Locky自定义壳

调试到地址0x415B37时停下


【技术分享】如何手脱Locky自定义壳

在eax寄存器上右击,选择反汇编器中跟进


【技术分享】如何手脱Locky自定义壳
现在就可以看到RtlDecompressBuffer方法的代码了。在PUSH DWORD PTR [EBP + C]命令处下断点
【技术分享】如何手脱Locky自定义壳

在EDI寄存器上右击选择数据窗口中跟进


【技术分享】如何手脱Locky自定义壳

可以看到现在数据窗口是空的


【技术分享】如何手脱Locky自定义壳

按F8之后,解密后的代码就会出现在这部分内存中


【技术分享】如何手脱Locky自定义壳

最后一件事,打开内存窗口,选择这部分内存,右击选择保存到可执行文件


【技术分享】如何手脱Locky自定义壳

选择要保存的位置就完成了。得到的二进制文件就是脱壳后的lockey你可以把它加载到hex editor中来查看他的字符串,这样就可以确定这是一个Locky了


【技术分享】如何手脱Locky自定义壳


【技术分享】如何手脱Locky自定义壳
【技术分享】如何手脱Locky自定义壳
本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:http://struppigel.blogspot.com/2017/08/unpacking-locky.html

Viewing all articles
Browse latest Browse all 12749