一直很惊叹,黑客是如何利用缓冲区溢出,达到入侵,破解系统的。就如IE浏览器上曾出现的图片格式病毒一样,这次对PSP的破解,正是借助一个TIFF格式图片完成的。由于对PSP有爱,决定去了解一下这里面都发生了什么事情。一个神奇的图片是如何破解系统的?
缓存区溢出,学名是memory overflow,实际上就是内存越界。其结果大致表现为,程序死机,系统崩溃。这本来是软件编写的bug,很常见。为什么这个现象能够被黑客们利用呢?
仔细翻查资料发现,崩溃(死机)的现象,是由于机器执行一个不正确的(非法的)指令造成的。原因可能有:(1)、无效的运算条件,比如除零错误;(2)、数据寻址错误,比如越界或数据受保护;(3)、指令寻址错误(类似2);(4)、指令无效或无法识别;(5)、……等等。黑客指出,并不是所有的缓冲区溢出都会引发崩溃(死机),同样并不是所有的崩溃(死机)都是由(3)、(4)情况引起的。大多数缓冲区溢出,对破解都没有帮助。只有缓冲区溢出导致(3)、(4)情况出现时,才对破解有价值(也有人专门研究其他情况下的破解,但是过程过于复杂,而且最终总会归结于3、4情况)。所以,我们来仔细分析一下,3、4情况下到底发生了什么?
(3)很好理解,在32位PC系统中,就是CS:IP的值错误导致越界。原因一般是由于在某些函数中,部分指令越界修改了内存栈,导致ret(或retf)指令在返回地址时得到了错误CS:IP。这些值一般存放于[ebp]-4(或[ebp]-8),而且很容被修改,访问任何一个local变量都可能越界修改到它。
(4)也不难理解,微机原理的机器语言中,详细描述了这个问题。简单来说,一条指令就是一个二进制数,所有CPU能支持的指令集合,就是一个二进制数集合。如果某个指令(二进制数)不在这个集合,就属于无效指令。如果在,当然就是有效指令啦。值得一提的是,这个指令的二进制数和数据的二进制数是同样的。就是说,在某些情况下,数据和指令是可以互相转换的。我们来看,汇编语言的指令mov ax,4C00h等于机器语言的二进制数B8004C,mov sp,16等于BC1000。而这个二进制数B8004C等于图片象素数据的RGB(184,0,76),BC1000等于RGB(188,16,0)。这样,指令与图像数据之间就建立了联系。
下面来了解,缓冲区溢出破解流程。
1、黑客要有个模拟环境,用以不断监测CPU各个寄存器的状态。PC系统中,就是自己的电脑。PSP上,就是已暴力破解(一般是改装硬件)旧型号的PSP1000。
2、不断尝试各种系统功能,查找崩溃(死机)现象。
3、分析机器崩溃(死机)时,CPU各个寄存器的状态,寻找有价值的线索(一个例子是,某个游戏要求输入玩家名称,但是当长度超过一定数量就会死机。某黑客发现,当他将名字输入为AAAAAAAA……(反复),死机时,某寄存器的值为A0A0A0A0,若为BBBBBBBB……(反复),则寄存器值为B0B0B0B0。由此确定输入数值对寄存器数值的影响。)。在这次破解中,是研究图片浏览器预读图片文件时的一个崩溃,并分析了文件中的数据值对寄存器的影响的关系。
4、研究从3中得到的寄存器属性,如果其为指令地址寄存器(相当于PC中的CS:IP,或ebx),那么恭喜。离胜利很接近了,这就是上述的(3)、(4)情况。如果不是,那么还要继续分析这个寄存器对某个指令地址寄存器的影响,找出之间联系。要是实在没有头绪,只能放弃这步,从2开始。
5、此时,已经能确定,如果某个输入数据为X,一定能使某个指令地址寄存器变成Y。大概是Y=f(X)。
6、编写一组目标指令(就是你想运行的程序,如hello world),将其转换成二进制数据,然后导入一个TIFF图片格式文件的某个特定区域中。并在文件中一个特地的位置放入X值。
7、重复崩溃的过程。当死机发生时,某个指令地址寄存器已经按照事先预想的变成Y,并且图片文件的那个特定区域数据已经导入了内存。而这个Y值则正好指向那段内存。
8、接下来,就是CPU按照黑客预想的方式,执行他们的程序。破解完成。
结束语:
黑客也是人,只不过是聪明一点并且勤奋很多的人。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/watergear/archive/2009/05/04/4148445.aspx