工具:vc 6 windbg
//注意點:下面採用的都是pae分頁(2-9-9-12)
公式:pde = ((dwaddr>>21)<<3) & 0x3ff8 + 0xc0600000 ; //2 + 9
pte = ((dwaddr>>12)<<3) & 0x7ffff8 + 0xc0000000;// 2 + 9 + 9
第一題難點在於計算pde pte
#include
"stdafx.h"
#include
#include
void
judge()
;bool bret;
dword dwpdi;
dword dwpti;
bool readmemory
(out pbyte buffer,in dword dwaddr,in dword dwlength)
while
((dwaddr&
0xfff
+ dwlength)
>
0x1000);
if(bret ==
null)if
(!memcpy
(buffer,
(pbyte)tempaddr,templength)
)printf
("readmemory sucessed\n");
return true;
}void
judge()
;*(pdword)
&buffer[0]
=0x12345678;*
(pword)
&buffer[4]
=0x48
;//呼叫門提權 在windbg裡輸入eq 8003f048 0040ec00`00081090
__asm
printf
(" ret:%x\n"
,bret);}
//test() 顧名思義 彙編指令裡的test
void
__declspec
(naked)
test()
}int
main
(int argc,
char
* ar**)
如果第一題熟悉了那麼第二題就是簡簡單單的掛頁
0x00000000 - 0x0000ffff(可能有錯) 防止空指標 我們掛上物理頁就可以訪問了
#include
"stdafx.h"
#include
#include
void
judge()
;dword dwselfpte;
dword dwtargetpte;
void
callgate()
;*(pdword)
&buffer[0]
=0x12345678;*
(pword)
&buffer[4]
=0x48
; __asm
}void
__declspec
(naked)
test()
}int
main
(int argc,
char
* ar**)
for(
int i =
0;i <
100;i++
) dwselfpte =((
(dword)parr>>12)
<<3)
&0x7ffff8
; dwselfpte +
=0xc0000000
; dwtargetpte =
((dwaddr>>12)
<<3)
&0x7ffff8
; dwtargetpte +
=0xc0000000
;printf
("parr:%x dwaddr:%x\n"
,parr,dwaddr)
;printf
("dwselfpte:%x dwtargetpte:%x\n"
,dwselfpte,dwtargetpte)
;callgate()
;for
(int j=
0;j<
100;j++
)getchar()
;return0;
}
保護模式階段測試
說說思路吧,如果給出的線性位址 讀取的長度沒有超過0x1000。那麼這種情況很好處理,判斷pde和pte的p都為1就行了 readpageattr.cpp 定義控制台應用程式的入口點。呼叫門描述符 eq 8003f048 0041ec00 00081087 include stdafx.h incl...
進入保護模式
本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...
進入保護模式
以下圖2,圖4和圖5截自intel手冊 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選fl...