无论我如何在C中编码它,为什么int变量不会在char数组之前进行寻址?

Joe*_*oeB 8 c stack buffer frames overflow

我正在阅读Hacking:剥削艺术(第2版),我目前正在讨论缓冲区溢出问题.

在第一个示例中,变量按以下顺序声明/初始化:

int auth_flag = 0;
char password_buffer[16];
Run Code Online (Sandbox Code Playgroud)

这个例子接着解释,你可以使用gdb来检查auth_flagpassword_buffer的地址,你会发现auth_flag的地址是高于password_buffer的.要记住的事情:我在Macbook Pro(英特尔处理器,64位)上的Virtualbox中运行Ubuntu中的所有这些.

我编译了第一个例子的代码,如下所示: gcc -g -fno-stack-protector -o auth_overflow auth_overflow.c

正如所料,auth_flag地址高于password_buffer's.

为了解决上面提出的问题,作者解释说你应该切换声明的顺序:

char password_buffer[16];
int auth_flag = 0;
Run Code Online (Sandbox Code Playgroud)

我以相同的方式编译代码: gcc -g -fno-stack-protector -o auth_overflow2 auth_overflow2.c

不幸的是,我没有看到auth_flag地址低于password_buffer.事实上,它仍然更高.为什么是这样?我究竟做错了什么?

Kar*_*ldt 5

允许编译器选择它想要的任何顺序,以便提供更优化的代码,或者甚至只是随机的,因为它更容易实现.您可能尝试的一件事是-O0禁用所有优化的标志.


Zan*_*ynx 1

编译器可以自由地重新排列他们认为最好的变量。我相信唯一的限制是结构成员的顺序。它们在内存中的顺序必须与结构中声明的顺序相同。