前言
对fireeye关于ida中shellcode_hashes_search_plugin.py的文章翻译,原文链接是USING PRECALCULATED STRING HASHES WHEN REVERSE ENGINEERING SHELLCODE
文章是fireeye的Jay Smith写的,介绍说经常在分析恶意样本中遇到shellcode,文章会介绍shellcode导入技术的背景以及如何是IDA自动化标记来更快分析shellcode
逆向shellcode
判断一段shellcode做了什么,最简单的方法是将其放在一个监控环境中运行。但是如果shellcode是被exploit加载并且你没有对应版本的可利用程序,这种方式就没什么用了。在我们研究shellcode的经验中,我们发现很多恶意样本含有一段嵌入的shellcode,样本将shellcode注入到其他进程中执行。然而,获取到这段嵌入的shellcode,让他运行起来,并不总是可用的。在这些情况下,就需要静态分析shellcode来看看它有些什么功能了。
Shellcode的二进制文件一般都不是很大,所以逆向它们并不是很难,但是通常shellcode作者会使用一些技术手段来阻碍逆向分析。其中一种技术就是使用API函数名的hash来手工导入函数。
shellcode导入技术
开发者编写正常的程序通常使用kernel32.dll的LoadLibraryA和GetProcAddress来加载任意DLL和获取它们的到处函数地址。而shllcode的作者经常遇到内存大小限制,所以如果在代码中使用API函数名的完整字符串是不大可能的。相对于使用完整函数名字符串,预先计算好函数名的hash值,保存到shellcode中,花费更少的内存大小。使用这种方式的话,shellcode就不能使用GetProcAddress来获取函数地址了,需要解析DLL的PE文件找到导出目录,解析到处函数数组。对每个函数名字,计算出它的hash值,对比先前保存在shellcode中的hash值,如果相等就找到了对应的API函数。关于这种技术的背景资料可以在Last Stage的winasm项目中公开的paper中找到。
这种技术听起来很难,但是幸运的是shellcode作者大都会重用已知的hash算法和值,这样逆向分析就更简单了。我所见过的大部分shellcode样本的hash算法都被metasploit收录了。这个算法如下:
1 | acc := 0 |
这个肯定不是一个很强的hash算法,但是它已经完全可以达到将任意长度的输入字符串计算成一个整数的目的。这个算法唯一的限制是开发者使用的每一个API函数都有唯一的hash值,算法中简单的ROR-13是很有效的。我见过的不一样的hash算法通常只是将这个算法进行了轻微的修改:位移一个不同的值,将右移换成左移,或者使用其他方法将输入的所有字符串混合成一个整数值。
自动标记shellcode导入
当你第一次逆向shellcode的时候,你通常可能在网上搜搜这些魔数,或者自己计算这些值保存在文本中以后使用。很长一段时间,我看了很多的样本,我意思到这是一个烦人且重复的工作,该使用IDA脚本进行自动化。
由于shellcode作者重用通用的代码,我觉得公开我的IDA脚本集对恶意代码分析有帮助。预先用已知的hash算法计算出重用API函数名的hash后,如果有新的hash算法出现,就不难实现它来产生hash值了。在Poison Ivy RAT的字符串hash,有过这种情况(这句原文:There has only been one instance, involving string hash from Poison Ivy RAT, in which this wasn’t the case)。
可以在https://github.com/mandiant/Reversing找到脚本。
有两个部分:
make_sc_hash_db.py
是用于预先计算函数名字的hash值。这是一个实现了我以前遇到过的hash算法的命令行python脚本。它处理了一个目录中的所有DLL,计算了每个到处函数的hash值,保存在SQLite数据库中。shellcode_hash_search.py
是一个IDAPython脚本,用来打开SQLite数据库,获取其中预先计算的hash值,在当前文件中搜索已知的hash值。
make_sc_hash_db.py
可以像下面那样使用,第一个参数是要创建的数据库名字,第二个参数是保存DLL的目录。如果你跳过这个步骤,发布版本中已经有个简单的数据库了。
1 | python make_sc_hash_db.py sc_hashes.db /customer/microsoft/shellcode_dlls/ |
当shellcode_hash_search.py
运行起来后,提示用户使用哪个数据库,然后询问用户其他的搜索参数。它显示所有的保存在数据库中的hash算法,然后提供一些简单的已知的伪代码,如图:
脚本会尝试使用HexRays发布的用于QT的PySide(可以在这里下载http://www.hex-rays.com/products/ida/support/download.shtml)))。如果HexRays中没有PySide,它使用简单的对话框来或者相同的信息。
如果没有任何信息被高亮,脚本搜索当前段或者高亮区域。脚本查询每个DWORD(选中了DWORD Array选项),每个指令操作数(选中了Instr Operands选项)来决定是不是选中算法的一个hash值。如果找到了一个hash值会有一个line comment。如图:
有些shellcode作者也经常使用hash值保存在DWORD数组中,而不是将每个值压入函数参数,如图:
如果选中了Create Struct,如果找到的hash值在一段连续地址,脚本会自动创建一个结构体,如图:
如果shellcode作者使用函数指针数组,结构体非常有用,它会转换成[base+index]
的结构体引用。如图:
shellcode_hashes_search_plugin.py
用来显示IDA插件菜单的。拷贝到%PROGRAMFILES%IDAplugins
,设置其他python文件到PATH环境变量中确保可被使用。
总结
通常,逆向分析一个shellcode比正常的binary文件更加乏味。IDA的导入表分析缺陷是一个延长分析的很大原因。通过IDAPython脚本可以解决上面的问题,我们已经将脚本公开在githun,希望你们的shellcode分析能够得到改进。
参考:
USING PRECALCULATED STRING HASHES WHEN REVERSE ENGINEERING SHELLCODE
转载请注明出处,谢谢!