发布于 2020-05-09 09:23:39
听起来,您可能已经弄清楚了到底发生了什么(不过,我必须查看所讨论的代码,最好是在调试器中运行)。然而,我想指出的是,这实际上根本行不通。充其量,这是一个速度碰撞,将打破脆弱的有效载荷,但一个知识渊博的攻击者可以轻易绕过它。这里有几种方法,在大致上增加了复杂性:
LoadLibraryW或LoadLibraryExA (除非在某个时候内部调用LLA,但我对此表示怀疑)。WriteProcessMemory (WPM)和VirtualProtectEx (VPX)以攻击者版本的函数作为模板,使用un LLA。VirtualAllocEx将LLA的二进制代码写入目标进程,并在该入口点注入线程。换句话说,即使您的钩子阻止将CreateRemoteThread调用到LLA的地址,通常它也不会对DLL注入做任何重要的操作。
发布于 2020-05-09 07:46:02
我睡了一夜,找到了答案。有两个原因:
攻击模块使用LoadLibraryA查找GetProcAddress地址。这是基于这样的假设,即两个进程之间的地址是相同的,这恰好是kernel32.dll中函数的情况。但是,由于只有防御进程的IAT是连接的,攻击模块的IAT仍然具有原始LoadLibraryA调用的地址。
但除此之外,我还在我的防御模块中测试了GetProcAddress的行为,它在连接LoadLibraryA之前和之后都返回相同的地址。从这一点我只能推断出GetProcAddress的实现方式,它除了搜索IAT之外还有其他的方法。
https://security.stackexchange.com/questions/231324
复制相似问题