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

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

2020-8-11 23:56
7979

问题:开启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后,还有其他什么需要注意的吗?


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (9)
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2020-8-12 10:43
2
0
FF25同时需要读和执行权限
雪    币: 660
活跃值: (1980)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
FeJQ 1 2020-8-12 12:35
3
0
hzqst FF25同时需要读和执行权限
是啊,怎么解决啊
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2020-8-12 14:12
4
0
FeJQ 是啊,怎么解决啊
mov rax, address
jmp rax
雪    币: 660
活跃值: (1980)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
FeJQ 1 2020-8-12 14:40
5
0
hzqst mov rax, address jmp rax
那如果Hook某一处crc检测,他里面也读取当前页,怎么办
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
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
问一下这个问题解决了吗
雪    币: 660
活跃值: (1980)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
FeJQ 1 2020-9-29 19:58
8
1
wx_Frank_339890 问一下这个问题解决了吗
没有.改成 
push addressLow
mov [rsp+4],addressHigh
ret
这种方式了
雪    币: 4856
活跃值: (4383)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
~时光荏苒 2021-12-12 15:23
9
0
FeJQ 没有.改成 push addressLow mov [rsp+4],addressHigh ret 这种方式了
不错,正在为此头疼,mov rax,address jmp rax,此方法不靠谱会出错
雪    币: 124
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
A1v1n 2024-1-23 10:27
10
0
如果你是通过 monitor trap flag = 1 开启的MTF,当 VM-exit 时,Guest-RIP 应该指向的是下一条指令,不是当前引发异常的指令。如果你是通过事件注入的 MTF(VM-entry interruption-information field—event type = 7,vector = 0),则 Guest-RIP 指向引发异常的那条指令。
欢迎指正~
游客
登录 | 注册 方可回帖
返回