当前位置:Linux教程 - Linux - 我对溢出攻击原理的认识

我对溢出攻击原理的认识



        
    溢出攻击大家都听烦了吧!........我本来也不再想说的
    前今天有位网友和我争了很久.他认为这种攻击是让返回点
    指向堆栈里的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 来自:奥索网