缓冲区溢出利用更改函数调用

buffer overflow exploit change function call

我正在尝试执行缓冲区溢出以将调用从函数 A 更改为函数 B。这可行吗?我知道在我控制 return 指针之前我必须弄清楚我必须输入多少字节,并弄清楚函数 B 的地址。是否可以更改它以便在 [=13= 之后] 我们注入函数 B 的地址而不是函数 A? 编辑: 有没有可能在 fillbuff 被调用之后,而不是 returning 到 main,我们将它发送到函数 B? 任何提示表示赞赏。

int fillBuff(int x){
    char buff[15];
    puts("Enter your name");
    gets(buff);
    return(x + 5);
}

void functionA(){
    puts("I dont want to be here");
    exit(0);
}
void functionB(){
    printf("I made it!");
    exit(0);
}


int main(){
    int x;
    x = fillbuff(5);
    if (x == 10){
        functionA();
    }
}

缓冲区溢出在 C 语言中是未定义的行为。缓冲区溢出时不会发生任何事情,据我所知,该语言不需要为局部变量 and/or 存储的特定内存布局return 个地址。除此之外,一些编译器插入堆栈保护器使缓冲区溢出攻击更加困难。

如果您想定义行为,您将需要查看生成的程序集并弄清楚缓冲区溢出将要做什么。根据生成的程序集,您可以确定堆栈布局和地址布局,并尝试用不同的函数地址覆盖 return 地址。

如果您使用的是 GCC,打印程序集的命令行选项是 -Wa,-al。如果您需要 Intel 语法,请添加 -masm=intel.

这是一篇介绍如何操作的文章:http://insecure.org/stf/smashstack.html

像这样编译你的程序:gcc -g -c program.c(使用 -g) 和 运行 gdb ./a.out。之后,运行 命令 disas main。您应该看到代码的反汇编以及它在您的内存中的组织方式。您可以将 main 函数替换为任何其他函数并查看其代码。 有关反汇编的更多信息,请参阅:https://sourceware.org/gdb/onlinedocs/gdb/Machine-Code.html

运行GDB在我的电脑上反汇编函数,functionA()的地址是0x400679functionB()的地址是40068a.如果你看main函数的反汇编代码,有一个地址0x400679的调用,你要的是改成40068a。 基本上,你必须在函数 fillBuff 中溢出缓冲区,并且在到达指针的 space 之后,你必须填充地址。文章展示了如何做到这一点。