缓冲区溢出利用更改函数调用
我试图执行缓冲区溢出以将函数A中的调用更改为函数B.这是否可行?我知道我必须弄清楚我必须输入多少个字节,直到控制返回指针为止,并找出函数B的地址。是否可以改变它,以便在“x == 10”后注入函数B的地址而不是函数A? 编辑: 是否有可能在调用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();
}
}
这是一篇文章,展示了如何去做: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
。如果您看到主要功能的反汇编代码,则会调用地址0x400679
,并且您想要将其更改为40068a
。 基本上,你必须溢出功能fillBuff
中的缓冲区,并在到达指针的空间后,你必须填写地址。文章展示了如何去做。
如果你打算使用一个调试器,ollydbg/EDB(取决于你的操作系统)有点适合这种事情,因为他们有一个显示寄存器和内存值的gui,并在这些值发生变化时突出显示。如果您只是计划使用GDB来转储程序集而不是单步执行它,但它并不重要。 –
是的,DDD(https://www.gnu.org/software/ddd/)是命令行GDB debbuger的前端。 – ViniciusArruda
谢谢。这非常有帮助 – Nych
缓冲区溢出是在C.没有什么不确定的行为,保证当你缓冲区溢出来进行,而据我所知的语言不需要局部变量特定的内存布局和/或存储返回地址。除此之外,一些编译器插入堆栈保护器,使缓冲区溢出攻击更加困难。
如果你想定义行为,你将需要看看生成的程序集,并找出缓冲区溢出要做什么。根据生成的程序集,您可以确定堆栈布局和地址布局,并尝试用另一个函数的地址覆盖返回地址。
如果您使用的是GCC,打印出部件的命令行选项为-Wa,-al
。如果您需要英特尔语法,请添加-masm=intel
。
顺便说一句,如果声明时没有参数,你应该把void放在函数的参数大括号中。将它们留空并不意味着没有参数。 –
看到这个答案:http://stackoverflow.com/a/27214515/3846218 – AlexPogue