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

时间:2015-11-20 02:38:08

标签: c buffer-overflow exploit shellcode

我正在尝试执行缓冲区溢出以将调用从函数A更改为函数B.这是否可以执行?我知道在必须控制返回指针之前我必须弄清楚要输入多少字节,然后找出函数B的地址。是否可以改变它以便在" x == 10&之后#34;我们注入函数B的地址而不是functionA? 编辑: 是否有可能在调用fillbuff后,而不是返回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();
    }
}

2 个答案:

答案 0 :(得分:2)

以下是一篇展示如何操作的文章: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

enter image description here

运行GDB并反汇编我计算机上的功能,functionA()的地址为0x400679functionB()的地址为40068a。如果您看到main函数的反汇编代码,则会调用地址0x400679,您想要的是将其更改为40068a。 基本上,你必须在函数fillBuff中溢出缓冲区,并在到达指针的空间后,你必须填写地址。文章展示了如何做到这一点。

答案 1 :(得分:0)

缓冲区溢出在C中是未定义的行为。缓冲区溢出时不保证会发生任何事情,并且只要我知道语言不需要局部变量的特定内存布局和/或存储返回地址。除此之外,一些编译器插入堆栈保护器以使缓冲区溢出攻击更加困难。

如果您想要定义行为,您将需要查看生成的程序集并找出缓冲区溢出将要执行的操作。根据生成的程序集,您可以确定堆栈布局和地址布局,并尝试使用不同的函数地址覆盖返回地址。

如果您正在使用GCC,则打印出程序集的命令行选项为-Wa,-al。如果您需要英特尔语法,请添加-masm=intel