在堆栈的末尾,有一个保护页被映射为不可访问的内存——如果程序访问它(因为它试图使用比当前映射更多的堆栈),就会出现访问冲突。
_chkstk() 是一个特殊的编译器辅助函数,它
确保局部变量有足够的空间
即它正在做一些堆栈探测(这是一个LLVM 示例)。
这种情况是特定于 Windows 的。所以Windows有一些解决问题的方法。
让我们考虑 Linux(或其他一些类 Unix)下的类似情况:我们有很多函数的局部变量。第一个堆栈变量访问在堆栈段后面(例如mov eax, [esp-LARGE_NUMBER],这里 esp-LARGE_NUMBER 是堆栈段后面的内容)。是否有任何功能可以防止可能的页面错误或 Linux(可能是其他类 Unix)或开发工具(如gcc、clang等)中的任何功能?-fstack-check(GCC 堆栈检查)是否以某种方式解决了这个问题?这个答案表明它与_chkstk().
PPS 一般来说,问题是关于操作系统(最重要的Linux与 Windows)之间的实现差异,这些方法与大量堆栈变量作斗争,爬到堆栈段后面。添加 C++ 和 C 标记是因为它是关于 Linux 本地二进制生成的,但汇编代码与编译器相关。
我对Stack Guard和SSP保护有一些疑问。如果我正确的话,第一个问题是关于Stack Guard及其三种类型的Canary-终止符,随机和随机XOR。
我想知道,如何在x86 Linux系统上禁用Stack Guard?在我读过的某个地方,可以使用此命令进行操作,同时使用gcc'-disable-stackguard-randomization ' 进行编译,就像使用该命令启用' -enable-stackguard-randomization '一样,两者均无效。如果需要,我的gcc版本是4.8.2。
关于Stack Guard的下一个问题,何时可以启用/禁用它,如何设置,要使用哪种类型的金丝雀?我读到的内容是,默认情况下使用终结器金丝雀,对于随机性,我必须使用' -enable-stackguard-randomization ' 进行编译,但是随机XOR又如何呢?(或为空0x00000000)
现在关于SSP(ProPolice),我知道,对于随机的金丝雀,我必须使用' fstack-protector-all ' 进行编译,但是终止符如何呢?默认情况下,它与Stack Guard中的一样吗?
最后一个,如果你们中的任何一个都可以告诉我,我在哪里可以找到内存中的随机金丝雀。例如,我有这种情况-编译的C程序,例如' gcc -g example.c -o example -fstack-protector-all ',因此具有随机金丝雀。假设,每次执行后,我都能获得金丝雀的地址。因此,我有:Canary = 0x1ae3f900。从不同的论文中,我得到了一些信息,即金丝雀位于.bss段中。因此,我使用readelf获取.bss段的地址:' readelf -a ./example | grep bss '。是080456c9。在gdb中,我设置了一些断点,以获取金丝雀的地址,但是当我检查.bss地址x / 20x 0x080456c9时,我看到的只是0x00000000地址,而金丝雀却无处可寻。另外,我检查了__stack_chk_fail如果它不存在,但是结果相同,我看不到它。我从PLT / GOT获取stack_chk_fail的地址。
预先感谢您的答复和时间。
在我的C程序中,当我尝试分配此数组值时:
double sample[200000][2];
Run Code Online (Sandbox Code Playgroud)
我收到了分段错误错误.但是当我使用时:
double sample[20000][2]
Run Code Online (Sandbox Code Playgroud)
有用!!这些指数值是否有限制?
我有一个反向排序的堆。我正在尝试构建最大堆:
我有代码:
int main(int argc, char *argv[])
{
int heapArray[] = {0, 1, 2, 3, 4, 5, 6 , 7, 8 ,9 ,10 , 11, 12, 13 ,14 ,15};
int n = sizeof(heapArray)/sizeof(int);
printTree(heapArray, n);
buildHeap(heapArray, n);
printTree(heapArray, n);
}
void buildHeap(int array[], int n)
{
printf("buildHeap\n");
int i = (n-1)/2;
while(i > 0) heapify(array, n, i--);
}
void heapify(int array[], int n, int i)
{
printf("heapify [%i] = %i\n", i, array[i]);
int childLeft = 0, childRight = 0;
int …Run Code Online (Sandbox Code Playgroud) c ×3
gcc ×2
arrays ×1
assembly ×1
heap ×1
heapsort ×1
linux ×1
linux-kernel ×1
protection ×1
random ×1
stack-memory ×1
x86 ×1