当我们不知道程序的代码是,当然不好进行缓冲区溢出攻击。但是可以使用DEBUG来进行,然后查看CPU的寄存器,主要是查看EIP(PC)寄存器是否变成了我们攻击中使用的字符。
第一步,使用重复字符来判断EIP中出现的地址是否是我们攻击字符的ASCII码,由于使用重复字符如,AAA...所以很好判断
第二步,使用递增或有规律的字符如ABCDEFG...来确定是那一部分进入了EIP,假如是EFGH。
第三步,使用EF00,EF01...来代替原来的EFGH,然后就会发现是哪个EFGH进入了EIP,这样就能确定具体的溢出攻击代码长度!
但是,现在我们知道了应该在输入字符串中的什么位置放入返回地址,但是我们怎么保证这个地址就会跳转到我们想要执行的程序处呢?这个概率非常之小。但是我们可以使用CPU的NOP指令来帮忙,如果我们在一段内存中存入一长串NOP,后面跟上我们要执行的代码,然后只要我们输入的返回地址能够跳到NOP中,那么机器就一定会顺序执行到我们想要执行的恶意代码!这就大大提高了准确率。当然,想一下就知道,别人的程序在运行,我们只有从输入处才能输入我们的代码,所以我们的输入中应该包含一堆NOP和想要执行的代码,但是程序在执行时,栈空间乃至程序空间数据空间都是我们不知道的,所以我们将NOP在内存(也就是栈)中的地址写入返回地址中的概率还是很小的。当然,如果写不成功,将不会执行我们想要执行的代码,但是会导致程序崩溃!因为返回地址不是该程序正确执行的地址。
还需要考虑的是,缓冲区大小的问题,如果缓冲区特别小,放入NOP也就特别少,否则返回地址都被NOP覆盖了。这里NOP要根据特定CPU的类型来写。当然,当有很多NOP在网络中传输时,会被IDS检测到,但是可以使用变相的NOP指令,如跳转到下一条指令处执行的指令,对某个寄存器加0的指令,对某个寄存器乘以1的指令等,只要结果如NOP指令这样让程序顺序执行到我们想要执行的代码处就可以了。
常见的缓冲区溢出攻击程序的结构如下
NOP
NOP
NOP
:
:
执行一个shell的机器代码
指向NOP区的返回地址
缓冲区溢出攻击原理
最新推荐文章于 2023-05-22 12:04:41 发布