缓冲区溢出利用更改函数调用
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()
的地址是0x400679
,functionB()
的地址是40068a
.如果你看main函数的反汇编代码,有一个地址0x400679
的调用,你要的是改成40068a
。
基本上,你必须在函数 fillBuff
中溢出缓冲区,并且在到达指针的 space 之后,你必须填充地址。文章展示了如何做到这一点。
我正在尝试执行缓冲区溢出以将调用从函数 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()
的地址是0x400679
,functionB()
的地址是40068a
.如果你看main函数的反汇编代码,有一个地址0x400679
的调用,你要的是改成40068a
。
基本上,你必须在函数 fillBuff
中溢出缓冲区,并且在到达指针的 space 之后,你必须填充地址。文章展示了如何做到这一点。