利用堆栈缓冲区溢出

时间:2014-04-04 00:58:51

标签: c x86 buffer-overflow

首先关闭计算机我运行它是在32位堆栈上运行Linux的Intel系统。我的教授在课堂上向我们提出了一个挑战问题。

在我提出问题之前,这是代码

// funWithFooAndBar.c
#include <stdio.h> 
#include <stdlib.h> 

void bar() 
{ 
 printf("Now inside bar()!\n"); 
} 

void foo() 
{ 
 void *addr[1]; 

 printf("Now inside foo()!\n"); 
 // this is where I need to modify my code, 
 //I was given the hint that it will only be two lines of code 
 // So something like: 
addr[1] = bar;
addr[5] = addr[4];
addr[4] = bar;;

} 

int main (int argc, char *argv[]) 
{ 
 foo(); 
 printf("Back in main\n"); 
 return 0; 
} 

目标是通过在数组末尾写入来粉碎堆栈,然后覆盖返回地址,以便函数调用foo()返回到main(返回main)的路径。所以我的输出应该是这样的:

现在在foo()!

里面

现在在吧()!

回到主要

为了做到这一点,我必须溢出数组,以便用bar的地址覆盖返回地址。我很确定它必须涉及函数bar()的地址,这将是等于&amp; bar()

他提出的问题是我们可以添加两行代码(我评论的地方),使输出如上所示。

谢谢!

编辑:我希望更多的解释而非直接回答,我知道我应该做什么,而不是如何将其转换为c代码。

编辑:尝试

2 个答案:

答案 0 :(得分:1)

我建议阅读这篇文章,以了解教授正在寻找的内容,而不是给你答案。

Smashing the Stack for Fun and Profit

(对不起,我会在评论中发帖,但我还不能发表评论。)

答案 1 :(得分:0)

阅读R M链接的文章后:

addr [1] = bar;

addr [5] = addr [4];

addr [4] = bar;

结果发挥作用。