吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 22933|回复: 200
收起左侧

[系统底层] [原创]断其粮道——内核级拒绝服务攻击

    [复制链接]
HackerWen 发表于 2020-7-24 12:25
本帖最后由 HackerWen 于 2020-7-25 00:30 编辑

1、何为断其粮道?
古时的军队大体分为两部分,一是前线作战的士兵,二是后方运粮的人员,两者共同组成一个系统,双方配合才能完成作战任务。两者之间保持互相通信,前者就可以派人向后者催粮,后者就可以派人向前者运粮,而这个运粮(通信)的关键就在于粮道,如果被敌军切断,那么前线士兵就无法向后勤人员征求粮食(请求服务),后勤人员也就无法为前线士兵运送粮食(提供服务),此可谓之拒绝服务攻击。

以图示之,前线5万大军因吃不上饭而开始出现军心不稳的情况了。。。
图片1.png


2、应用程序的粮道在哪里?
那么程序有类似的“粮道”吗,有的话在哪里呢?答案就要从3环进0环说起了。
Windows系统下有几个重要的DLL:Kernel32.dll、User32.dll、Gdi32.dll、Ntdll.dll。运行在3环的应用程序不可避免的会使用这些Dll提供的API,而这些API大部分会通过Ntdll.dll进入0环,参考《加密与解密》的第7章的图7.6。
图片2.png

举一个例子来说明这个过程吧!用Windbg和win7 x86双机调试。
Kernel32.dll中的ReadProcessMemory,其代码如下:
图片3.png

其中只有一条jmp指令,跳到一个导入函数里去执行,我们看看该函数是什么:
图片4.png

原来是kernelbase.dll中的同名函数,继续反汇编,在+12附近的位置又调用了一个导入函数:
图片5.png

继续看该导入函数是什么,原来是ntdll.dll中的NtReadVirtualMemory函数:
图片6.png

此时就到了关键的地方了。ntdll.dll中的NtReadVirtualMemory函数非常简单,就4句,非常简单,它的作用是什么呢?
在ntdll.dll中,大部分API也是这样的格式:
[Asm] 纯文本查看 复制代码
mov eax, API索引号
mov edx, 一个地址     ;该地址里的值是一个函数地址
call [edx]                     ;调用这个函数,实现进入0环
retn 14h


API索引号就是在3环调用了一个API,这个API在内核也就是0环,会有对应的内核函数,这个内核函数的地址在SSDT表中位于某个位置,这个位置就是索引号。进0环后,得找到对应的内核函数进行调用吧,就是根据这个索引号找到的。

一个地址,里面存的值是一个函数地址,反汇编看一下就知道了:
图片7.png

原来这个函数名为KiFastSystemCall,如果CPU支持快速调用的话,那么call [edx]就是call KiFastSystemCall,如果是通过中断门进入0环的话,那么call [edx]就是call KiIntSystemCall。
KiFastSystemCall里的sysenter指令实现进入0环。操作系统在执行这条指令前会把进0环后需要的东西(CS/SS/ESP/EIP)提前准备好,存入一个叫做MSR的寄存器中,等到sysenter指令执行时,就会从MSR寄存器中取出这些值赋给相应的寄存器,其中eip寄存器就得到一个值,这个值就是nt!KiFastCallEntry函数的地址。
图片8.png

那其实就明白了,通过快速调用进0环后的第一个要执行的函数就是KiFastCallEntry。这个函数的作用就是拿着前面传下来的API索引号,获取相应的内核函数,调用之,从而实现应用层想要的功能。
整个过程整理如下:
图片9.png

把其他API的调用过程也画上去,看看整体的流程:
图片10.png

其中的“粮道”我把它选为了Ntdll.dll中的KiFastSystemCall,上图蓝色的线,因为这个函数实现进入0环,3环的API就得通过这个必经之路进入0环。如果把这个必经之路给断了,那岂不是3环API进不了0环,从而0环无法为3环提供服务,这就达到了内核级拒绝服务攻击。还有一个地方也可以选为“粮道”,那就是MSR寄存器,进0环后要执行的函数地址是来源于MSR寄存器中的eip值,所以修改MSR寄存器也可以达到截断“粮道”的目的。

3、截断应用程序的粮道

根据第2节可知,3环进0环的关键函数是Ntdll.dll中的KiFastSystemCall,而且是以下面的形式来对它进行调用的:
[Asm] 纯文本查看 复制代码
mov edx, 7ffe0300
call [edx]                                ;           call KiFastSystemCall


7ffe0300地址里保存了KiFastSystemCall的地址。
其实这里涉及一个名为_KUSER_SHARED_DATA的数据结构,在3环和0环分别定义了一个该结构,其中在3环,这个结构地址固定为7ffe0000;在0环,这个结构地址固定为ffdf0000。这两个结构的内容完全相同,它们偏移+300处的成员名为SystemCall,保存的正好就是KiFastSystemCall函数的地址,所以上面的7ffe0300就是这么来的。看图。
图片11.png

好,既然3环API进0环,要访问7ffe0000+300处的成员,来实现进0环,那么我们把这个成员给改了(改之前拍个快照):
ed 7ffe0000+300 12345678

把7ffe0000+300处的成员,随便改成12345678,那么3环进0环时,就会去12345678地址里去执行,而这个地址肯定是无意义的,看看会发生什么情况,根据我的实验得到:
Windbg首先有动静,问我中断还是忽略
图片12.png
选b的话,Windbg会再次询问我相同的问题,再次选b,就会中断了
图片13.png
此时的栈回溯信息如下:
图片14.png

如果选i的话,步骤和结果如下:
图片15.png

系统跑起来了,问题是,鼠标移到记事本里,会改变形状为插入型,移动到桌面会显示正常的光标,移动到开始菜单处会显示漏洞状,但是均无法点击。向虚拟机发送Ctrl+Alt+Delete键,也是没有反应的。
整个系统就保持这种状态,既不会蓝屏,Windbg也不会继续捕获到异常。
图片16.png
(注:图片是gif格式的,太大了上传不了,看不到动态效果,大家有兴趣的自己做实验就可以看出变化的)

修改ffdf0000+300处的成员也会使系统出现这种现象。以下是修改ffdf0000+300中断后的栈回溯信息。
图片17.png

4、实验结果说明
根据以上的的实验可知,修改进0环的关键位置,使得整个系统发生了无响应而不蓝屏的现象,大概可以解释成:是3环进0环的地方出了问题,而这个进0环的函数又是属于3环的,所以问题发生在3环而不是0环,故系统内核没有崩溃。

7ffe0000+300、ffdf0000+300这两个地方用来耍流氓是挺合适的,发现你对我的程序有分析行为,那我就阻断你进0环的路,你的程序得不到内核的服务,于是什么分析行为都无法进行下去了,这个就是断其粮道的含义。其实对一些函数设置钩子,使其他调用者得不到正确的结果,也可以叫做拒绝服务攻击。

那么怎么对付这个流氓行为呢?从前面的两个栈回溯信息就可以看出端倪。

如果反过来呢?我们在分析的时候,触发了检测代码,从而发生了这种系统无响应而不蓝屏的现象,于是就没有蓝屏文件为我们提供信息,而如果又不知道3环进0环的原理,那么即便是看Windbg的栈回溯信息,也没法对付,所以很可能就想不到是程序的“粮道”出了问题。

代码就不写了,有兴趣的同学可以自己写个驱动,随便检测一个进程,然后修改这两个7ffe0000+300、ffdf0000+300试试,看看有什么效果。

一点思考:系统无响应而不蓝屏,说明用户层废了,而内核还活着,此时我们提前写个驱动打算一直循环干活,那么在系统无响应期间,驱动是否也在工作呢?如果在工作的话,那其他规范化的程序是不是就不能收集我们的种种行为呢?(应用层软件显然无法收集我们的行为了,内核层的驱动一般要和应用层通信,此时无法通信了,功能肯定大打折扣。)
5、参考资料

《加密与解密》
《软件调试》

免费评分

参与人数 131威望 +2 吾爱币 +227 热心值 +107 收起 理由
atom_warhead + 1 谢谢@Thanks!
18319983218 + 1 我很赞同!
chomosuke + 1 + 1 恐怖如斯!感谢用心分享!
jstt552200 + 1 谢谢@Thanks!
yi025 + 1 + 1 我很赞同!
FLY-one + 1 + 1 用心讨论,共获提升!
晨曦牧云 + 1 + 1 用心讨论,共获提升!
嚯嚯嚯000 + 1 + 1 热心回复!
laughingsir38 + 1 + 1 热心回复!
啦啦啦666 + 1 用心讨论,共获提升!
edward_ml + 1 用心讨论,共获提升!
叶一苇 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
一如既往、 + 1 用心讨论,共获提升!
can_moon + 1 热心回复!
5omggx + 1 + 1 谢谢@Thanks!
Songzhiqiang + 1 + 1 太形象了哈哈
MUMUAA + 1 + 1 我很赞同!
10096ljr + 1 + 1 我很赞同!
lemon__star + 1 + 1 我很赞同!
Han0416 + 1 + 1 我很赞同!
abondon + 1 用心讨论,共获提升!
zqguang3708 + 2 + 1 太强了/赞
ales_lee + 1 + 1 我很赞同!
执着№ + 1 + 1 我很赞同!
Conngas + 1 用心讨论,共获提升!
筱原明里 + 1 + 1 用心讨论,共获提升!
Zephyrus + 1 + 1 我很赞同!
huige830 + 1 + 1 用心讨论,共获提升!
fushanpupil + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
花の星月123 + 1 + 1 谢谢@Thanks!
夏雨微凉 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
EVANLEE + 1 + 1 我很赞同!
PHILKILIG + 1 + 1 我很赞同!
dioderen + 1 + 1 谢谢@Thanks!
louchen1994 + 1 + 1 我很赞同!
zsq + 1 + 1 谢谢@Thanks!
sd4718789qw + 1 + 1 用心讨论,共获提升!
wodeweiyimpm + 1 我很赞同!
icyzi + 1 + 1 用心讨论,共获提升!
十好小学生 + 1 太强了!!!!
onething + 1 + 1 热心回复!
hero888 + 1 + 1 神!
冥鹿 + 1 热心回复!
BrightMrW + 1 用心讨论,共获提升!
2765245531 + 1 + 1 用心讨论,共获提升!
jgl0301 + 1 + 1 我很赞同!
lyslxx + 1 + 1 我很赞同!
JOKER688 + 1 + 1 谢谢@Thanks!
一星尘 + 1 + 1 666,涨知识了,嗯嗯
Norkie + 1 用心讨论,共获提升!
woditian + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
xh-sister52 + 1 我很赞同!
s9mf + 1 + 1 热心回复!
BrainFlower + 1 + 1 用心讨论,共获提升!
银.桑 + 1 + 1 谢谢@Thanks!
xiaomache + 1 用心讨论,共获提升!
199369 + 1 + 1 我感觉我飘了,我竟然开始看技术贴了
axty + 1 用心讨论,共获提升!
AlanSilence + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
不谙世事的骚年 + 1 + 1 我很赞同!
schedule + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
自由之心 + 2 + 1 热心回复!
Ganlv + 3 我很赞同!
qtp1300 + 1 + 1 用心讨论,共获提升!
Jack.yang + 1 + 1 用心讨论,共获提升!
不怕黑的夜晚 + 1 + 1 我很赞同!
招南 + 1 谢谢@Thanks!
tony舅舅 + 1 + 1 谢谢@Thanks!
leonqp1030 + 1 + 1 用心讨论,共获提升!
haxcode + 1 + 1 用心讨论,共获提升!
战乱夕阳 + 1 + 1 热心回复!
PLAAF + 1 谢谢@Thanks!
魔法少女伊莉雅 + 1 + 1 热心回复!
SkipQWE + 1 + 1 谢谢@Thanks!
poisonbcat + 1 + 1 谢谢@Thanks!
猛男z + 1 + 1 哈哈,没看懂
生有涯知无涯 + 1 + 1 我很赞同!
lmaple0 + 1 + 1 我很赞同!
52pojie666z + 1 + 1 用心讨论,共获提升!
Kendley + 1 热心回复!
不小于3个字符 + 1 + 1 我很赞同!
shen_i + 1 谢谢@Thanks!
zqs5857447 + 1 用心讨论,共获提升!
wyme + 1 热心回复!
blindcat + 1 + 1 用心讨论,共获提升!
zhp_king + 1 用心讨论,共获提升!
兰笙c + 1 + 1 用心讨论,共获提升!
N0exp + 1 + 1 我很赞同!
Joms + 1 + 1 热心回复!
shenjiyuan2hao + 1 + 1 热心回复!
星辰物语呀 + 1 + 1 我很赞同!
w爱 + 1 + 1 我很赞同!
565 + 1 谢谢@Thanks!
酷柠 + 1 用心讨论,共获提升!
dns2018 + 1 热心回复!
fengbolee + 1 + 1 用心讨论,共获提升!
qq5665 + 1 + 1 谢谢@Thanks!
qazwsxlty + 1 + 1 我很赞同!
Desugl + 1 + 1 我很赞同!
Damitte + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| HackerWen 发表于 2020-7-24 13:12
Poner 发表于 2020-7-24 12:42
在深入分析一下  可以提权?

可以继续分析一波,但是我功力不深,哈哈
 楼主| HackerWen 发表于 2020-7-24 23:54
JuncoJet 发表于 2020-7-24 14:38
看了两遍终于是看懂了,改了KiFastCall指针
导致系统死机了

嗯嗯,这个点讲起来和改起来很简单,但是系统只是无响应,而没有蓝屏,说明只是应用层进不了内核层,但内核还活着,所以我还有个想法,写个驱动打算一直循环干活,系统卡住的时候我们的驱动还有没有可能继续运行着?

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
pojieyeah + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

BEASTARS 发表于 2020-7-24 12:28
班长的男人 发表于 2020-7-24 12:41
好好学习了
yy566 发表于 2020-7-24 12:41
很牛 但我是外行 看不懂
Poner 发表于 2020-7-24 12:42
在深入分析一下  可以提权?

免费评分

参与人数 1热心值 +1 收起 理由
冰王子 + 1 我看着也是可以提权。。。。。。。。。。

查看全部评分

唐宋元明清01 发表于 2020-7-24 13:00
大佬牛批
桂花糕乀 发表于 2020-7-24 13:01
收藏 支持
兔耳离 发表于 2020-7-24 13:01
学到了。
 楼主| HackerWen 发表于 2020-7-24 13:13
yy566 发表于 2020-7-24 12:41
很牛 但我是外行 看不懂

保持学习就可以看懂的,都是这么过来的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 19:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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