首页
社区
课程
招聘
[求助]ring0返回到ring3 Cs:eip的无效问题
发表于: 2011-9-17 13:28 10890

[求助]ring0返回到ring3 Cs:eip的无效问题

2011-9-17 13:28
10890
bingleAA!bingle+0x3e:
f87fc05e cf              iretd
kd> kv
ChildEBP RetAddr  Args to Child              
b2473dc8 00401058 0000001b 00000303 0012ff14 bingleAA!bingle+0x3e (FPO: [Non-Fpo]) (CONV: stdcall) [c:\编程\bingleaa\bingleaa\driver.cpp @ 46]
WARNING: Frame IP not in any known module. Following frames may be wrong.
b2473dcc 00000000 00000303 0012ff14 00000023 0x401058

求助,中断历程从内核返回用户空间的时候是调用的 iretd还是sysexit呀?
还有就是如上图,假如是调用的iretd ,那么为什么没法返回,用户空间的线程结束。。从内核返回用户空间的ip = cs(0x1b):eip(0x401058)也是无效的(错误就在于此),怎么解决呀?   难道是线程不能从级别高的ring0往级别低的ring3执行?  那么系统的很多调用是怎么返回的呀???  为什么系统调用会正常返回用户空间。。求解呀

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
2
中断还是sysentry

中断的返回现场是需要自己保存和恢复的

sysentry,貌似sysexit就好~
2011-9-17 13:51
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
是使用 iret 没错

调用中断是会依次压入 eflags,cs 和 eip,返回时依次弹出 eip,cs 和 eflags

你查看一下,执行 iret 指令时的 stack 这些要素是否正确,是否有效
2011-9-17 14:39
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
4
右边的windbg窗体中的dd esp显示的就是堆栈,以此从高到低是ss,esp,eflags,cs,eip,ebp   这些寄存器。。。。问题是在
kd> kv
ChildEBP RetAddr  Args to Child              
b2473dc8 00401058 0000001b 00000303 0012ff14 bingleAA!bingle+0x3e (FPO: [Non-Fpo]) (CONV: stdcall) [c:\编程\bingleaa\bingleaa\driver.cpp @ 46]
WARNING: Frame IP not in any known module. Following frames may be wrong.
b2473dcc 00000000 00000303 0012ff14 00000023 0x401058
的这一句上:WARNING: Frame IP not in any known module. Following frames may be wrong.  它说找不到应用层的模块。堆栈正常吧? ??  我想参看系统本身的,可是又kd查看系统中断权限也在ring3的中断历程,太复杂,看不懂。。
上传的附件:
2011-9-17 15:08
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
5
是应用层调用的中断,怎么保存和返回呀,求指导。。。
2011-9-17 15:09
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
你的dd esp 不是显示:

b21a7dc8 0012ff80 0040102a 0000001b 00000212

后面的 0040102a 才是 eip 值
2011-9-17 15:22
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
中断不需要自己保存,是cpu 自动做的

另:是 sysenter 不是 sysentry
2011-9-17 15:24
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
应用层尽管使用 int 调用就行了,不用管它怎样返回
2011-9-17 15:25
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
中断处理函数出现修改XX,不就完蛋鸟~所以一般都要做个保存的比如中断XX
pushad
pushfd
push ds
push es
push fs
push eax
mov eax, 0x23
mov ds, ax
mov es, ax
mov eax, 0x30
mov fs, ax
pop eax
call kernelprocForInt
pop fs
pop es
pop ds
popfd
popad
iretd
2011-9-17 15:34
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
10
[QUOTE=天高;1001125]你的dd esp 不是显示:

b21a7dc8 0012ff80 0040102a 0000001b 00000212

后面的 0040102a 才是 eip 值[/QUOTE]
dd完esp后,地址从高到低依次是ss,esp,eflags,cs,eip,ebp 那个栈我跟踪过od,在执行int 0x24前,是被压入堆栈的。。  我知道0x40102a是eip,但是我不明白的是从ring0怎么返回到ring3呀,也就是不从0x40102a开始执行。。。并且我发现中断历程执行完毕后应用层原来的线程自动结束了。。

我纠结的是为什么ring0回不到ring3,为什么不从0x40102a继续执行,而是线程退出了,0x40102a这个地址应该是用户层哪个进程空间的???

我想的是在ring0中执行完毕后,处理器不知道0x40102a是哪个模块的,所以,线程退出了。。有和我看法一样的吗? 那既然如此,怎么解决,也就是告诉系统应该继续在哪个进程空间的0x40102a继续执行。。

再发一遍那句话:kv 后kd提示的   WARNING: Frame IP not in any known module. Following frames may be wrong.
2011-9-17 15:53
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
11
寄存器保存的很全面,但是还是老样子。。int 0x24中断发生后,这句话后边的代码便不再执行了,程序一闪而退(win32控制台程序);
2011-9-17 16:06
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
12
可是应用层的程序自动退出了呀,哎呀!!!呵呵
2011-9-17 16:08
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
13
int 0x24中你做了什么~

如果你什么不做直接返回不会发生问题
2011-9-17 16:27
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
14
就是啥没做呀。。kdprint输出了一下。。然后直接返回的。。  能不能你写一下,然后试一下呀。。嘿嘿。。分享给我代码。。我比较一下。。能知道你的qq吗
2011-9-17 16:50
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
15
好开心,找到原因了。。  刚发现在中断历程内部调用打印函数就出错。。不使用就ok。。我刚弄好的。。。没想到是这个原因。。太那啥了。。   至于为什么添加了打印函数或者系统函数就不能正常返回了,我也不明白。。 以后自己注意,提醒大家注意。。嘿嘿
貌似网上很多例子都在中断历程中调用打印函数,哎。。想到一句话,纸上得来终觉浅,觉知此事要躬行呀!!!
2011-9-17 17:07
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
16
如这样
void ppint()
{
 KdPrint("int ok!\n");
}

volatile
  __declspec(naked)
  VOID
  MyInt()
{
  __asm
  {
        pushad
        pushfd
        push ds
        push es
        push fs
        push eax
        mov eax, 0x23
        mov ds, ax
        mov es, ax
        mov eax, 0x30
        mov fs, ax
        pop eax
        call ppint
        pop fs
        pop es
        pop ds
        popfd
        popad
        iretd
  }
} 
2011-9-17 17:11
0
雪    币: 668
活跃值: (2597)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
17
谢谢   嘿嘿
2011-9-17 20:47
0
游客
登录 | 注册 方可回帖
返回
//