0

我正在尝试通过缓冲区溢出来查看堆栈粉碎。更准确地说,我正在尝试更改堆栈中的返回地址,以便返回而不是调用调用函数,将控件重定向到我的代码。但我的半生不熟的知识似乎正在妨碍我。我的代码如下:

#include<stdio.h>
#include<string.h>

int main(int argc, char **argv)
{
    int a;  
    func(argv[1]);
    printf("This message must not be printed");
    return(0);

}

int func(char *arg)
{
    char buffer[10];
    strcpy(buffer,arg);
    printf("The buffer says..[%s/%p].\n",buffer,&buffer);
    return (0);
}

void virus()
{   
    printf("I am a virus");
    exit(0);
}

我显然希望函数“virus”的执行,而不是在“func”执行后控制返回到 main()。我的编译命令是:

gcc -g -O0 <filename.c> -fno-stack-protector

另外,我禁用了内核的地址空间随机化选项。我尝试输入 12345678911111111111111110x7ffc7829bb36(即 1-9 后跟 16 个 1)。原因是 9 字节缓冲区 + 8 字节地址指针 + 8 字节旧帧指针(总共 16 个 1)。最后的十六进制是在“缓冲区”变量的地址上加上 16 个字节的结果。执行后,控件并没有回到主功能,但它也没有回到我的“病毒”功能。显示来自“func”的消息,然后附加一个段故障消息。这里可能有什么问题?我的猜测是,即使使用 gdb 调试器,我也不知道如何计算目标地址。任何帮助都会对我有用。谢谢

4

0 回答 0