看流星社区

 找回密码
 注册账号
查看: 5270|回复: 10

未导出SSDT函数查找方法

[复制链接]

该用户从未签到

发表于 2011-8-7 13:52:50 | 显示全部楼层 |阅读模式
未导出SSDT函数的查找方法
   
    今天,我想要写一篇关于从用户模式查找未导出的内核函数地址的文章, 这技术是我原创的, 我想到这个方法是在一个关于Windows x86 kernel exploitation的讨论中,
    呵..先不管了, 我无法保证在我之前有人用过这方法, 切入正题吧...
        
    系统内核的实际漏洞利用的主题或它的模块之一太广泛了要完全在这里讨论它, 这样的漏洞使用方面的技术在之前就被一些研究人员描述过,
            * Kernel-mode Payloads on Windows
            * Remote Windows Kernel Exploitation – Step into the Ring 0
            * How to exploit Windows kernel memory pool
    一个基本问题是...新手通常对内核漏洞逆向的的潜在遭遇,是在实际中如何走捷径,当这漏洞可以让你在内核执行一个你自己的代码时,
    创建一个相对稳定的环境,实际上..我们想要实现的每一个功能,都需要一些扩展的内核函数,通常这些函数99%都在ntoskrnl.exe,
   
    接下来的步骤是,我们先创建一个可以获取我们要使用函数的虚拟地址的全功能PayLoad,在一种很简单的情况,我们之需要对导出的函数进行操作,
    我们需要的是解析内部PE结构的方法,几行代码就可实现,通用的方法是对函数进行HASH运算,把函数名转换成一个DWORD值,HASH算法我们可以用
    简单的位移操作,
        01.; ASSUMPTIONS: ESI = string to hash (input)
        02.;              EAX = return value (output)
        03.;
        04. GenerateNameHash:
        05. xor eax, eax              ; Zero out the EAX (hash) value</p>
        06. @HashLoop:
        07. rol eax, 13               ; Rotate left by one
        08. xor al, byte [esi]        ; Xor with the current char
        09.
        10. inc esi                   ; Increment pointer
        11. cmp byte [esi], 0         ; Check if NULL
        12. jnz @HashLoop             ; If not, carry on
        13. ret                       ; EAX is already set, we have nothing to do - return
    我们可能不需要函数结果的多余的16位,可以节省下内存,我们通常想要把Payload的代码降低到绝对小的体积,总而言之我们现在只想
    访问内核镜像公开的可用地址,这不是很困难,更有趣的是可以去搜索一个内核函数,没有被内核导出的,我们尽量使用比较拉风的方法,
    这主要根据实际操作系统的版本,
        
    函数在一个SSDT的数组里,包含一些通过用户CALL触发的不同种类的系统调用的指针,它们在创建一些高级R0 Payload时非常有用,
    在驱动里获取SSDT函数的地址很简单,倘若我们知道一个Call's ID,那么我们唯一的问题是如何得到系统版本,为了区配相应的函数号,
    我写了一个程序设计概述:
        
    加载ntoskrnl.exe到我们的进程上下文,因为再以后我们会广泛使用它,然后我们要轻松的引用导出函数的本地地址,因此我们要计算所有
    函数的偏移,以实际内核基址为基础,由于我们不需要把它当作一个典型的DLL库处理,我们必须确保没有不必要的操作被执行(比如调用它的
    DllMain()),但又要加载它到内存,呵,感谢微软给了一个LoadLibraryEx()函数,我们用DONT_RESLOVE_DLL_REFERENCES标志去调用它,
    就可以跳开侧面影响了,
        
    第一种选择,可以在SSDT内轻松的查找指定函数,和内核导出列表,比如(i.e.NtCreateFile, NtCreateEvent, NtConnectPort, NtClose.)
    这功能是很拉风的,因为我们知道了在内核里的内存的精确地址(基于实际的ntoskrnl.exe的镜像基址),我们还可以指定任何其他的SSDT函数地址,
    倘若我们知道SyscallID号(可以动态获取).
     
游客,如果您要查看本帖隐藏内容请回复

该用户从未签到

发表于 2012-8-30 15:32:30 | 显示全部楼层
看看是什么

该用户从未签到

发表于 2013-2-11 17:46:16 | 显示全部楼层
5655555555555555555555555555555555555555555555555555555555

该用户从未签到

发表于 2013-9-28 12:13:50 | 显示全部楼层
照你这么说真的有道理哦 呵呵 不进沙子馁

该用户从未签到

发表于 2014-10-6 08:00:02 | 显示全部楼层
回复 1# Consefour

该用户从未签到

发表于 2015-10-19 21:21:59 | 显示全部楼层
3333333333333333333333

该用户从未签到

发表于 2019-3-28 14:53:24 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!

该用户从未签到

发表于 2019-3-28 18:07:45 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!

该用户从未签到

发表于 2019-3-28 18:11:19 | 显示全部楼层
支持楼主,支持看流星社区,以后我会经常来!

该用户从未签到

发表于 2019-6-25 18:45:33 | 显示全部楼层
6666666666
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-29 19:48

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表