1. 程式人生 > 其它 >除錯時windbg命令的一些知識~不斷更新

除錯時windbg命令的一些知識~不斷更新

將自己在工作中的記錄的一些windbg的命令記錄下來,方便查閱,此頁面會不斷更新:

 

windbg載入符號相關:

載入符號時開啟嘈雜模式:!sym noisy
載入符號時開啟靜默模式:!sym quiet

CTRL+S設定符號表路徑:F:\VsCode\TestHelloWorld\x64\Debug;SRV*F:\virtual_Symbol\win10_21H2_x64* http://msdl.microsoft.com/download/symbols 

一般F:\VsCode\TestHelloWorld\x64\Debug放的是除錯程式對應的pdb,如果在此目錄下或者F:\virtual_Symbol\win10_21H2_x64下都找不到符號檔案,那麼就到微軟符號伺服器下載,可以設定多個路徑在最前面,通過;分割。

載入使用者空間符號:.reload /user

重新載入:  .reload /f xxx.exe/dll/sys

強制載入某個不匹配的PDB檔案: .reload /i xxx.exe/dll/sys

 

查詢模組內函式:
例如檢視MessageBoxW:  x User32!*MessageBoxW*

 

檢視模組:

檢視當前載入所有模組:lm

檢視某個模組詳細資訊: lm vm XXX  不加字尾

 

檢視使用者態回撥函式表:

使用者態下使用命令 !peb 

dt nt!_PEB xxx 偏移大概0x58的位置  就是KernelCallbackTable,

也可以使用命令   dt nt!_PEB KernelCallbackTable XXX  含義為XXX為_PEB結構體,查詢結構體中的KernelCallbackTable變數

找到之後使用名  dps XXX 或者 dqs、dds根據64位、32位不同

 

雙機除錯,使用VirtualKD-Redux軟體可以很方便的進行雙機除錯

雙機除錯下除錯使用者態程式:最好可以讓使用者態程式執行時暫時中斷下來如:getchar()、MessageBox、system("pause")等等。

在宿主機上的windbg中使用選單Debug->Break或者鍵盤CTRL+Pause,即可使被除錯機器中斷下來:

使用命令 !process 0 0 xxx.exe 可以檢視特定程序對應的_EPROCESS地址,例如:

kd> !process 0 0 cmd.exe
PROCESS ffffe5048cbae340
SessionId: 2 Cid: 11b0 Peb: 65471e6000 ParentCid: 1618
DirBase: 3a560002 ObjectTable: ffffbe09a24b2080 HandleCount: 73.
Image: cmd.exe

會話ID為2,程序ID為0x11b0,peb地址為65471e6000,父程序id為1618,DirBase不太懂,好像比較複雜,暫時放下,ObjectTable為控制代碼表地址,HandleCount為控制代碼數量。

要除錯此回話需要使用如下幾條命令:

.process /i  xxx  xx為EPROCESS的地址

g

.reload /user

如果沒有載入主程式的pdb   .reload /f XXX.exe/dll/sys 為應用程式模組

如果還是沒有載入主程式的pdb .reload /i xxx.exe/dll/sys,如果還是沒有載入,檢查.sympath是否包含pdb路徑

 

雙機除錯快速除錯使用者程式:在應用程式中原始碼中加入DebugBreak()或者int 3斷點,程式執行後,宿主機偵錯程式會自動中斷下來:

使用命令: .reload /user 載入使用者態符號

在檢視棧回溯:k

此時已經在使用者空間了,可以進行除錯。

 

 

檢視程序token

一些結構體 dt nt!_EPROCESS 

偏移0x4b8 為 TOKEN, 結構體為 _EX_FAST_REF

  +0x000 Object : 

  +0x000 RefCnt : 
  +0x000 Value

如果找到pid為4的system程序,獲取Object 的值,然後寫入到想提權的程序Object屬性中,即可提權許可權到sytem級別

使用命令 dt  nt!_TOKEN object的值,

  偏移0x40為Privileges,結構體為 _SEP_TOKEN_PRIVILEGES    

    [+0x000] Present : 0x800000000000 [Type: unsigned __int64]
    [+0x008] Enabled : 0x40800000000000 [Type: unsigned __int64]
    [+0x010] EnabledByDefault : 0x0 [Type: unsigned __int64]

    其中Present代表著是否可以開啟某項許可權,Enabled代表是否開啟了某項許可權,EnabledByDefault 為是否預設開啟了某項許可權,

  要提權時可以修改token為system的token,也可以換一種方式:開啟SeDebugPrivilege許可權,預設情況下只有過了UAC的high許可權及許可權之上的程式才可以開啟此許可權,如果存在核心漏洞

設定Present及Enabled為0x100000即可,因為此漏洞利用方式需要利用程序注入技術,需要開啟winlogon.exe,並且寫入資料,而OpenProcess開啟system程序時會去判斷當前程序是否開啟了SeDebugPrivilege許可權,如果開啟了此許可權,即可開啟system程序,至於為什麼是0x100000,可以在windbg下輸入!token命令:

kd> !token
Thread is not impersonating. Using process token...
_EPROCESS 0xffffe50489885080, _TOKEN 0x0000000000000000
.........
Privs:
02 0x000000002 SeCreateTokenPrivilege Attributes -
03 0x000000003 SeAssignPrimaryTokenPrivilege Attributes -
04 0x000000004 SeLockMemoryPrivilege Attributes - Enabled Default
05 0x000000005 SeIncreaseQuotaPrivilege Attributes -
07 0x000000007 SeTcbPrivilege Attributes - Enabled Default
08 0x000000008 SeSecurityPrivilege Attributes -
09 0x000000009 SeTakeOwnershipPrivilege Attributes -
10 0x00000000a SeLoadDriverPrivilege Attributes -
11 0x00000000b SeSystemProfilePrivilege Attributes - Enabled Default
12 0x00000000c SeSystemtimePrivilege Attributes -
13 0x00000000d SeProfileSingleProcessPrivilege Attributes - Enabled Default
14 0x00000000e SeIncreaseBasePriorityPrivilege Attributes - Enabled Default
15 0x00000000f SeCreatePagefilePrivilege Attributes - Enabled Default
16 0x000000010 SeCreatePermanentPrivilege Attributes - Enabled Default
17 0x000000011 SeBackupPrivilege Attributes -
18 0x000000012 SeRestorePrivilege Attributes -
19 0x000000013 SeShutdownPrivilege Attributes -
20 0x000000014 SeDebugPrivilege Attributes - Enabled Default
21 0x000000015 SeAuditPrivilege Attributes - Enabled Default
22 0x000000016 SeSystemEnvironmentPrivilege Attributes -
23 0x000000017 SeChangeNotifyPrivilege Attributes - Enabled Default
25 0x000000019 SeUndockPrivilege Attributes -
28 0x00000001c SeManageVolumePrivilege Attributes -
29 0x00000001d SeImpersonatePrivilege Attributes - Enabled Default
30 0x00000001e SeCreateGlobalPrivilege Attributes - Enabled Default
31 0x00000001f SeTrustedCredManAccessPrivilege Attributes -
32 0x000000020 SeRelabelPrivilege Attributes -
33 0x000000021 SeIncreaseWorkingSetPrivilege Attributes - Enabled Default
34 0x000000022 SeTimeZonePrivilege Attributes - Enabled Default
35 0x000000023 SeCreateSymbolicLinkPrivilege Attributes - Enabled Default
36 0x000000024 SeDelegateSessionUserImpersonatePrivilege Attributes - Enabled Default

在cmd下輸入命令 whoami /priv 也可以看到與上面相似的結果

其實這些許可權每個佔一位,而SeDebugPrivilege 佔的是第二十位,1<<20二進位制為100000000000000000000,十六進位制為0x100000,之後OpenProcess開啟高許可權程序時即可通過驗證,其實設定為-1即0xFFFFFFFFFFFFFFFF也可以,不過這樣設定的話,在cmd下使用命令 whoami /priv會出現問題,可能是因為有很多標誌不存在,但是還是設定為1了。

 

本地核心態除錯:

可以使用SysinternalsSuite套件的工具之一livekd,不需要在電腦上配置引數,對於本地檢視核心態結構體比較方便,啟動一個管理員CMD,使用如下命令:

livekd.exe -k "D:\Program Files (x86)\Windows Kits\10\Debuggers\x64\windbg.exe"  或者kd.exe,使用kd.exe啟動的是控制檯,使用不太方便,

使用windbg.exe比較方便,可以使用windbg下的核心命令檢視結構體,應該是偵錯程式與livekdd.sys進行互動,有一些侷限:

無法修改核心資料,這個比較正常,而且獲取到的資訊不是實時的,例如我當前啟動了三個cmd.exe,使用命令!process 0 0 cmd.exe只能查到三個,如果再啟動一個cmd.exe,然後使用再次輸入此命令:還是隻能查到三個cmd.exe,除非重新啟動livekd.exe程式。

 

檢視SSDT,之後再做記錄,暫時不太熟練,還不會

KeServiceDescriptorTable

KeServiceDescriptorTableShadow