栈溢出笔记1.8 字符串问题

在前面编写Shellcode的过程中,我们用到的字符串要么直接使用DB定义,要么通过PUSH直接压入栈上(相当于定义局部变量),这样的话,如果一个Shellcode中的字符串多一点的话,仅字符串就要占用不少空间。而且,在1.7节中,我们在kernel32.dll的导出表中查找函数名称的时候,有一个字符串比较的过程,要将我们指定的函数名(如LoadLibraryA)与导出表中的函数名比较,这样一方面我们要保存需要查找的函数名,另一方面比较字符串占用了比较多的代码。还有,字符串问题会有前面的NULL字节的问题。

我们能不能把字符串去掉一些呢?常用的方法是Hash,即将一个字符串算出一个Hash值,然后进行比较,这样,我们就不需要保存待查找的函数名,而只保存一个Hash值,同样,比较的代码也会少一些。当然,效率可能会降低,因为每个字符串都需要算完整的Hash值,而直接比较的话,差别比较大的字符串马上就可以判断出来。但在Shellcode中,效率一般不是优先考虑的,优先考虑的是代码体积,如果能用十几个字节能解决问题,就不要用几十个字节,因为,有漏洞的程序留给我们可用的空间是有限的,每一个字节都是宝贵的。而且,代码量越大,隐蔽性越差,被人发现的概率越大。

那么需要找一个字符串Hash算法,这个算法至少要保证在一个dll中,所有的函数名算出来的Hash值是唯一的。最常用的是ROR13 Hash算法,这也是Metasploit中使用的算法,它的思想如下:

/*********************************************************/
acc := 0;
for c in input_string do    // 对于字符串中的每个字符
acc := ROR(acc, 13)   // 先将acc循环右移13位
acc := acc+c         // 与当前字符求和
end
/*********************************************************/

算法来自:https://www.fireeye.com/blog/threat-research/2012/11/precalculated-string-hashes-reverse-engineering-shellcode.html

这里只记录这样一个方法,具体实现与上一节大同小异,不过是换掉函数compare_string而已,就不写代码了。
实现请看这篇文章:http://www.tophertimzen.com/blog/shellcodeTechniquesCPP/

你可能感兴趣的:(windows,栈溢出,shellcode)