Windows內核實驗

說明css


教程是周壑老師在 B 站的 windows 內核實驗系列視頻,這只是筆記,不是教程,你們想要學習能夠去 B 站找視頻看
nginx


B 站空間連接:web

https://space.bilibili.com/37877654
swift


windows內核實驗第一集:segmentfault

https://www.bilibili.com/video/av35033387windows






實驗環境配置api






雙機調試配置
一、虛擬機添加串口:
   
   
   
    
    
             
    
    
\\.\pipe\com_1


打開虛擬機的 C 盤下的 boot.ini,添加以下內容:
   
   
   
    
    
             
    
    
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional Debug" /noexecute=optin /fastdetect /debugport=COM1 /baudrate=115200


建立一個 windbg 的快捷方式,快捷方式目標中添加如下內容:
   
   
   
    
    
             
    
    
D:\anquan\CTF-tools\RE\windbg\windbg_cn_6.11.0001.404.exe -b -k com:pipe,port=\\.\pipe\com_1,baud=115200,resets=0 -y SRV*D:\anquan\symbol*http://msdl.microsoft.com/download/symbols

上面的部份內容要根據本身的狀況更改一下

這是 windbg 所在目錄
   
   
   
    
    
             
    
    
D:\anquan\CTF-tools\RE\windbg\windbg_cn_6.11.0001.404.exe

這是符號路徑,聯網的時候會下載在這個路徑裏
   
   
   
    
    
             
    
    
D:\anquan\symbol







實驗 1:中斷提權微信







一些 windbg 命令
   
   
   
    
    
             
    
    
r eax
就是看一下 eax 的內容

   
   
   
    
    
             
    
    
dq 地址 L140
查看地址的內容,後面跟的一個 L 能夠查看的長度,也就是 range

   
   
   
    
    
             
    
    
eq 8003f500 0040ee00`00081000
把 0040ee00`00081000 寫到 8003f500 的地方

實驗部分
使用命令
   
   
   
    
    
             
    
    
r idtr
 查看中斷描述表寄存器,找到中斷表的位置
idt 是中斷描述表,idtr 就是中斷描述表寄存器,用來記錄 idt 在什麼地方


獲得:idtr=8003f400

使用 
   
   
   
    
    
             
    
    
dq 8003f400 -L40
 查看中斷描述表


會看到 80548e00`000831a0 等這些差很少的,其實真正的是兩邊的 8 個,805431a0,中間的是一些屬性,後面再說

咱們要作的就是:用程序寫一個函數,他會去觸發中斷,一旦執行中斷以後就能夠執行異常,異常的處理地址是咱們能夠用 windbg 的 eq 命令寫入的,觸發異常以後就能夠執行高權限的命令了

具體作法是構造一個裸函數,這個裸函數是咱們用來執行高權限代碼的地方,這個函數的入口就是 401000

使用 
   
   
   
    
    
             
    
    
eq 8003f500 0040ee00`00081000

把 00401000 寫到 8003f500 的地方
(這裏注意應該是 ee00 而不是 8e00,不然用戶態的進程是無法訪問的,ee 與 e8 的區別是 ee 容許用戶態來觸發,而 e8 只容許內核態


好比普通的 int 3 斷點,直接在代碼裏面就能夠執行,它的前半部分是 ee00,若是是 e800 的就不行


寫一個函數,把函數的地址塞到向量表裏面,使用裸函數
然而每次運行地址都是不同的,在屬性裏面把隨機地址關了填上一個固定地址

   
   
   
   
    
    
             
    
    
#include<stdio.h>#include<stdlib.h>#include<Windows.h>DWORD g_temp=0;void _declspec(naked) IdtEntry()//這是一個裸函數,它的入口是401000{ _asm{ mov eax,dword ptr ds:[0x8003f014] mov g_temp,eax iretd }}void go()//用來觸發異常的{ _asm int 0x20/*這個地方,涉及到屬性了,要是 int 3 的話,由於屬性 ee00 是容許 ring 3 也就是用戶訪問的,因此會提示觸發了一個斷點,若是是 int 0 的話就屬於你是用戶態卻想訪問內核態的東西 8e00,會報錯,當正常出現這個異常的時候是由硬件訪問這個地址的 */}void main(){ if((DWORD)IdtEntry != 0x401000) { printf("%p\n",IdtEntry); exit(-1); } go(); printf("%p\n",g_temp); system("pause");}

tips:
若是在 XP 上顯示不是有效的 win32 => 右鍵項目 => 屬性 => 配置屬性 => 常規 => 平臺工具集 => 選擇 XP 的

主要是經過控制了一個異常,來執行高權限的命令,但我這個菜雞也玩不出什麼花樣來

本文分享自微信公衆號 - 陳冠男的遊戲人生(CGN-115)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。ide

相關文章
相關標籤/搜索