gpt4 book ai didi

c - 段错误仅出现在 GDB 中

转载 作者:IT王子 更新时间:2023-10-29 00:39:10 24 4
gpt4 key购买 nike

为什么下面的程序在执行时没有崩溃,而是在GDB中出现segfault而崩溃?在 32 位 x86(Athlon 64,如果重要的话)上使用 GCC 4.5.2 编译。

#include <stdio.h>
#include <string.h>

int modify(void)
{
__asm__("mov $0x41414141, %edx"); // Stray value.
__asm__("mov $0xbffff2d4, %eax"); // Addr. of ret pointer for function().
__asm__("mov %edx, (%eax)");
}

int function(void)
{
modify();

return 0;
}

int main(int argc, char **argv)
{
function();

return 0;
}

mov $0xbffff2d4, %eax 是使用 GDB 确定的,用于查找存储“function”函数的返回指针的地址。这在不同的系统上可能会有所不同。为此禁用了 ASLR。

当我执行程序时,没有任何反应。也没有关于 dmesg 崩溃的报告。但是,当我在 GDB 中执行相同的程序时:

Program received signal SIGSEGV, Segmentation fault.
0x41414141 in ?? ()
=> 0x41414141: Cannot access memory at address 0x41414141

这也是我正常执行程序时预计会发生的情况。当其他程序崩溃时,我确实会像往常一样遇到段错误,而且我可以轻松编写一个小程序,使其崩溃并出现良好的段错误。但为什么这个特定程序不会因段错误而崩溃?

最佳答案

即使完全禁用 ASLR,您仍然可以获得随机堆栈和堆。您可以使用 norandmaps 内核启动参数或在运行时通过将 /proc/sys/kernel/randomize_va_space 设置为零来全局关闭它。这也是流程个性的一部分。

在 GDB 中,您可以使用 disable-randomization 设置来调整它:

(gdb) help set disable-randomization
Set disabling of debuggee's virtual address space randomization.
When this mode is on (which is the default), randomization of the virtual
address space is disabled. Standalone programs run with the randomization
enabled by default on some platforms.

作为一个小的测试程序来说明这一点,你可以打印一个局部变量的地址,比如:

#include <stdio.h>

int main(int argc, char **argv)
{
printf("%p\n", &argc);
return 0;
}

关于c - 段错误仅出现在 GDB 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com