首页
论坛
课程
招聘
[求助]Vt Ept hook中,开启MTF位后系统卡死
2020-8-11 23:56 5327

[求助]Vt Ept hook中,开启MTF位后系统卡死

2020-8-11 23:56
5327

问题:开启MTF后,CPU本应回到GuestRip处继续执行代码,却意外的跑到了另外一个不相干的地方,并陷入了死循环,如断线的风筝,再也无法返回到GuestRip处.
(关闭MTF才能回去)

//这条指令既需要执行权限,又需要读取权限
AddressA ff25 00000000 jmp qword [AddressB]
AddressB xxxxxxxx~xxxxxxxx

 

ept hook中 , 因"ff25 00000000 (jmp qword [nexet])"这条指令既需要读权限 , 又需要执行权限,所以产生VmExitEptViolation ,

 

此时给这个页面 读+写+执行的权限 , 然后记录rip值,称为vRip , 并开启了MTF ;

 

之后触发VmExitMTF,取rip值,称为mRip ;

 

比较vRip和mRip的值发现 , 他俩始终不在同一个物理页上 , 此时系统卡死,但windbg可以正常下断 ,.

 

理想状态下,当是在MTF处理函数中,判断当前Rip是否为ff25 00000000指令所在的地址,是的话才将这一个物理页的pte改成只可执行,

 

可实际情况是,这一命题根本不成立,

 

也就是说开启MTF后 , "ff25 00000000"这段代码并没有得到执行 , 而是在执行某些不相关的代码并陷入了死循环.

 

而一旦关掉MTF , 才会正常的去执行"ff25 00000000"指令.

VmExitEptViolation函数部分代码:
//判断是否为因 读写不可读写的页导致的EptViolation
if (data.eptViolation.readAccess || data.eptViolation.writeAccess)
{    
  //判断是否是因为ff25 00000000指令导致的EptViolation
    if(PAGE_ALIGN(UtilVaToPa((void*)rip)) ==  PAGE_ALIGN(UtilVaToPa(phData->hookData->orgFuncAddr)))
    {
        DbgBreakPoint();
        //由于ff25 00000000 hook,导致这条指令同时需要读和执行权限
        phData->hookedPte->fields.readAccess = true;
        phData->hookedPte->fields.writeAccess = true;
        phData->hookedPte->fields.executeAccess = true;
        phData->hookedPte->fields.memoryType = kWriteBack;
        //将MTF位置1
        VmSetMonitorTrapFlag(true);
        //保存Rip
        g_phData[i].violationRip = rip;
    }
}

不知为什么会发生这种情况? 难道开启MTF后,还有其他什么需要注意的吗?


看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (8)
雪    币: 11602
活跃值: 活跃值 (6233)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
hzqst 活跃值 3 2020-8-12 10:43
2
0
FF25同时需要读和执行权限
雪    币: 634
活跃值: 活跃值 (1473)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
FeJQ 活跃值 1 2020-8-12 12:35
3
0
hzqst FF25同时需要读和执行权限
是啊,怎么解决啊
雪    币: 11602
活跃值: 活跃值 (6233)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
hzqst 活跃值 3 2020-8-12 14:12
4
0
FeJQ 是啊,怎么解决啊
mov rax, address
jmp rax
雪    币: 634
活跃值: 活跃值 (1473)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
FeJQ 活跃值 1 2020-8-12 14:40
5
0
hzqst mov rax, address jmp rax
那如果Hook某一处crc检测,他里面也读取当前页,怎么办
雪    币: 11602
活跃值: 活跃值 (6233)
能力值: ( LV9,RANK:270 )
在线值:
发帖
回帖
粉丝
hzqst 活跃值 3 2020-8-12 14:41
6
0
FeJQ 那如果Hook某一处crc检测,他里面也读取当前页,怎么办
那就换个地方hook
雪    币: 0
活跃值: 活跃值 (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_Frank_339890 活跃值 2020-9-28 19:45
7
0
问一下这个问题解决了吗
雪    币: 634
活跃值: 活跃值 (1473)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
FeJQ 活跃值 1 2020-9-29 19:58
8
1
wx_Frank_339890 问一下这个问题解决了吗
没有.改成 
push addressLow
mov [rsp+4],addressHigh
ret
这种方式了
雪    币: 2478
活跃值: 活跃值 (1962)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
~时光荏苒 活跃值 2021-12-12 15:23
9
0
FeJQ 没有.改成 push addressLow mov [rsp+4],addressHigh ret 这种方式了
不错,正在为此头疼,mov rax,address jmp rax,此方法不靠谱会出错
游客
登录 | 注册 方可回帖
返回