【问题标题】:SIGSEGV Segmentation fault, different messageSIGSEGV 分段错误,不同的消息
【发布时间】:2015-11-28 10:51:20
【问题描述】:

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

程序收到信号SIGSEGV,分段错误。 0x00000000004006c0 in main (argc=2, argv=0x7fffffffde78)

但我正在关注的教程收到以下消息:

程序收到信号SIGSEGV,分段错误。 0x41414141 在?? ()

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

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

有没有人有任何线索可以让我与教程同步。

【问题讨论】:

  • 想想undefined行为的含义
  • @Olaf 想想这个问题是关于实际发生了什么而不是根据 C 标准应该发生什么
  • @immibis:不,这是关于可能会发生什么,并且期待undefined行为没有用已定义的方式行事。鼻恶魔总是一种选择。
  • 地址是虚拟的,不保证在不同的机器/操作系统版本等上完全相同。最糟糕的是,有一些机制可以反击此类攻击,例如:en.wikipedia.org/wiki/Address_space_layout_randomization... Don不要依赖价值观,至少要小心……

标签: c gcc gdb buffer-overflow segmentation-fault


【解决方案1】:

我能够弄清楚两者的区别。

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

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

【讨论】:

    【解决方案2】:

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

    • 引用未初始化的指针。
    • 越界访问数组。

    但是请注意,即使在这两种情况下,也不能保证SIGSEGV总是会发生。所以不要指望SIGSEGV 消息即使使用相同的代码也总是相同的。

    【讨论】:

    • 您是对的,但是您是否看到我在问题中发布的两条消息中的记忆模式差异。
    • 你的意思是虚拟地址不一样?
    • 对了,怎样才能得到教程里的同类型模式的地址
    • 不保证会检测到此类访问。程序也不需要(或可能会)以特定/定义的方式运行。
    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2020-01-29
    • 2011-01-28
    相关资源
    最近更新 更多