(12)调用门阶段测试
1、構(gòu)造一個調(diào)用門,實現(xiàn)3環(huán)讀取高2G內(nèi)存
2、在第一題的基礎(chǔ)上進(jìn)行修改,實現(xiàn)通過fq的方式返回到其他地址
3、在第一題的基礎(chǔ)上進(jìn)行修改,在門中再建一個門跳轉(zhuǎn)到其他地址
要求:代碼正常執(zhí)行不藍(lán)屏
1、構(gòu)造一個調(diào)用門,實現(xiàn)3環(huán)讀取高2G內(nèi)存
這個就是前面課后作業(yè)做過的,沒有什么問題,注意調(diào)用門描述符中的函數(shù)地址要寫對,否則會藍(lán)屏。
#include <windows.h> #include <stdio.h>DWORD dwHigh2GValue;// 該函數(shù)通過 CALL FAR 調(diào)用,使用調(diào)用門提權(quán),擁有0環(huán)權(quán)限 void __declspec(naked) FunctionHas0CPL() {__asm{pushadpushfd// 讀取了GDT表第二項的低4字節(jié)mov eax,0x8003f008mov eax,[eax]mov dwHigh2GValue,eaxpopfdpopadretf // 注意堆棧平衡,寫錯藍(lán)屏} }int main(int argc, char* argv[]) {char buff[6] = {0,0,0,0,0x48,0};__asm{call fword ptr [buff] // 長調(diào)用,使用調(diào)用門提權(quán)}printf("%08x\n",dwHigh2GValue);getchar();return 0; }2、在第一題的基礎(chǔ)上進(jìn)行修改,實現(xiàn)通過fq的方式返回到其他地址
所謂的“fq”,只是一個形象的比喻,意思是不走原來的 RETF,而是修改堆棧中保存的返回地址,跳轉(zhuǎn)到其他地址執(zhí)行。
代碼如下,請根據(jù)自己機器上的函數(shù)地址修改代碼和調(diào)用門描述符。
3、在第一題的基礎(chǔ)上進(jìn)行修改,在門中再建一個門跳轉(zhuǎn)到其他地址
這題的意思應(yīng)該是在裸函數(shù)內(nèi)用另一個調(diào)用門跳到別的函數(shù)。
我在兩個裸函數(shù)里修改了兩個全局變量,以證明確實被調(diào)用了,當(dāng)然,也可以在裸函數(shù)內(nèi)寫一個 INT 3 ,使其在windbg被斷下,這樣也可以證明裸函數(shù)被調(diào)用。
需要注意,從第一個裸函數(shù)跳到第二個裸函數(shù)時,調(diào)用門中的DPL要設(shè)置成0,因為此時裸函數(shù)1的CPL=0.
在0環(huán)中,似乎不能調(diào)用printf,另外,調(diào)用門描述符定義成全局變量時,要用ds段引用。
根據(jù)兩個裸函數(shù)的地址設(shè)置門描述符:
代碼如下:
#include <windows.h> #include <stdio.h>DWORD dwHigh2GValue; // 高2G內(nèi)存 BOOL bFunctionHas0CPL1Called; // 證明裸函數(shù)1被調(diào)用 BOOL bFunctionHas0CPL2Called; // 證明裸函數(shù)2被調(diào)用char gate1[6] = {0,0,0,0,0x48,0}; // 0041ec00`000813A0 char gate2[6] = {0,0,0,0,0x90,0}; // 00418c00`00081690// 該函數(shù)通過 CALL FAR 調(diào)用,使用調(diào)用門提權(quán),擁有0環(huán)權(quán)限 // 004113A0 void __declspec(naked) FunctionHas0CPL1() {__asm{//int 3pushadpushfdmov al,1mov byte ptr ds:[bFunctionHas0CPL1Called],al// 讀取了GDT表第二項的低4字節(jié)mov eax,0x8003f008mov eax,[eax]mov dwHigh2GValue,eaxcall fword ptr ds:[gate2]popfdpopad retf // 注意堆棧平衡,寫錯藍(lán)屏} }// 00411690 void __declspec(naked) FunctionHas0CPL2() {__asm{//int 3pushadpushfdmov al,1mov byte ptr ds:[bFunctionHas0CPL2Called],alpopfdpopadretf} }int main(int argc, char* argv[]) { __asm{call fword ptr ds:[gate1] // 長調(diào)用,使用調(diào)用門提權(quán)}printf("%08x\n",dwHigh2GValue);printf("%d %d\n", bFunctionHas0CPL1Called,bFunctionHas0CPL2Called);getchar();return 0; }總結(jié)
以上是生活随笔為你收集整理的(12)调用门阶段测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (11)调用门提权(有参)
- 下一篇: (13)中断门