好友
阅读权限20
听众
最后登录1970-1-1
|
魔弑神
发表于 2021-9-27 10:38
本帖最后由 魔弑神 于 2021-9-27 10:40 编辑
众所周知在AMD64环境上,32的程序,我们可以使用CS段切换至x64环境,可以执行x64指令 0x33段选择器(天门) - 恶意软件技术 (malwaretech.com)
当然切换环境后,也是能在调试器里正常工作的,如果手动中断在环境里,调试器引擎可能需要支持x64指令,否则无法正常工作
那么我们正常运行,应该怎么样才能被检测呢, 这就要说个特殊的指令,int3 int 3 (KiBreakpointTrap)
为什么说是特殊呢,因为配合切cs可以达到出其不意的效果
在正常环境下 切cs后使用int3,会得到一个STATUS_BREAKPOINT异常,如果没有注册异常接管,会崩溃。
如果在不支持(x64引擎)的调试器里运行,则什么都不会发生,但STATUS_BREAKPOINT异常依旧会有,内核会分发这个异常 但调试器好像不会接收到这个异常,程序正常工作
至于为什么会发生这个情况 一个是调试器汇编引擎的问题,(可能)以及int3的特性 ContextFrame.Rip -= 1; ,两个集中一起就会发生这种情况
当然像ICEBP UD2等指令不会发生这种情况
[Asm] 纯文本查看 复制代码 push 0x33
call Label1
Label1:
add dword [esp], 0x05
retf
int3
call Label2
Label2:
mov dword [esp+0x04], 0x00000023
add dword [esp], 0x0D
retf
测试调试器: x32dbg,OllyDbg,windbg。 都会引发这种情况
关于反制的方法目前有更换调试器引擎
内核处理要判断cs环境
(SegCs & 0xfff8)== 3 * 16 && WoW64Process != NULL
即可
更新内容:其实就是内核分发异常的时候没有判断wow64执行x64代码,从而没有对齐堆栈地址,引发后续的一系列问题
x64 Rsp =Rsp ;
wow64 Rsp =Rsp & 0xfffffff0UI64;
欢迎评论探究,我只是大概的分析
来自我博客的一篇文章 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|