[2022]Syscall的一些解释 huoji syscall 2022-11-04 811 次浏览 6 次点赞 写个记录在这,这样以后还有不懂的朋友就能看这个了 ### syscall的实现原理 syscall不是什么魔法指令. 他也不能让你的程序免杀(所以不要说这个拌面就能免杀了).他只是个r3跟r0交互的指令.所有ntdll/win32ku的东西最底层的Zw*开头的函数到最后就是syscall.正常程序也在用syscall.!!!! 唯一不同的是你用syscall可以绕过r3的hook.但是r0的hook/回调依然能监控到你! 具体可见: https://key08.com/index.php/2022/11/04/1654.html syscall没出现之前进内核的方法是由int完成的 amd64上syscall本质上是改了fmask,rip,cs到msr 0xc000082里面记录的ip ![微信图片_20221104165705.png](https://key08.com/usr/uploads/2022/11/1206944151.png) 这是syscall的微码 ![微信图片_20221104165731.png](https://key08.com/usr/uploads/2022/11/2411195743.png) 实际上关键是这个 rip = msr lstar 也就是 0xc000082.这个在windows初始化的时候 这里面的值 是kisystemcall64 ![](https://key08.com/usr/uploads/2022/11/4186720024.png) ### 一些应用 漏洞: CVE-2018-8897 https://key08.com/index.php/2021/03/13/968.html > kisystemcall64第一行代码是 swapgs ,swapgs的意思是 把本来的GS交换成KPCR.这种设计一般来说挺完美的 没啥问题 不过问题出在了cpu的一个特性上 当出现段寄存器操作的时候,mov和pop等,都会发出一个中断,但是中断会在下一个指令执行完毕后才触发,这个是intel CPU设计的一个特性,而CVE-2018-8897就是利用这个特性在下一个指令面前加一个硬件断点 下一条指令是int3 int3在内核中会交换gs,然后此时R3的硬件断点就会被处理,并且交给R3的异常处理程序,这个时候我们就可以操作KPCR的内容从而R3直接进入内核. hips: efer hook 通过设置efer这个msr,让syscall产生UD.自己hypervisor再接管UD异常,手动模拟syscall指令,实现syscall指令的hook而不用再接管msr_lstar 因为win10后那个地方成KVA SHADOW的page了是插入不了代码的 本文由 huoji 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。 点赞 6
还不快抢沙发