這篇文章是在讀書時做出一些整理與想法,之後也可以快速複習。所以些許略過基礎的部分。如文中有錯誤敬請指正。
這次的項目來源 :
個人做註解的版本 :
這次的文章需要您了解 PE 檔案的架構,如果想了解可以看前兩章。
ななひら 要 3D 了,好耶 !
來聽首 ななひら × 天満ニア 唱的 Deep in Abyss 吧
介紹
首先,在上一章裡我們可以得知在PE架構中,欄位可以決定程式的執行效果。
這些欄位也許是改變程式的建構方式,或者是執行步驟...... 又或者甚麼都不會影響。
這次的重點就放在 Optional Header 的 EntryPoint 欄位,在 winnt.h 的位置定義是
IMAGE_SECTION_HEADER -> OptionalHeader . AddressOfEntryPoint
這個欄位的功能是使 loader 在載入的時候使 EIP ( 當前指令位置的暫存器 ) 設為指定的位置,使程式開始時可以從 EntryPoint 開始執行。要是我們改變了這個位置,就可以使程式跑到我想要執行的地方了。
那......既然我們可以把 EP 改到別的位置,如果只是讓他進入錯誤的點那有甚麼用?
所以我們就在這個 PE 檔上接上一段區塊,讓這個區塊裡面放我們想要執行的東西,只要把 EP 指定來這邊就可以成功執行啦 OwO/
不過要做出這個區塊的話,我們需要放入 shellcode ,這東西簡單來講就是把你要執行的程式變成機械碼。當 EIP 跑來這邊的時候就會執行這些機械碼,達成你的任務。
因為要如何生成 shellcode 需要一些篇幅,所以這裡直接用現成的
這份 shellcode 可以在你的電腦上顯示一個寫著 "BrokenByte" 的 Message Box。
感染
現在來規劃如何把這個 shellcode 植入 PE 檔吧。
首先,最直觀的方法就是放入 shellcode 區塊 ,然後把 EP 改到那個位置。但是這樣做的話會導致其他的欄位的內容錯誤,甚至根本不會把 shellcode 區塊放入記憶體,所以我們需要再做一些操作。
這邊的步驟如下 :
1. 複製一份原有檔案,來操作這份複製檔。( 以下說的都是這份複製檔 )
2. 把程式的 Header 位置記錄下來。
3. 為了建立新的區塊來放 shellcode :
3-1. 取得區塊起點
3-2. 在 section header 上註冊新的區塊
3-3. 增加總區塊數
3-4. 把 shellcode 放到新的位置
3-5. 重製 SizeofImage 大小
4. 改變進入點
5. 導出
可以看到步驟3會有許多項目,這是因為要使程式執行時需要置入含有 shellcode 的 block 。
實作
得先提到這三個 macro
48 : getNtHdr 取得 PE 檔 [ buf ] 的 NT Header
49 : getSectionArr 透過 NT Header 位置加上其大小,取得 PE 檔 [ buf ] 的 Section Header
50 : P2ALIGNUP 計算區塊對齊所需數量,這麼說有點抽象,畫張圖好了
( 資料的儲存是以區塊為單位以避免外部碎片化,所以當要存一份資料時就要分配足夠的區塊 )
那程式開始後先讀入二進位的 PE 檔,這部分在上一章做過了所以不細講。
然後抓取原檔案的區段對齊大小 ( 有 Section Align 跟 File Align),用它計算完成的檔案要花多少空間。
然後宣告它的空間後把原檔案複製到新空間。
然後就是在 Section Header 表中添加新的 Section Header,此時需要寫上一些區塊資料
看起來很多,就一一解釋吧 :
60 : 利用 getSectionArr 取得 SectionHeader 位置 Array 方便之後編輯
// 現在要取得新的區塊位置,就是接在最後一個區塊的後面
61 : 取得現有的最後一個資料區塊
62 : 在該物件位置後的位置就是新的空間,
// 寫入 Section Hdr 資料
63 : 區塊名稱,可以幫區塊取名。像這裡該程式作者就取名為他的個人網頁。記得要預留 '\0' 的空間。
64 : shellcode 要花的空間 ( 含區塊對齊 )
65 : 這個區塊的虛擬位置起點,從最後一個區塊計算。
66 : 計算 raw data ( 你的 shellcode) 大小
67 : 計算 raw data 起點,由最後一個區塊計算。
68 : 使該區塊可以 執行 | 讀 | 寫
69 : 把總區塊 +1
把 shellcode 寫入資料區塊
把每個section header 的 virtual size 修正
修正 Optional header 的 size of image,使記憶體會載入該區塊。
終於,可以把進入點改到你的 shell code 起點了
然後把我們所做的這個新檔案以二進位方式存起來,變成 file_infected.exe
那這個被感染後的執行檔就完成了 !
執行時就會因為 EP 改變而直接執行 你的shellcode,當這份惡意的 shellcode 附加到你的程式的話,就可以執行下載病毒或植入後門行為。
那這篇就到這邊 OwO/
------
近幾天在處裡朋友被勒索攻擊的資料庫,他的密碼是 123 一下子就被打下來。所有文件都被加密了笑死。所以記得設好一點的密碼,不然哪天莫名其妙要還原一堆東西。