好友
阅读权限30
听众
最后登录1970-1-1
|
本帖最后由 BeneficialWeb 于 2019-9-2 15:15 编辑
工具:VMMWare vs2017, WinDbgPrew,PCHunter64
平台:win7x64虚拟机
声明:本次实验是基于周壑大佬的视频自学而成。
实验目的:主要是观察ring3进ring0的权限变化,观察寄存器的变化
实验步骤:
1.通过双机调试构造int 20号中断处理例程
2.编写代码读取两个环境下的寄存器
3.观察实验结果
[Asm] 纯文本查看 复制代码 .data
EXTERN g_rbp:DQ
EXTERN g_rax:DQ
EXTERN g_rcx:DQ
EXTERN g_rbx:DQ
EXTERN g_rdx:DQ
EXTERN g_rsi:DQ
EXTERN g_rdi:DQ
EXTERN g_rsp:DQ
EXTERN g_cs:DW
EXTERN g_fs:DW
EXTERN g_ds:DW
EXTERN g_ss:DW
EXTERN g_gs:DW
EXTERN g_es:DW
.code
IdtEntry PROC
mov [g_rax+8],rax
mov [g_rbx+8],rbx
mov [g_rcx+8],rcx
mov [g_rbp+8],rbp
mov [g_rsi+8],rsi
mov [g_rdi+8],rdi
mov [g_rsp+8],rsp
mov [g_rdx+8],rdx
mov word ptr [g_cs+2],cs
mov word ptr [g_ds+2],ds
mov word ptr [g_ss+2],ss
mov word ptr [g_fs+2],fs
mov word ptr [g_es+2],es
mov word ptr [g_gs+2],gs
iretq
IdtEntry ENDP
go PROC
mov [g_rax],rax
mov [g_rbx],rbx
mov [g_rcx],rcx
mov [g_rbp],rbp
mov [g_rsi],rsi
mov [g_rdi],rdi
mov [g_rsp],rsp
mov [g_rdx],rdx
mov word ptr [g_cs],cs
mov word ptr [g_ds],ds
mov word ptr [g_ss],ss
mov word ptr [g_fs],fs
mov word ptr [g_es],es
mov word ptr [g_gs],gs
int 20h
ret
go ENDP
END
[C] 纯文本查看 复制代码 #include<stdlib.h>
#include<stdio.h>
#include<Windows.h>
extern VOID IdtEntry();
extern VOID go();
DWORD64 g_rax[2], g_rbx[2], g_rcx[2], g_rdx[2], g_rbp[2],g_rsi[2],g_rdi[2],g_rsp[2];
WORD g_cs[2], g_ds[2], g_ss[2], g_es[2], g_fs[2], g_gs[2];
void main()
{
// r idtr
// dp fffff80000b95080 l42
// ep fffff800`054e9280 4000ee00`00101200 00000000`00000001
if (IdtEntry != 0x140001210)
{
printf("error address:%p\n", IdtEntry);
exit(-1);
}
go();
printf("rax:%p\r\nrbx:%p\r\nrcx:%p\r\nrdx:%p\r\nrbp:%p\r\nrsp:%p\r\nrsi:%p\r\nrdi:%p\r\n", g_rax[0], g_rbx[0], g_rcx[0], g_rdx[0], g_rbp[0], g_rsp[0], g_rsi[0], g_rdi[0]);
printf("cs:%04x\r\nds:%04x\r\nss:%04x\r\nes:%04x\r\nfs:%04x\r\ngs:%04x\r\n", g_cs[0], g_ds[0], g_ss[0], g_es[0], g_fs[0], g_gs[0]);
printf("\n");
printf("rax:%p\r\nrbx:%p\r\nrcx:%p\r\nrdx:%p\r\nrbp:%p\r\nrsp:%p\r\nrsi:%p\r\nrdi:%p\r\n", g_rax[1], g_rbx[1], g_rcx[1], g_rdx[1], g_rbp[1], g_rsp[1], g_rsi[1], g_rdi[1]);
printf("cs:%04x\r\nds:%04x\r\nss:%04x\r\nes:%04x\r\nfs:%04x\r\ngs:%04x\r\n", g_cs[1], g_ds[1], g_ss[1], g_es[1], g_fs[1], g_gs[1]);
system("pause");
}
实验结果:
结果分析验证:
应该是没问题了。
总结:
在实验中学习保护模式,就不那么枯燥无聊了。
|
免费评分
-
查看全部评分
|