我正在阅读Smashing the Stack for Fun and Profit(特别是,这篇文章指的是"Buffer Overflows"部分).这篇文章是为32位机器编写的,但我正在研究64位,我在我的例子中考虑了这一点.一个特殊的例子是导致一些我无法解释的问题.example3.c具有覆盖返回地址以跳过main函数中的指令的功能.这是我的代码:
#include <stdio.h>
void function(int a, int b, int c)
{
char buf1[5];
char buf2[10];
int *retptr;
retptr = (void*)(buf2 + 40);
(*retptr) += 8;
}
int main(void)
{
int x;
x = 0;
function(1,2,3);
x = 1;
printf("%d\n", x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用gcc v4.8.2使用以下命令编译此程序:
gcc example3.c -o example3
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下,gcc编译器似乎实现了一些堆栈保护,例如地址空间布局随机化和堆栈金丝雀.我在计算ret指针值时考虑了这些安全措施.这是由gcc example3.c -S -fverbose-asm -o stack-protection.s以下产生的相应组件
:
.file "example3.c"
# GNU C (Ubuntu 4.8.2-19ubuntu1) version 4.8.2 (x86_64-linux-gnu)
# compiled by …Run Code Online (Sandbox Code Playgroud)