首先关闭计算机我运行它是在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代码。
编辑:尝试
答案 0 :(得分:1)
答案 1 :(得分:0)
阅读R M链接的文章后:
addr [1] = bar;
addr [5] = addr [4];
addr [4] = bar;
结果发挥作用。