SumHack

13 object(s)
 

[新手入门] 什么是文件?以及应用程序执行基础

什么是文件

这一篇不需要搞懂所有的概念,只需要理解大概的流程就行。

因为这个概念由于操作系统的存在,我们普通用户很少会接触到硬盘底层这些详细的结构。

但是却又是不得不了解的,毕竟要当黑客,想在上面玩出花样,就不得不先理解这些,才能利用这些来搞出一些与众不同的骚操作。

这才是黑客与普通用户的真正区别。

而不是使用一两个小工具就沾沾自喜,那不过是会用工具的普通用户脚本小子)而已。

硬盘

详细可以看看这个文章:硬盘存储原理

总而言之,文件就是在我们磁盘中的不同二进制数据。但是,整个磁盘都是用二进制的数据格式,我们怎么知道哪个文件是哪里到哪里呢?比方说我们硬盘有4位大小,值是 1 1 0 0 我们如何确认里面有几个程序,还是说这些都是无意义的数据,又或者是从哪里到哪里是第几个程序呢?

这时候就出现了文件储存格式的概念。

在WINDOW上,大部分基本用的都是FAT32或者NTFS。而linux大部分的文件格式是ext2或者ext3,除了这些之外,还有一些各种各样的数据格式。不过为了方便,毕竟windows大家也用了这么久了。而且上手也很简单。所以这次我们先讲讲FAT32和NTFS的文件格式。当然,同样的,待会儿也会给出数据隐藏的实例,这在ctf中也会有一些这样的题目。

FAT32文件结构

大家感兴趣可以看看这篇文章:FAT32文件系统快速入门

这是一张FAT文件结构的表格:

20170308200924298.gif

所有的文件系统的意思,就是按照特定的结构来画风磁盘上的不同二进制文件。
所有的文件系统的意思,就是按照特定的结构来画风磁盘上的不同二进制文件。
所有的文件系统的意思,就是按照特定的结构来画风磁盘上的不同二进制文件。

重要的东西说三遍。

毕竟所有东西都是二进制,01如果不强制抽象的话是没有概念的。

这些就得涉及到计算机基础课程。

其中,我先大概讲解一下几个关键部分。我们要划重点的就是MBR文件分区FAT表,引导扇区。

其中先来了解,什么是MBR

MBR

文章里以及百度百科说的很清楚了:

主引导记录,占446字节, 为计算机启动后从可启动介质上首先装入内存并且执行的代码,通常用来解释分区结构

意思就是,MBR是电脑最先启动时执行的一段代码,这段代码一般告诉CPU如何如何“使用”这块硬盘。

我知道这个很抽象,最先启动?最先执行?咋最先启动最先执行呢?咋告诉CPU如何执行呢?

先来说最先启动和执行,MBR一般在磁盘最开头,所以第一时间加载的就是这段指令,至于什么叫做CPU如何如何“使用”这块硬盘,这段代码告诉了CPU,我们接下来要执行的代码在硬盘上的哪个地址哪个地址,我们这个是什么格式的硬盘比方说NTFS或者FAT等等等等,就等于先告诉别人我们去挂号,医生(CPU)先看你的病历(MBR),上面告诉医生你得了什么病,得用什么要等等。

同时,MBR中还记载着更重要的分区表。为什么会有分区表呢?

很多人应该会疑惑。windows XP支持最大分区128GB,最大文件4GB;

意思就是以前的XP系统,你一个磁盘的最大分区只能有128G,而每个文件最大的大小就是4GB,超出这些就储存不了了。

为什么会这样呢?这就是分区表的问题了。

这就扩展到了一个寻址范围的问题。

正如上面所说的,所有的文件系统的意思,就是按照特定的结构来画风磁盘上的不同二进制文件。

同时,每个储存这些数据的索引,都是一些二进制文件,FAT32的意思就是把一个32位的二进制数据,这个就成为记录簇。

FAT32将记录簇链的二进制位数扩展到了32位,故而这种文件系统称为FAT32。32位二进制位的簇链决定了FAT表最大可以寻址2TB个簇。这样即使簇的大小为1扇区,理论上仍然能够寻址1TB范围内的分区。但实际上FAT32是不能寻址这样大的空间的。随着分区空间大小的增加,FAT表的记录数会变得臃肿不堪,严重影响系统的性能。所以在实际使用时通常不格式化超过32GB的FAT32分区。Windows
2000及以上的操作系统已经不直接支持在资源管理器中对超过32GB的分区进行FAT32格式化,但Windows
98/Me依然可以格式化到127GB的FAT32分区。

而分区,就是为了环节磁盘的索引变得臃肿不堪而出现的。详细的体现就是磁盘中出现CDEFG这些盘。

至于为什么会变得臃肿不堪,就看下一节吧

扩展阅读:

寻址范围还有一个很明显的例子,就是众所周知的32位系统运行内存最大只能是4GB。

这是因为32位CPU中,CS:IP寄存器最大能储存FFFFF×4的数值,再大就超出去显示不了了(就像超出显示器一个道理)
这个地址代表了CPU能CALL执行的每一个地址。

2^32/1024/1024/1024=4G

这也就是我们得出32位系统最大的可用运行内存是4G的原因了。

至于64G为什么不用担心寻址范围,这个就自己算吧。。太大了。

至少五十年内,我们内存的容量应该加不到了。

文件分区FAT表

上一节说了,不分区会导致臃肿不堪,这是为什么呢?

我们最开头抛出了一个问题,如何判断磁盘中某一区域内,xx-xx范围的二进制数据代表着一个程序呢?

这就是文件FAT表的作用,在上图中应该可以看到,在数据之前有这个区域。

这个区域主要就是用来确认每个文件具体的范围,系统在读取磁盘的时候,会先查看这个区域,来判断磁盘下有什么什么程序。具体是哪些哪些。哪里到哪里,至于要执行的时候,就会自动更具这里储存的地址找到改程序,然后balabalabala。。。

这块区域是有大小的,你数据不能储存太大。每个文件位置都是一个32位的簇来保存,太大了,我只有32位的字节去告诉你这片区域是哪个程序,如果你大于4G。我就没办法用一个簇来显示出你程序真正的范围了。(会漏掉一部分范围)

至于为什么不用两个簇,这当然是可以的,比方说FAT32+或者FAT64,但是这些都是特殊情况,我们暂且不谈。

那么为什么会臃肿不堪呢?我们先考虑一个情况。

这个得画图。。。到时候再画吧(逃

总之就是因为读写的顺序,你粗存文件位置不可能毫无空隙,同时,磁盘每次读取程序都得查一次这个表,如何这个表很大,查这个表就会十分的耗时。所以这个文件系统就会变得十分的臃肿,毫无效率可言。

基于FAT32的文件隐写

这个略微复杂,但是并不困难。

如果有想法,可以作为课题研究,欢迎各位成员把研究报告发上来,一起学习。

原理大概就是。找到FAT文件系统中的为分配区域,并像该区域写入数据,达到数据不会被覆盖,但也不会被发现效果。

可以参考这个:【原创】FAT32的数据隐写与程序实现

Windows下应用程序执行基础

本篇只是作为一个索引来讲解的。会省略一部分比较难的部分。

因为那部分老师应该会教的吧。。。。?