我对溢出攻击原理的认识
溢出攻击大家都听烦了吧!........我本来也不再想说的
前今天有位网友和我争了很久.他认为这种攻击是让返回点
指向堆栈里的SHELL CODE! 这句话是没说错.他还补了句有
的高级系统里堆栈是不可执行的.所以不可行!它认为CODE
在堆栈段里面就是在这个段里执行了.
对于前个观点是不争的事实.但后面的!!!............
关堆栈段的不可执行什么事(本来数据段就是不可执行的)
我想可能还有不少同学们还没看清楚这里的原理....
**************************************************
注意呀!以下的字句要认认真真的看.认认真真的想哦!
**************************************************
首先我们利用被调过程的BUG(主要是它自己没有对自己
的局部变量空间(堆栈)的界限做安全检查.)这样它会把自己
的堆栈中的过程返回地址(EIP)给改变...定位原来返回地址
我上次就说过了,这里不说了.你想它传入的移量你可以是放
在堆栈里的SHELL CODE(你如果把SHELL CODE放在局部数组里
就是堆栈里..)也可以放在你的数据段里.(静态数组)不然也
可以是自己的一个过程.(这时是在你的代码段里) 好了反正
你有一个移量是指向这个CODE了.
下面我来说明它的执行.
首先.被调过程执行RET 段间返回.(如果是段
间返回难度就很大了.你还要小心段址)这时它自己的堆栈里
POP 32位的一个值给EIP(当然这时它变成你的CODE移里了.)
说明下是这个过程自己的BUG说白了是它自己改的....
****注意****
因为现在EIP为你CODE的移量.而这个移量是相对于你的
数据段,或堆栈段,或代码段的....要看你的CODE放在哪个段了.
****注意****
而这个时候,
代码段并没有变(是段间返回嘛)还是被调过程所在的代码段....
但它还是执行了你的SHELL代码.为什么呢????????
有些人可能认为是在执行堆栈段!!!不对.
你这时就可以推出...现在所在的代码段的基址和你SHELL CODE
所在的段的基址是一样的.(只有这样你的代码才可能被准确执行)
就拿WIN9X来说吧!一个WIN32位用户程序在运行时.它的代码段的
基址为0,限长为XXXX可以不管哦. 而数据段,堆栈段指向同一个
段.呵呵.而且基址也为0. 在这种情况下你就会知道比如一个侈量
0,在代码段和数据段同指向一个物理地址.所以你给代码段一个相
对于堆栈段的移量就是指向代码段的同一个地方.(这句话好像有点
难理解)
再说刚才的情况吧!因为返回的移量是相对于CODE所在的段的.而
这时CODE可以被执行就说明了一切....(两段的基址相同)
大家可以看看有关保护方式的内存地址传换方式....
基址+移量=线址 ....线址一样的话..在同一个进程(页表相同)物理
地址就一样了.所以呵呵.大家明白了吧!
在LINUX里我不知道进程的内存环境所以不清楚我想可以用的话.是
一个道理!.反正在WIN9X里是这一定了...
反正一句话.这里一定不是执行堆栈段的代码(这种说法很可笑的.说明没
弄明白).真正的事实是.利用了堆栈段和代码段的基址相同准确定位了.
SHELL CODE 在被攻击代码段的移量...
我是这样认为了.如果有哪位高手可以指正小弟的错误观点.我会感谢
他的.---(我请它吃糖哦!!!!!)
发布人:netbull 来自:奥索网