|
|
|
|
|
|
|
Windows内核
帖子发起人: Alex.xu 发起时间: 2009-09-03 15:28 下午 回复: 7
|
帖子排序:
|
|
|
|
2009-09-03, 15:28 下午
|
Alex.xu
注册: 2009-07-23
发 贴: 21
|
<软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
hi 各位牛人,
问题如题, 我感觉ring 3下也可以使用这个汇编指令? 不知道是作者的失误还是我的问题.
thanks
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-03, 17:31 下午
|
王宇
注册: 2007-05-08
发 贴: 306
|
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
楼主没错~
SIDT is only useful in operating-system software; however, it can be used in application
programs without causing an exception to be generated.
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-03, 17:45 下午
|
Alex.xu
注册: 2009-07-23
发 贴: 21
|
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
谢谢 王宇~~
随便问一下, 有没有办法可以让用户态程序读取内核保护模式下的数据?
因为我用sidt找到了IDT的地址,我想把它的所有信息拷贝出来.
希望给个思路
能不能将自己的程序跳入系统ring 0
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-03, 17:58 下午
|
MJ0011
注册: 2008-04-24
发 贴: 112
|
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
sidt当然可以在RING3下使用。
如果要从用户态读取内核态保护模式的数据,可以用ZwSystemDebugControl或PhysicalMemory的方法来获取。
也可以使用某种方式给GDT添加一个CALLGATE,然后CALL CALLGATE,让程序跳入RING0执行
这是我常用的一个代码:
void AddCallGate()
{
ULONG Gdt_Addr;
BYTE CallGateData[0x10];
ULONG Icount;
__asm
{
pushfd
pushad
push edx
sgdt [esp-2]
pop edx
mov Gdt_Addr,edx
push 0xc3
push Gdt_Addr
call WriteMemory
;write the call gate type
mov eax,Gdt_Addr
mov word ptr[CallGateData],ax
shr eax,16
mov word ptr[CallGateData+6],ax
mov dword ptr[CallGateData+2],0x0ec0003e8
mov dword ptr[CallGateData+8],0x0000ffff
mov dword ptr[CallGateData+12],0x00cf9a00
;fill the call gate data
xor eax,eax
LoopWrite:
movzx edi,byte ptr CallGateData[eax]
push edi
mov edi,Gdt_Addr
add edi,0x3e0
add edi,eax
push edi
mov Icount,eax
call WriteMemory
mov eax,Icount
inc eax
cmp eax,0x10
jnz LoopWrite
popad
popfd
}
}
void IntoR0(PVOID function)
{
WORD Callgt[3];
Callgt[0] = 0;
Callgt[1] = 0;
Callgt[2] = 0x3e3;
__asm
{
call fword ptr[Callgt]
mov eax,esp
mov esp,[esp+4]
push eax
call function
pop esp
push offset ring3Ret
retf
ring3Ret:
nop
}
return ;
}
调用IntoR0(你要执行的跳RING0代码函数地址)即可。
当然也可以使用一些kernel mode memory disclose 0day
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-03, 18:20 下午
|
Alex.xu
注册: 2009-07-23
发 贴: 21
|
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
谢谢了, 虽然看不太懂(汇编很烂)~~
但是大致是理解了,就是加了一个中断门,然后自己手动触发该中断,这时候就进入ring 0 了.
当我的程序进入ring 0 了之后是不是意味着,我可以随便读取内核内存了?
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-03, 19:06 下午
|
王宇
注册: 2007-05-08
发 贴: 306
|
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
我以前喜欢用 NtSystemDebugControl 虽然它基本会被拦
代码参考 randnut 的
PhysicalMemory 也一样
代码参考 Mark 的
Call Gate 可供参考的更多
我还看过吴岩峰前辈放出的一段演示代码 也很强大
最后
王道还是 kernel mode memory disclose 0day
嘿嘿~~
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-04, 09:46 上午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
是的,这里疏忽了,原话是LIDT和SIDT指令......,应该不包括SIDT。
在早期的手册中,关于这条指令的描述是:
SGDT and SIDT are used only in operating system software; they are not used in application programs.
后来改成王宇引用的样子。
本来是不希望应用层使用的,但是“希望”没管什么用......
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2009-09-05, 11:33 上午
|
Alex.xu
注册: 2009-07-23
发 贴: 21
|
Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
多谢各位前辈了~~
以前自己太俗了,一直在搞游戏开发,搞服务器开发,以为已经够底层了。后来,李建忠老师给我们做了一个培训,让我学会了从底层思维考虑问题。加上最近两年都在用windbg分析解决问题,让我体会到底层真的好美。为什么以前没有关注呢。
最近在看 linux内核和window internal5还有张老师的 软调。真的很难啃,个人感觉每本书侧重点都不同,而且不是每个点都非常深入(please correct me if I am wrong),还得求助各位牛人 希望自己能够坚持到底~~
上次还碰到一个问题:
就是全页堆模式下使用heap -s查看内存块的问题。为什么vista下面始终输出不了?难道需要打开某些参数? 因为我明明创建了1.5G的内存。但是heap -s看不到任何相关的堆信息。让我很诧异。但是我明明在XP下面测试成功过了。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 内核探秘 » Windows内核 » Re: <软调> p274页, sidt指令只能运行在保护模式的ring 0权限下,是不是写错了?
|
|
|
|
|
|