oxygen1a1 发表于 2023-9-24 15:56

伪造调用栈,返回地址在正常模块,支持R0,R3

项目地址:https://github.com/Oxygen1a1/callstack_spoof
前言
参考
https://jhinxs.com/x86%E4%B8%8Ex64%E6%A0%88%E5%9B%9E%E6%BA%AF/https://labs.withsecure.com/publications/spoofing-call-stacks-to-confuse-edrs
其实是魔改的下面的这个人的项目 项目里面很多函数的名字可能相同
https://github.com/Barracudach/CallStack-Spoofer
原理
Barracudach的项目很好,我基本都是参考的他的思路(通过模板形参包来达到编译期间才生成shellcode这个思路真实绝了)。
但是他的有一个最大缺陷就是,shellcode(模板编程根据参数不同生成的不同函数就是shellcode,本质上是编译期间生成的各种同名函数,但是可以用作函数的包装器)分配在非模块内。
这是因为他对于R0的处理是ExAllocatePool,对于R3的shellcode是使用VirtualAlloc,最后他达到的效果如下
https://bbs.kanxue.com/upload/attach/202309/935881_MTTADDTF4T3QX5E.webp
可以看到,有一个shellcode作为返回地址,这样的话调用敏感函数,还是会爆炸,毕竟不在正常模块内;
而我的思路是这样的,R0 R3采取不同方法进行查找模块找到一块足够使用的空白内存(除了ntos,win32XX,hal,这样修改会PG),然后写入shellcode(不用担心shellcode作为包装器不适配,前面提到了这个是编译期间根据参数不同生成的不同的shellcode),这样返回地址就是正确的了;
最后达到的效果如下(R0),可以发现,返回地址是位于ci.sys的一个地址,当然这是代码随机找的,也有可能在beep.sys,总之任何有空位的地方,都有可能当作返回地址
https://bbs.kanxue.com/upload/attach/202309/935881_J9FNREUQTKEVPHU.webp
项目地址:https://github.com/Oxygen1a1/callstack_spoof

sam喵喵 发表于 2023-9-24 16:54

感谢大佬,有空下载拜读!!
页: [1]
查看完整版本: 伪造调用栈,返回地址在正常模块,支持R0,R3