保护模式终于要入门啦,现在来看看保护模式学习的怎么样。
这次只写第一题:
第一题
// 保护模式阶段性测试.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
PDWORD g_pBuffer;
DWORD g_dwAddr;
DWORD g_dwLegth;
DWORD dwRet = 0;
void __declspec(naked) Test()
{
_asm
{
pushad;
pushfd;
//1.先判断页是否存在
mov ecx,g_dwAddr;
//先拿PDE
mov eax,ecx;
shr eax,0x14; //右移20位0x14=20
mov edx,0xffc; //将低两位置0 0xffc = 1111 1111 1100
and eax,edx; //置0 ,现在eax就成:10-10-12分页的第一个10 *4
sub eax,0x3FD00000; //相当于add eax,0xC0300000
mov eax,dword ptr[eax]; //取到PDE了。
test al,1; //判断最低为p位是否为0
jz p_zero;//如果为0则跳转
//大页就不判断类,因为我还不清楚如果是大页的话,该如何读。
//在判断PTE
shr ecx,0xA;//将地址右移10位
and ecx,0x3FFFFC; //3FFFFCh=11 1111 1111 1111 1111 1100 同上
sub ecx,0x40000000; //相当于add ecx,0xC0000000
mov eax,ecx;
mov ecx,dword ptr[eax];
test cl,1;
jz p_zero;
//在判断是否跨页
mov eax,g_dwAddr;
and eax,0xfff;
add eax,g_dwLegth;
cmp eax,0x1000;
jg double_spread; //跨页
/*//如果既不跨页,也有效,那么可以开始读了
start_read:
mov esi,g_pBuffer;
mov ecx,g_dwAddr;
read_loop:
mov al,byte ptr [ecx]; //从edi指向的地址读取一个字节到al寄存器
test al,al; //判断是否为null,也就是终止
jz end_asm;
//如果不为0
mov byte ptr ds[esi],al;
inc esi;//移动到下一个缓冲区
inc ecx;//移动到下一个字符
jmp read_loop;
*/
mov eax,g_dwAddr;
mov dword ptr ds:[g_pBuffer],eax;
mov edx,3;
mov dwRet,edx;
jmp end_asm;
p_zero:
mov eax,1;
mov dwRet,eax;
jmp end_asm;
double_spread:
mov eax,2;
mov dwRet,eax;
//跨页的读法
xor ecx,ecx;
mov ecx,g_dwAddr;
and ecx,0xFFFFF000;
add ecx,0x1000;
mov eax,ecx;
shr eax,0x14; //右移20位0x14=20
mov edx,0xffc; //将低两位置0 0xffc = 1111 1111 1100
and eax,edx; //置0 ,现在eax就成:10-10-12分页的第一个10 *4
sub eax,0x3FD00000; //相当于add eax,0xC0300000
mov eax,dword ptr[eax]; //取到PDE了。
test al,1; //判断最低为p位是否为0
jz p_zero;//如果为0则跳转
//大页就不判断类,因为我还不清楚如果是大页的话,该如何读。
//在判断PTE
shr ecx,0xA;//将地址右移10位
and ecx,0x3FFFFC; //3FFFFCh=11 1111 1111 1111 1111 1100 同上
sub ecx,0x40000000; //相当于add ecx,0xC0000000
mov eax,ecx;
mov ecx,dword ptr[eax];
test cl,1;
jz p_zero;
xor eax,eax;
mov eax,g_dwAddr;
mov dword ptr ds:[g_pBuffer],eax;
mov edx,3;
mov dwRet,edx;
jmp end_asm;
end_asm:
popfd;
popad;
retf
}
}
//参数说明:
int ReadMemory(OUT DWORD* buffer,IN DWORD dwAddr,IN DWORD dwLegth)
{
//利用调用门提权
g_pBuffer = buffer;
g_dwAddr = dwAddr;
g_dwLegth = dwLegth;
char buff[6] = {0x44,0x33,0x22,0x11,0x48,0x00};
_asm
{
call fword ptr[buff]
}
return 0;
}
int main(int argc, char* argv[])
{
DWORD i = 0x12345678;
DWORD buff;
ReadMemory(&buff,(DWORD)&i,sizeof(DWORD));
printf("dwRet = %dn",dwRet);
if(dwRet == 1)
{
printf("P IS ZERO!n");
}
else if (dwRet == 2)
{
printf("kua Ye, g_pBuffer = %xn",*g_pBuffer);
}
else
{
printf("g_pBuffer = %xn",*g_pBuffer);
}
getchar();
return 0;
}
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...