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