C SIGSEGV分段错误,不同消息

C SIGSEGV分段错误,不同消息,c,gcc,gdb,buffer-overflow,segmentation-fault,C,Gcc,Gdb,Buffer Overflow,Segmentation Fault,我试图运行程序来测试缓冲区溢出,但当程序崩溃时,它会显示如下SIGSEGV错误: 程序接收信号SIGSEGV,分段故障。 主机中的0x00000000004006c0(argc=2,argv=0x7fffffffde78) 但我下面的教程得到了以下信息: 程序接收信号SIGSEGV,分段故障。0x4141英寸?? () 因此,我无法获得缓冲区溢出的确切内存位置 我在编译程序时已经使用了-fno stack protector。因为在这之前我犯了SIGABRT错误 是否有人有任何线索,以便我能够与

我试图运行程序来测试缓冲区溢出,但当程序崩溃时,它会显示如下SIGSEGV错误:

程序接收信号SIGSEGV,分段故障。 主机中的0x00000000004006c0(argc=2,argv=0x7fffffffde78)

但我下面的教程得到了以下信息:

程序接收信号SIGSEGV,分段故障。0x4141英寸?? ()

因此,我无法获得缓冲区溢出的确切内存位置

我在编译程序时已经使用了
-fno stack protector
。因为在这之前我犯了SIGABRT错误


是否有人有任何线索,以便我能够与教程同步。

SIGSEGV
是当程序尝试访问不应该访问的内存位置时发出的信号。两种典型情况是:

  • 一个未初始化的指针
  • 访问超出范围的数组

然而,请注意,即使在这两种情况下,
SIGSEGV
也不能保证总是发生。因此,不要期望即使使用相同的代码,
SIGSEGV
消息也总是相同的。

我能够找出两者的区别

实际上,我在虚拟盒上的Ubuntu 64位上尝试了相同的代码。 但后来我尝试在virtual box上安装Ubuntu 32位,所以现在我也得到了与教程中相同的信息


我在64位和32位操作系统中注意到的另一个区别是,在使用32位操作系统时,我们可以使用$esp检查堆栈,但在64位机器中,我们必须使用$rsp

考虑未定义行为的含义@Olaf想一想,这个问题是关于实际发生了什么,而不是根据C标准应该发生什么@immibis:不,这是关于可能发生的事情,期望未定义的行为以定义的方式表现是没有用的。鼻魔总是一种选择。地址是虚拟的,不能保证在不同的机器/操作系统版本上完全相同,等等。最糟糕的是,有某种机制可以反击这种攻击,例如:。。。不要依赖于值,至少要小心……你是对的,但你是否看到我在问题中发布的两条消息中的内存模式不同。你的意思是虚拟地址不同?是的,我如何获得教程中提供的相同类型的地址模式?无法保证会检测到此类访问。程序也不会(或可能会)以特定/定义的方式运行。