日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

(12)调用门阶段测试

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (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,而是修改堆棧中保存的返回地址,跳轉到其他地址執行。
代碼如下,請根據自己機器上的函數地址修改代碼和調用門描述符。

#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,eax// 修改返回地址,跳轉到Exit函數執行mov eax,0x4113eemov [esp+0x24],eaxpopfdpopad retf // 注意堆棧平衡,寫錯藍屏} }void Exit() {printf("bye!\n");ExitProcess(0); }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; }

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)调用门阶段测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。