whklhh 发表于 2017-12-24 02:21

【CTF习题】恶意软件分析

本帖最后由 whklhh 于 2017-12-24 21:51 编辑

>挑战:《恶意软件分析》

>赛题背景: 员工小A收到了一封邮件,带一个文档附件,小A随手打开了附件。随后IT部门发现小A的电脑发出了异常网络访问请求,进一步调查发现小A当时所打开的附件其实是一个伪装成word文档的恶意可执行文件。

>赛题描述: 请在试着分析evil.exe和其所下载的x.jpg, 从中找出key.

>评分标准: 密钥正确则可进入下一题。

打开x.jpg查看一下,发现是乱码
那么还是分析evil.exe吧

首先查壳,ExeInfoPE认为有可能是UPX
拿UPX脱壳失败,只能乖乖手脱
ESP定律轻松解决,dump下来拖入IDA进行分析

首先可以确定它进行了联网,那么一定调用了相关的函数
到Imports导入函数列表查看
![这里写图片描述](http://img.blog.csdn.net/20171224020003371?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
最下面几个InternetOpenUrl很明显就是连接网络的函数,跟过去
![这里写图片描述](http://img.blog.csdn.net/20171224020057742?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
发现确实是在下载x.jpg
查看调用,发现在WinMain函数中
![这里写图片描述](http://img.blog.csdn.net/20171224020405133?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
下载的内容放在v8中,根据指针可以发现在Decrypt函数中引用了它

发现在Decrypt函数中进行了异或解码,异或的值来自于v6,也就是InitKey函数中由常数0x4A8754F5745174进行初始化的Key数组
初始化过程就是从低向高循环取1个字节再加i
生成长度为256的表

解码过程中还进行了对Key的变换,来进一步增加难度。不过由于提供的是解码函数,因此只需要照样操作即可
![这里写图片描述](http://img.blog.csdn.net/20171224021650595?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

之后在ExecShellcode函数中,再次对data进行了一次异或解码
data ^= data+i
最后直接跳转执行

最简单的方法就是修改Dns,搭建本地服务器来传递x.jpg,在函数中正常解码,通过动态调试来查看Shellcode
复杂一点的方法就是重现算法,解码x.jpg并反汇编Shellcode

前者除了搭服务器麻烦点外其他都很简单,正常下断点调试即可,因此下面给出后者的脚本

```
# InitKey
a = 0x4A8754F5745174
key =
for i in range(256):
    key.append((((a>>(i%8*8))+i)&0xff))

f = open("x.jpg", "rb")
data = f.read()
f.close()

# Decrypt
new_data = b""
j = 0
print(data)
for ii in range(len(data)):
    i = (ii+1)%256
    j = (key[`i] + j) % 256
    key[`i], key = key, key[`i]
    new_data += bytes((((data ^ key[(key[`i] + key) % 256])^ii)%256, ) )

print(new_data)
f = open("decrypt.jpg", "wb")
f.write(new_data)
f.close()
```

这样就能得到Shellcode了
十六进制查看发现有明文字符串
![这里写图片描述](http://img.blog.csdn.net/20171224021322767?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
每4个字符前有一个0x68,即汇编的push
并且由于push一次只有4个字符,因此顺序还有点反人类

再写下脚本提取(续在刚才的脚本之后)即可

```
flag = []
i = 0
while(i<len(new_data)):
    if(new_data[`i]==0x68):
      flag.append(new_data)
      i += 3
    i += 1

print(flag[::-1])
for i in flag[::-1]:
    print(str(i), end='')

```

## ShellCode分析
将Shellcode复制到OD随便一段空白处中进行分析
![这里写图片描述](http://img.blog.csdn.net/20171224195547726?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
注意跳转执行的时候是从第二个字节开始,第一个字节0xEE是没有用的

右击第二个字节,设置EIP进行执行
可以发现它动态获取Kernel32.dll和通过LoadLibrary函数加载MessageBox和ExitPorcess函数

从43DD11开始
TEB(线程环境块)→PEB(进程环境块)→_PEB_LDR_DATA→InInitializetionOrderModuleList
通过双向链表遍历加载的模块,最终取到kernel32.dll的入口,然后进入下一个代码块加载函数

![这里写图片描述](http://img.blog.csdn.net/20171224201338132?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
最前面几行是初始化,之后push 0xEC0E4E8E这个硬编码,再push edx,即kernel32.dll的入口点,以这两个参数调用43DD2D取函数地址

![这里写图片描述](http://img.blog.csdn.net/20171224210829710?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2hrbGhoaGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
这个函数里面通过参数1入口点来遍历模块内的所有函数,将函数名进行hash(逐字符相加并循环右移13位)后与参数2的硬编码比较,符合则证明是需要的函数,保存地址后退出

通过这个函数分别取到LoadLibraryA、ExitProcess和MessageBoxA,并通过LoadLibraryA加载后两个函数
然后push字符串,调用MessageBoxA显示成功提示,最后Exit结束

whklhh 发表于 2017-12-25 13:47

Poner 发表于 2017-12-25 09:48
原来是这样    但感觉这道题对你来说技术含量太低了希望下次在找个难度高点的吧

难度高的做不出来hhh 见的多了发现自己还差的远呢
软件下载并执行Shellcode我是第一次见,所以觉得挺新奇的~
总之谢谢鼓励啦,以后会更严格筛选质量的!

whklhh 发表于 2017-12-25 01:25

本帖最后由 whklhh 于 2017-12-25 01:26 编辑

Poner 发表于 2017-12-24 23:36
我想我的表达方式没有问题吧?

能加上恶意行为分析? 如果只是贴上API的调用   还不如直接丢 ...
{:301_973:}但是这个题......它没有恶意行为啊...毕竟就是个比赛的题目,一般也不好真的做什么吧..
它的Shellcode解出来就是MessageBox,提示正确,然后就退出了..

Poner 发表于 2017-12-24 12:25

要是能分析下他的恶意行为就好了

whklhh 发表于 2017-12-24 21:52

Poner 发表于 2017-12-24 12:25
要是能分析下他的恶意行为就好了

{:301_975:}加了对Shellcode的分析

Poner 发表于 2017-12-24 23:36

whklhh 发表于 2017-12-24 21:52
加了对Shellcode的分析

:rggrg   我想我的表达方式没有问题吧?

能加上恶意行为分析? 如果只是贴上API的调用   还不如直接丢哈勃对不对

Poner 发表于 2017-12-25 09:48

whklhh 发表于 2017-12-25 01:25
但是这个题......它没有恶意行为啊...毕竟就是个比赛的题目,一般也不好真的做什么吧..
它的 ...

原来是这样    但感觉这道题对你来说技术含量太低了希望下次在找个难度高点的吧

xixixi1 发表于 2018-3-14 08:29

谢谢楼主分享哦哦!!

chen123456 发表于 2018-3-14 08:40

不错,非常详细!

balabalagogo 发表于 2018-6-8 09:48

高手,Video Comparer这个软件我怎么都搞不定,能帮忙看下如何破解吗?多谢!
页: [1] 2
查看完整版本: 【CTF习题】恶意软件分析