創作內容

4 GP

【資安筆記】03- 寄生執行檔

作者:W.Dinlon│2022-07-23 20:09:16│巴幣:8│人氣:354
  這篇文章是在讀書時做出一些整理與想法,之後也可以快速複習。所以些許略過基礎的部分。如文中有錯誤敬請指正。

這次的項目來源 :

個人做註解的版本 :

這次的文章需要您了解 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 。

實作

那開始講解 PE_Patcher.cpp 這份檔案吧,這份文件需要用 Visual C++ 來編譯。

得先提到這三個 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/


------

對了 補個封面圖 Pixiv : 99850376

近幾天在處裡朋友被勒索攻擊的資料庫,他的密碼是 123 一下子就被打下來。所有文件都被加密了笑死。所以記得設好一點的密碼,不然哪天莫名其妙要還原一堆東西。
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=5516446
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式|自學|資安|程式設計|科普|C++

留言共 2 篇留言

偷偷做不會被發現

07-23 21:25

W.Dinlon
原始碼的開發者才是07-23 21:56
虛鹿
酷欸,直接把Shellcode塞到EP指向的位置什麼的,感覺意外的有道理的說~(^ ^)

07-24 07:21

我要留言提醒:您尚未登入,請先登入再留言

4喜歡★ton200168 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:【資安筆記】02- PE... 後一篇:【開箱】ななひら專輯「M...

追蹤私訊切換新版閱覽

作品資料夾

robert286 ლ(´•д• ̀ლ
ლ(´•д• ̀ლ看更多我要大聲說16小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】