栈溢出笔记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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值