我正在尝试执行缓冲区溢出以将调用从函数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();
}
}
答案 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
运行GDB
并反汇编我计算机上的功能,functionA()
的地址为0x400679
,functionB()
的地址为40068a
。如果您看到main函数的反汇编代码,则会调用地址0x400679
,您想要的是将其更改为40068a
。
基本上,你必须在函数fillBuff
中溢出缓冲区,并在到达指针的空间后,你必须填写地址。文章展示了如何做到这一点。
答案 1 :(得分:0)
缓冲区溢出在C中是未定义的行为。缓冲区溢出时不保证会发生任何事情,并且只要我知道语言不需要局部变量的特定内存布局和/或存储返回地址。除此之外,一些编译器插入堆栈保护器以使缓冲区溢出攻击更加困难。
如果您想要定义行为,您将需要查看生成的程序集并找出缓冲区溢出将要执行的操作。根据生成的程序集,您可以确定堆栈布局和地址布局,并尝试使用不同的函数地址覆盖返回地址。
如果您正在使用GCC,则打印出程序集的命令行选项为-Wa,-al
。如果您需要英特尔语法,请添加-masm=intel
。