我真的不知道提问者或这里的任何人/每个人的技术能力水平如何,所以让我们试着从最底层开始,用我能做到的最简单的语言进行工作。如果您拥有计算机科学硕士学位,或者您是 ROP 传奇人物或其他任何人,请不要被冒犯...
为了理解所讨论的漏洞利用,即使是在基本层面上,您也需要对计算机的计算方式有所了解,即您需要了解“存储程序控制”机器的基本原理。一旦你掌握了这一点,我们就可以讨论一般的缓冲区溢出攻击。然后,一旦我们了解了缓冲区溢出,我们就对这两件事都有了理解,我们可以开始查看具体的示例,尽管如此,使用这些更高级技术中的一些的相对高级的示例,并希望真正了解它们的任何细节。
从最底部开始,让我们简单谈谈计算机如何计算或处理器如何处理......在您的计算机中,您有一个 CPU,而 CPU 有各种寄存器,它可以在这些寄存器上进行直接的数学运算。计算机也有内存,程序从这里加载和运行。有一个称为指令指针的特殊寄存器,它的工作是指向内存中当前正在运行的程序指令所在的位置,以便 CPU 可以获取并执行它。它会一一执行指令,直到跳转或分支或返回等。然后它将更改指令指针,使其指向内存中的不同位置并继续执行。这个指令指针非常重要。如果你能劫持它,你也许可以让计算机运行你放在内存其他地方的东西。见过那些写着“Got EIP”的 T 恤吗?这就是我们在这里所说的。如果你能控制 EIP,你就可以控制机器。
现在,让我们从这个“机器级别”“上移”一点。大多数现代编程语言都有这个子程序调用的概念。这将导致指令指针跳转到函数代码所在的新内存区域。该函数将运行直到完成,然后控制权将返回到主程序,导致指令指针被设置回主函数中之前停止执行的位置。为了简化一点……所以你已经让这个程序运行了,它一直运行到它得到一个函数调用。函数调用会将执行移动到内存中的不同位置。然后它将在新位置运行,直到返回。此时它必须返回主函数。应该清楚的是机器会记住初始值,初始指令指针的值,否则它不会知道这里返回。这称为返回指针。因此返回指针包含调用函数的地址,并存储在称为堆栈的数据结构(在内存中)中。堆栈以 LIFO 方式工作,后进先出,因此它被称为“堆栈”。最后进的就是第一个出的。通常堆栈包含与函数调用相关的东西。将堆栈视为一种用于记住小事的便笺。因此,当进行函数调用时,首先被压入堆栈的是函数调用参数..如果有的话..然后它将主程序中的指令指针的值压入堆栈(返回指针)。然后调用函数本身,并在堆栈上为函数本身的局部变量分配空间。该函数一直执行它,直到它返回。在这一点上,这些局部变量从堆栈中退出(弹出),然后返回指针被弹出,并且再次被设置为指令指针 - 我们返回到主程序中的执行。这实际上在您面前的计算机上每秒发生数百万次。
现在,让我们进入缓冲区溢出错误。缓冲区溢出一类称为代码错误的错误。缓冲区溢出已经有几十年的历史了,但直到 1996 年 Aleph One 的开创性论文“Smashing the Stack for Fun and Profit”出现在 Phrack 杂志第 49 期时才成为主流。即使在今天,它也值得一读。缓冲区溢出允许攻击者将数据发送到目标机器并执行一些代码,即在盒子上获得 root/admin。有些在本地工作,有些在网络上工作。基本思想是一个程序接受用户输入,但在移动数据之前没有正确检查数据的大小。这是关于没有对输入字段进行适当的边界检查。想想把很大的东西塞进一个小盒子里。我赢了'
几小时后回来查看。我得马上去。我会回来的。我将讨论有问题的具体漏洞。抱歉,如果此站点的这种非典型或常见行为,我是新来的。只去过几次。