首页 > 编程语言 > 详细

windows:shellcode 远程线程hook/注入(五)

时间:2020-07-09 22:40:45      阅读:71      评论:0      收藏:0      [点我收藏+]

        前面几篇文章介绍了通过APC注入、进程注入、windows窗口处理函数回调、kernercallback回调执行shellcode,今天继续介绍通过heap Spray(翻译成中文貌似叫堆喷射)执行shellcode的方法;

        所谓堆喷射,本质上是在堆上分配空间,然后拷贝shellcode到这里执行,思路和之前分享的驱动隐藏(https://www.cnblogs.com/theseventhson/p/13170445.html)方法类似。不一样的地方在于:这里会申请大量空间(业界常见的是200M),填充0x0c(这就是所谓的slide code),然后在空间尾部拷贝shellcode;那么问题来了:

  •   为啥那么要申请200M这么大的空间?

   我们的shellcode在该空间的尾部,从 “200M-shellcode开头”  这段充满0x0c代码的任意地方开始执行最终都能顺利“滑”shellcode执行,极大增加了shellcode被执行的概率。如果没有slide code,那么必须靳准控制eip挑战到shellcode 的入口,增加了难度;

  •   为啥用0x0c填充,而不是用其他代码填充?

       (1)0x0c的代码是or al,0ch; 不会影响我们的shellcode;  (2)0x0c0c0c0c处的数据被填充成了0c0c0c0c(后面会详解);如果填充其他数据,会导致程序跳转到错误的地址,最终执行出错;

        接下来解读核心代码;

  1、申请堆内存,填充0x0c,如下spray0:

 技术分享图片

   就是在这里,因为spray+buflen远大于0x0c0c0c0c,通过memset把0x0c0c0c0c的内容也改成0x0c0c0c0c;

        新手注意:这些变量都是在函数内部生成的局部变量,本身在栈空间,函数一旦结束,空间会被释放;但spray例外,其指向堆空间,0x0c和shellcode都被复制到了堆空间,函数结束后仍然存在,除非手动释放,或则程序结束被操作系统回收;

        通过process hacker能查到0x0c成功写入栈空间:

 技术分享图片

shellcode也写入了:

 技术分享图片

内存也改成可执行(这里有个坑,后面会详细解释):

 技术分享图片

   2、(未完待续)

 

 

 

 

 

 

 

 

 

 

 

 

 

参考:

1、https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/getting-started-with-windbg  windbg用户模式调试3环的exe

2、https://blog.csdn.net/lixiangminghate/article/details/53413863 

3、https://blog.csdn.net/andy7002/article/details/72834644

windows:shellcode 远程线程hook/注入(五)

原文:https://www.cnblogs.com/theseventhson/p/13275151.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!