武汉大学国家网络安全学院信息安全专业课程软件安全开卷期末考试的复习资料
1 硬盘分区MBR结构1.1 MBR的数据结构共512Byte,前446Byte为启动引导程序,然后就是分区表了,分区表后面是两个字节,固定为“55 AA”。 分区表一共64Byte,共4个表项,分别代表4个分区,解析如下: 0:活动标志,若为0x80,则表示该分区为活动分区;若为0x00,则为非活动分区; 1,2,3:该分区的起始磁头号、扇区号、柱面号。其中,磁头号为第1字节,扇区号为第2字节的低6位,柱面号为第2字节的高2位 + 第3字节; 4:分区文件系统标志。分区未用(0x00),扩展分区(0x05,0x0F),FAT16分区(0x06),FAT32分区(0x0B,0x1B,0x0C,0x1C),NTFS分区(0x07); 5,6,7:该分区的结束磁头号、扇区号、柱面号,含义同1,2,3; 8,9,10,11:逻辑起始扇区号,表示分区起点之前已经使用的扇区数; 12,13,14,15:该分区所占用的扇区数。 存储容量 = 磁头数 x 磁道(柱面)数 x 每磁道的扇区数 x 每扇区的字节数 注:一个扇区为512字节 1.2 MBR扩展分区的方案扩展分区的类型是0x05,在主引导扇区中,一组扩展分区被视作一个主扩展分区,占用一个分区表项。 在主扩展分区中,扩展分区表以链表的形式链接,每个扩展分区表除了一个指向逻辑盘(数据区)的分区表项以外,还有一个指向下一个扩展分区表的表项,这一部分图例见书15、17页 1.3 磁盘寻址方式设C、H、S分别表示当前柱面号、磁头号和扇区号,Cs、Hs、Ss分别表示起始柱面号、磁头号和扇区号,PS表示每磁道有多少个扇区,PH表示每柱面有多少个磁道。 要从磁盘3D参数模式转到线性地址寻址,使用下面的公式
反过来的方式见书14页 2 文件系统文件系统将磁盘空间以一定数目($2^n$)的扇区为单位进行划分,该单位称为簇,它是进行文件空间分配的最小单位。 2.1 FAT(1)结构 一个FAT32的逻辑盘被分为引导区、FAT表区和数据区。引导区占用一定的空间,后面存在保留扇区。然后是FAT区,FAT区中至少存在两个FAT表,FAT2作为FAT1的备份存在。 要表示一个文件的存储情况,在文件占用簇的对应簇号的FAT项,填写下一个簇的簇号,如果为最后一簇,则为结束标识“FFFFFF0F”,这样该文件占用的所有簇以簇链的形式链接起来。 在数据区中还存在目录区,这一部分的具体定义见书18页。长文件名的情况见书19页 (2)文件删除后,目录项第一字节变为“E5”,并且首簇高位的两个字节被清零;簇链表整个被清零;文件内容不受影响。恢复方法如下: 还原文件名首字节 长文件名:直接逆向定位完整文件名。确定高位并还原 参考相邻目录项的首簇高位 从0往上试探,看首簇指向内容是否为预期文件头部修复FAT表簇链 通过文件大小计算所占簇数 按照连续存储假设,进行簇链修补,其中末簇FAT项用0FFFFFFF结尾。 2.2 NTFSNTFS逻辑盘结构下的内容分布顺序为:引导扇区与NTLDR区,MFT元数据记录,可分配的MFT空间,文件存储区1,MFT元数据记录的备份,文件存储区2 描述逻辑盘所在位置和空间大小等信息的参数存放于引导扇区中的BPB参数表。 在可分配的MFT表中,每一项对应一个文件或目录,称为文件记录,每个文件记录大小为1KB,每个记录是由各种各样的文件属性构成的,如果文件较小,所有属性都能放在1KB大小的文件记录中,如果不能,则放在文件记录里面的称为常驻属性,放在其外的称为非常驻属性。每个属性头4字节标记了该属性的类型,比如80H代表该属性描述的是数据的情况。DataRunList是描述一个非常驻属性的位置,它的结构表示为:第一个字节高4位代表簇号所占用的字节数,低四位代表簇数所占用的字节数,随后紧跟的x个字节表示簇号和簇数。例如,21 04 89 0D的DataRunList代表起始簇号为0xD89,大小为0x4个簇。 3 PE文件(1)DOS头MZ文件头:通常到0x40,最后4个字节指向PE文件头的位置,也可用于PE文件合法性检测。 DOS插桩程序:小DOS程序 (2)PE文件头①字符串“PE\0\0”,即“50 45 00 00”②映像文件头(FileHeader)20字节(14H)结构在课本P36 ③可选映像头(OptionalHeader)大小在映像文件头里几个关键的字段/概念: a. ImageBase:PE文件在内存中的优先装载地址b. RVA地址:相对虚拟地址,它是相对内存中ImageBase的偏移位置 所以实际地址就是RVA地址 + ImageBase c. Address Of Entry Point:PE装载器准备运行的第一条指令的RVAd. DIRECTORY:它前面的4个字节表示DIRECTORY的项数。它一项是8字节,前4字节为RVA,后4字节为大小。它最大可以有16项,对应关系如下: 第1项:输出表(EXPORT Table)第2项:输入表(IMPORT Table)第3项:资源表(RESOURCE Table)第4项:异常表(EXCEPTION Table)第5项:验证表(CERTIFICATE Table)第6项:基址重定位表(BASE RELOCATION Table)第7项:调试(DEBUG Directory)第8项:结构(Architecture Specific Data)第9项:整体指针(GLOBAL POINTER Register)第10项:TLS表(TLS Table)第11项:载入配置表(LOAD CONFIGURATION Table)第12项:输入范围(BOUND IMPORT Table)第13项:IAT(IMPORT Address Table)第14项:延迟输入目录(DELAY IMPORT Descriptors)第15项:COM+ 程序文件头(COM+ Runtime Header)第16项:保留 (3)节与节表节表是紧挨着PE文件头的一个结构数组。每一个节表项对应一个节。 节表项的具体字节信息可以看课本P39 节有很多种,例如: 代码节.text、数据节(已初始化的是.data,未初始化的是.bss)、引入函数节.rdata、资源节等(如图标),引出函数节(dll文件中常见),重定位节(dll文件中常见) 重点:引入函数节 名字:.rdata IMPORT Address Table(IAT):引入函数表 IMPORT Directory Table(IDT):引入目录表 IMPORT NAME Table(INT):存放引入的API函数名和对应的dll文件名 定位IAT:在可选文件头中的DataDirectory的第13个表项,前4字节是RVA,后4字节是大小。 定位IDT:在可选文件头中的DataDirectory的第2个表项(输入表),前4字节是RVA,后4字节是大小。 IAT:从每个.dll文件中引入API函数,都会被记录在这里。它的每个项表示从一个.dll文件中引入的API函数的名字的位置,每一项以4字节的0结尾。 计算引入的API函数个数:IAT大小/4字节 - (dll个数 - 1) IDT:由一系列的IMAGE_IMPORT_DESCRIPTOR结构组成,每个结构20字节,结构的数量取决于程序要使用的DLL文件的数量,每一个结构对应一个DLL文件。在所有这些结构的最后,由一个内容全为0的IMAGE_IMPORT_DESCRIPTOR结构作为结束。结构中,每一项4字节,共5项: 第1项:Import Name Table RVA:该dll中所有被引入的函数的名字或序号信息的位置 第2项:Time Date Stamp 第3项:Forwarder Chain 第4项:Name RVA:dll文件名字字符串的位置 第5项:Import Address Table RVA:该dll对应的IAT表的位置 计算dll的个数:IDT大小/20字节 - 1 INT: |