周壑x64位内核学习 (三)、x64内核之smep和smap
这两个位都在cr4寄存器上
一、SMEP位
不允许0环执行用户层代码页
二、SMAP位
不允许内核权限读写用户代码页
三、实验SMEP
两个文件
x64asm.asm属性:
ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm
$(IntDir)%(fileName).obj
项目属性:
构造中断门描述符挂idt表
idt表中第21个位置没有使用,我们导入自己的中断描述符
!idt
运行代码
我门这里直接蓝屏了,原因是发生了三重错误
这就是SMEP存在的原因
查看cr4的值
修改cr4的值
3改成2即可
再次运行程序
能正常运行且不蓝屏
四、实验(SMAP)
代码
我们运行后,任然会蓝屏,这时候我们可以同时修改smap标志位为0
但还有另一种办法,也就是系统的办法
系统难面也要从用户层读写到特权级
有一条指令叫stac指令,STAC指令相当于Set AC,用于设置AC标志位(eflag),能暂时解除系统的一些保护,包括SMAP保护。
这里我们使用 stac指令测试
代码:
我们挂上idt表,再把smep置零,再次实验,也是成功读取
注意
我们读取 KVASCODE中的代码是没问题的, 但要读text是会发生三重错误的
这是页表隔离机制引起的(KPTI),如果要读取text段的代码,需要修改页属性
目前暂时知道可读区域为 gdt表,idt表和KVACODE
代码如下:
x64asm.asm
main.cpp:
__EOF__

本文作者:_TLSN
本文链接:https://www.cnblogs.com/lordtianqiyi/articles/16057177.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/lordtianqiyi/articles/16057177.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现