相关疑难解决方法(0)

Linux 进程堆栈被局部变量溢出(堆栈保护)

_chkstk() 函数的目的是什么?

在堆栈的末尾,有一个保护页被映射为不可访问的内存——如果程序访问它(因为它试图使用比当前映射更多的堆栈),就会出现访问冲突。

_chkstk() 是一个特殊的编译器辅助函数,它

确保局部变量有足够的空间

即它正在做一些堆栈探测(这是一个LLVM 示例)。
这种情况是特定于 Windows 的。所以Windows有一些解决问题的方法。

让我们考虑 Linux(或其他一些类 Unix)下的类似情况:我们有很多函数的局部变量。第一个堆栈变量访问在堆栈段后面(例如mov eax, [esp-LARGE_NUMBER],这里 esp-LARGE_NUMBER 是堆栈段后面的内容)。是否有任何功能可以防止可能的页面错误或 Linux(可能是其他类 Unix)或开发工具(如等)中的任何功能?-fstack-checkGCC 堆栈检查)是否以某种方式解决了这个问题?这个答案表明它与_chkstk().

PS 这些帖子12没有多大帮助。

PPS 一般来说,问题是关于操作系统(最重要的Linux与 Windows)之间的实现差异,这些方法与大量堆栈变量斗争,爬到堆栈段后面。添加 C++ 和 C 标记是因为它是关于 Linux 本地二进制生成的,但汇编代码与编译器相关。

c linux assembly gcc stack-memory

9
推荐指数
1
解决办法
314
查看次数

Stack Guard和Stack Smashing Protection-金丝雀,内存

我对Stack Guard和SSP保护有一些疑问。如果我正确的话,第一个问题是关于Stack Guard及其三种类型的Canary-终止符,随机和随机XOR。

  1. 我想知道,如何在x86 Linux系统上禁用Stack Guard?在我读过的某个地方,可以使用此命令进行操作,同时使用gcc'-disable-stackguard-randomization ' 进行编译,就像使用该命令启用' -enable-stackguard-randomization '一样,两者均无效。如果需要,我的gcc版本是4.8.2。

  2. 关于Stack Guard的下一个问题,何时可以启用/禁用它,如何设置,要使用哪种类型的金丝雀?我读到的内容是,默认情况下使用终结器金丝雀,对于随机性,我必须使用' -enable-stackguard-randomization ' 进行编译,但是随机XOR又如何呢?(或为空0x00000000)

  3. 现在关于SSP(ProPolice),我知道,对于随机的金丝雀,我必须使用' fstack-protector-all ' 进行编译,但是终止符如何呢?默认情况下,它与Stack Guard中的一样吗?

  4. 最后一个,如果你们中的任何一个都可以告诉我,我在哪里可以找到内存中的随机金丝雀。例如,我有这种情况-编译的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的地址。

预先感谢您的答复和时间。

random x86 gcc protection linux-kernel

7
推荐指数
1
解决办法
2030
查看次数

尝试声明一个大数组时,分段错误和核心转储

在我的C程序中,当我尝试分配此数组值时:

double sample[200000][2];
Run Code Online (Sandbox Code Playgroud)

我收到了分段错误错误.但是当我使用时:

double sample[20000][2]
Run Code Online (Sandbox Code Playgroud)

有用!!这些指数值是否有限制?

c arrays

5
推荐指数
2
解决办法
3547
查看次数

C 语言中的堆化问题

我有一个反向排序的堆。我正在尝试构建最大堆:

我有代码:

    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 heap heapsort data-structures

-1
推荐指数
1
解决办法
9294
查看次数