2015-11-20 19 views
0

我试图执行缓冲区溢出以将函数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(); 
    } 
} 
+0

顺便说一句,如果声明时没有参数,你应该把void放在函数的参数大括号中。将它们留空并不意味着没有参数。 –

+0

看到这个答案:http://stackoverflow.com/a/27214515/3846218 – AlexPogue

回答

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。如果您看到主要功能的反汇编代码,则会调用地址0x400679,并且您想要将其更改为40068a。 基本上,你必须溢出功能fillBuff中的缓冲区,并在到达指针的空间后,你必须填写地址。文章展示了如何去做。

+0

如果你打算使用一个调试器,ollydbg/EDB(取决于你的操作系统)有点适合这种事情,因为他们有一个显示寄存器和内存值的gui,并在这些值发生变化时突出显示。如果您只是计划使用GDB来转储程序集而不是单步执行它,但它并不重要。 –

+1

是的,DDD(https://www.gnu.org/software/ddd/)是命令行GDB debbuger的前端。 – ViniciusArruda

+0

谢谢。这非常有帮助 – Nych

0

缓冲区溢出是在C.没有什么不确定的行为,保证当你缓冲区溢出来进行,而据我所知的语言不需要局部变量特定的内存布局和/或存储返回地址。除此之外,一些编译器插入堆栈保护器,使缓冲区溢出攻击更加困难。

如果你想定义行为,你将需要看看生成的程序集,并找出缓冲区溢出要做什么。根据生成的程序集,您可以确定堆栈布局和地址布局,并尝试用另一个函数的地址覆盖返回地址。

如果您使用的是GCC,打印出部件的命令行选项为-Wa,-al。如果您需要英特尔语法,请添加-masm=intel