0×01 硬盘的逻辑结构机械磁盘在物理结构上是由磁片、马达、磁头、定位系统等部件构成,通常一块磁盘有若干块磁片构成,为了方便定位统一管理,将这些磁片进行了编号。一个碟片的两面各有一个磁头(Heads),每个碟片被划分成若干个同心圆磁道,每个碟片的半径均为固定值R的同心圆形成柱面(Cylinders),从外至里编号为0、1、2……每个碟片上的每个磁道又被划分为若干个扇区,一个扇区通常容量为512byte,并按照一定规则编号为1、2、3……形成Cylinders×Heads×Sector个扇区,这三个引数即可定位一个扇区。从这里可以看出扇区是磁盘的最小储存单元,对磁盘的读写只能以扇区为单位。(请务必注意最后一句话,后面的实验会用到)
Question1:磁盘的扇区是什么时候划分的?
Answer:在对磁盘进行低阶格式化时(磁盘出厂前已经完成),会划分出柱面和磁道,将磁道划分为若干个扇区,每个扇区又划分出标识部分ID、间隔区、GAP和资料区DATA等。而我们通常在操作系统中所用的格式化是高阶格式化,仅仅是清除硬盘上的资料,生成引导资讯,初始化FAT表,标注逻辑坏道等。需要注意的是低阶格式化是一种损耗性操作,对硬盘寿命有一定的负面影响。
由于后续实验需要了解到磁盘资料的具体含义,在这里简要介绍一下。硬盘上的资料按照其不同的特点和作用大致可分为5部分:MBR区、DBR区、FAT区、DIR区和DATA区。
1、MBR区MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区。MBR只占用该扇区的前446个字节,另外的64个字节属于DPT(Disk Partition Table硬盘分割槽表),最后两个字节“55,AA”是分割槽的结束标志,这两部分构成了硬盘的主引导扇区。

2、DBR区DBR(Dos Boot Record操作系统引导记录区)位于硬盘的0磁道1柱面1扇区,是操作系统可以直接访问的第一个扇区,它包括一个载入程式和一个被称为BPB(Bios Parameter Block)的本分割槽引数记录表,DBR是在高阶格式化时产生。
3、FAT区FAT(File Allocation Table档案分配表)区位于DBR区之后。档案在储存时并非连续储存在某个区域,而是分成若干段进行链式储存,FAT便是用于储存段与段之间的连线资讯。由于FAT对于档案管理十分重要,所以在原FAT的后面会有一个备份FAT。
4、DIR区DIR(Directory)是根目录区,位于备份FAT表之后,记录着根目录下每个档案(目录)的起始单元,档案的属性等。
5、资料(DATA)区资料区位于DIR区之后,用于储存真正的使用者原始资料。
0×02 MBR引导原理计算机在按下电源键键以后,开始执行主板bios程式。进行完一系列检测和配置以后。开始按bios中设定的系统引导顺序引导系统。当设定为从硬盘启动时,Bios执行完自己的程式后如何把执行权交给硬盘呢?交给硬盘后又执行了什么呢?
这些问题便是需要MBR来解决的,bios在执行自己固有的程式以后就会跳转到mbr中的第一条指令,将系统的控制权交由mbr来执行。需要注意的是MBR不随操作系统的不同而不同,意即不同的操作系统可能会存在相同的MBR,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
Question2:所有电脑都有MBR引导区吗?
Answer:其中BIOS设定中,有两种启动进入操作系统的方法,分别是为UEFI和Legacey。 其中Legacy是早先出现的,而UEFI(Unified Extensible Firmware Interface)是后来发展出的可扩充套件固件界面。两种模式分别对应的硬盘分割槽格式:MBR格式和GUID(GPT)格式,所以只有采用Legacy启动的才会拥有MBR扇区。
0×03 摧兰折玉——暴力擦写MBR如果我们破坏了MBR会发生什么?利用winhex对MBR区域进行00填充操作,由于针对磁盘的读写操作需要高许可权进行,所以请用管理员启动winhex。
填充后:

修改后切记储存,才能使修改后的资料真正写入到磁盘中。然后重启电脑。
哦,对了,实验务必在虚拟机器中进行,务必做好快照,哈哈哈~~~~~前面忘说了。
0×04 偷梁换柱——篡改MBR我们成功的破坏了MBR,既然Bios将控制权交给了MBR执行,我们岂不是可以利用MBR做一些其他事。这里我们用到程式https://github.com/DavidBuchanan314/pwn-mbr,该程式是将自己的payload写入到MBR区域执行。
工程中的payload.s档案属于组合语言程式,需要利用其进行编译生成二进位制payload。笔者刚开始选择masm对其进行编译,报一堆错误,后来才发现该汇编语法规范属于nasm,使用nasm顺利生成了payload。
Windows利用核心模式与使用者模式的严格切分确保了可靠性,这两种模式分别对应了CPU的Ring0与Ring3级别,在Ring3级下执行的程式是不能够直接访问到硬件的。如果要读写磁盘上的扇区资料,需要利用INT中断来进行,但是也必须是在Ring0级才可以进行操作,而进入Ring0级的方法有:装置驱动程式、呼叫门、任务门、中断门、陷阱门等,这势必提升了操作门槛。
而程式中对磁盘的操作直接使用了fopen等档案操作函式,这是为什么?Windows的核心之一就是强大的档案管理能力,将所有资源都看成档案,无论是储存在硬盘上的档案还是五花八门的硬件装置(硬盘,显示器等),所以硬件也拥有自己特殊的档案路径。
程式启动时带入的引数是物理驱动器的路径:
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平台的驱动器名一般为“\\.\\PHYSICALDRIVE0",后面的数字以此类推;linux平台通常为dev\\sda。
3、程式的执行通过阅读源代码,可知程式对磁盘进行了读写操作,而fopen等对物理驱动器的操作必须具备除错许可权,否则就会开启失败,所以我们选择管理员执行程式。

执行后重启系统,我们看到屏幕上的字串。

按下回车键后,windows系统正常启动。
4、阅读程式程式中这段程式码在实际执行中会进入而使得程式退出,所以需要注释掉,确保顺利执行。
if (mbr[0] != ASM_JMP) { // this is only a heuristic for added safety printf("No bootcode detected. Aborting!\\n"); fclose(fp); return 1;}通过对源代码的阅读,大致梳理出程式流程:
读取前512字节,即MBR所在的扇区
向后寻找一块全0的空白扇区
char isUsed = 1; while (isUsed) { fread(&readbuf, SECTOR_SIZE, 1, fp); for (int i = isUsed = 0; i 将原始MBR资料异或0xA6后储存在该空白区域
for (int i = 0; i 将payload写入到MBR扇区
需要注意的是,笔者在除错程式时发现payload在写入时总是失败,提示引数错误,后来发现在对硬盘读写时,必须是512字节的整数倍才行,所以需要对源程式进行修改,将payload补齐到512字节后写入MBR扇区。
经过上述修改后,系统重启时并没有顺利启动我们的payload,这里需要回顾第一章节里提到的MBR区的资料格式,在MBR所在的第一扇区除了前446字节是MBR程式外,后面的64个字节属于DPT(Disk Partition Table硬盘分割槽表),最后两个字节“55,AA”是分割槽的结束标志。所以我们在写入payload的同时应该修复DPT和结束标志,程式中需要在读取原始MBR资料后加入以下程式码。
fread(&mbr, SECTOR_SIZE, 1, fp);//从磁盘中读取MBR扇区
memcpy(payload, mbr, SECTOR_SIZE);//将原始MBR资料copy到payload
memset(payload, 0, 446);//将前446清空,留下后面的DPT表和结束标志
在阅读payload汇编程式码前,需要明确一点:MBR在执行时是被载入到内存地址为0:0x7C00的空间里执行。
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设定为255,为了循环打印255次pwn文字 jz doCopy ;判断是否打印完毕,完毕则跳转至docopy处 mov si, pwned.cLoop lodsb ; AL 4 bytes )疑惑:笔者在进行测试时发现,xp/win2003系统均可完成上述实验的全过程,而换成win7会就会发现在出现pwn文字后,按下回车键无任何反应,系统并没有正常启动。
0×05 凤凰涅槃--MBR修复如果有同学不慎中招了MBR病毒,不要慌张,下面我们来讲如何修复被破坏的MBR扇区。根据之前我们对MBR工作机制的认识,当MBR被破坏时,系统无法正常引导,磁盘分割槽资讯丢失,所以需要修复这两部分才可以正常启动系统。
1、下载PE系统,利用光驱或U盘等方式,启动PE系统;2、开启PE系统中的diskgenius分割槽工具,可以看到硬盘上的资料全都不见了;
3、右键点选硬盘选择“搜寻已丢失的分割槽”;4、选择“整个硬盘”,点选开始搜寻,diskgenius会在整个磁盘范围内搜寻匹配分割槽表;
5、当搜寻到分割槽资讯时会弹框确认,请按“保留”按键;6、搜寻完毕后,点选储存按钮;
7、此时可以看到磁盘上的档案资讯都回来了;

8、重建主引导记录

9、进入PE系统的“修复系统引导”程式,对系统引导进行修复。10、Reset,大功告成!0×06 后记前面我们了解了MBR磁盘锁的基本执行机制,以及MBR扇区修复技术,其实有关MBR的利用远不止这些,在一些高阶利用场景中,我们可以利用修改MBR程式码的方式实现病毒程式的持久化,而且这种形式的持久化方式是不依赖于操作系统,更加隐蔽难以察觉,因此部分防毒软件也紧盯MBR扇区,利用多种技术对MBR扇区进行了防写,防止病毒的篡改侵蚀。
*本文作者:追影人,本文属 FreeBuf 原创奖励计划,未经许可禁止转载
精彩推荐





























