杂谈:缓冲区溢出攻击

缓冲区溢出攻击是利用缓冲区溢出漏洞,找到一个合适的位置放置shellcode的一种攻击。

有几点基础知识:

(1)每段程序都有栈空间,用于存放局部变量,叫做栈帧。如函数foo,函数main等都有其一段栈空间。

(2)栈帧的地址是栈底在高地址,栈顶在低地址。栈的增长是往低地址方向增长的。

示例代码:

#include 
#include 
char largebuff[] ="01234567890123456789ABCDEFGH";  //28 bytes
void foo()
{
    char smallbuff[16];
    //char smallbuff[32];
    strcpy (smallbuff, largebuff);
}
int main (void)
{
    foo();
}

程序调试执行,会依次进入main的栈帧、foo的栈帧、strcpy的栈帧。如果在strcpy的栈帧中,它最终要返回的地址不是foo栈帧,而是一段shellcode那么就攻击成功了。这样的条件是largebuff要大于smallbuff与栈底的偏倚。

所以实现缓冲区溢出攻击的首要目标是构造一个合适的攻击串,使得执行strcpy操作时,返回的不是调用strcpy的函数的栈地址,而是一段新的攻击代码。

杂谈:缓冲区溢出攻击_第1张图片

 如图所示,跳转地址所在的其实本来是strcpy的栈底地址,也就是调用strcpy的函数foo的栈顶地址(因为栈帧是相邻的),现在构造的串就如图所示了,shellcode放在跳转地址之后,覆盖掉本来的汇编指令。在win32中,跳转地址一般在动态内存库中如KERNEL.dll,这里实际上是跳转指令的地址。

为了达到上述目的,就需要对代码进行反汇编,以得到返回地址,再构造攻击串。具体方法参考曾老师ppt。

你可能感兴趣的:(网络安全实验)