堆栈缓冲区溢出检测机制?
Mechanisms for stack buffer overflow detection?
编译并运行以下内容:
void main() {
int array[10];
array[10] = 2;
}
根据我的理解,这是堆栈运行。
GCC 似乎没有检测到问题。
只有当我使用附加标志 -fstack-protector-all
进行编译时,我才能获得堆栈跟踪。
对于没有 gcc 标志 -fstack-protector-all
编译和链接的二进制文件,有没有办法检测错误的非法内存访问 -fstack-protector-all
,或者它将 运行 正常,然后进程将访问内存属于它吗?
首先,许多现代发行版将默认启用 -fstack-protector
和其他安全措施(_FORTIFY_SOURCE
、-fPIE
等),因此即使没有,您的程序也会得到一些保护你自找的。
其次,如果不是这种情况并且缓冲区溢出导致非常严重的错误(例如访问无效内存或覆盖return地址),内核将终止应用程序和转储核心。
更细微的错误(导致程序故障但不是以明显的方式),将不会被发现。没有例如,没有办法诊断它们。用 ASan 重新编译。
P.S。请记住,像您问题中的那样简单的单行缓冲区溢出往往会被编译器优化。我的 GCC 5.4.0 只是放弃了对 array[10]
.
的访问
编译并运行以下内容:
void main() {
int array[10];
array[10] = 2;
}
根据我的理解,这是堆栈运行。
GCC 似乎没有检测到问题。
只有当我使用附加标志 -fstack-protector-all
进行编译时,我才能获得堆栈跟踪。
对于没有 gcc 标志 -fstack-protector-all
编译和链接的二进制文件,有没有办法检测错误的非法内存访问 -fstack-protector-all
,或者它将 运行 正常,然后进程将访问内存属于它吗?
首先,许多现代发行版将默认启用 -fstack-protector
和其他安全措施(_FORTIFY_SOURCE
、-fPIE
等),因此即使没有,您的程序也会得到一些保护你自找的。
其次,如果不是这种情况并且缓冲区溢出导致非常严重的错误(例如访问无效内存或覆盖return地址),内核将终止应用程序和转储核心。
更细微的错误(导致程序故障但不是以明显的方式),将不会被发现。没有例如,没有办法诊断它们。用 ASan 重新编译。
P.S。请记住,像您问题中的那样简单的单行缓冲区溢出往往会被编译器优化。我的 GCC 5.4.0 只是放弃了对 array[10]
.