【问题标题】:How it's possible that sub instruction cause invalid pointer read?子指令如何导致无效指针读取?
【发布时间】:2013-12-20 08:40:36
【问题描述】:

我有一个包含此代码的故障转储:

mov     r11,rsp
push    rdi
sub     rsp,0A0h
mov     qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh

这是一个功能的序幕。所以,!analyze -vINVALID_POINTER_READ 和指令 sub。 AMD 指令集表示,如果参数不是内存指针,sub 指令不会产生任何异常。

另外,READ_ADDRESSffffffffffffffff,但在寄存器窗口中我可以看到 rsp12b3e0。这是 64 位操作系统中的 32 位应用程序。

我想知道这个错误的可能原因以及如何解决它。

更新:

Microsoft Visual Studio 9.0\VC\include\xtree 中的方法是 std._Tree.insert(const value_type& _Val)。

编译器是来自 Visual Studio 2008 安装的 cl.exe,32 位,版本 15.00.30729.01。

命令行:

 /FD /EHsc /MD /GS- /Zc:wchar_t- /Yu"stdafx.h"/W3 /WX /nologo /c /Zi /TP /wd4250 /FI -Zm200 -MP -w34100 -w34189

链接器来自同一来源,版本 9.00.30729.01。

UPD:对于那些对使用 64 位调试器调试 32 位应用程序持怀疑态度的人,我运行了一个 32 位版本的调试器并得到了相同的结果。所以,我仍然认为它是sub 指令。

UPD:澄清一下:应用程序是为32位平台构建的。但处理器操作系统64位。因此,在转储中我们可以看到具有 32 位值的 64 位寄存器,这并不奇怪。

【问题讨论】:

  • DEP?或者来自调试器的虚假信息。
  • 你确定是 sub 失败了吗? RIP 不喜欢在失败的指令之后指向指令吗...?
  • 你怎么可能在调试一个 32 位的应用程序,而你显示的代码是 64 位的?
  • 最佳实践是使用 32 位调试器来调试 32 位进程/转储。

标签: windows assembly x86-64 crash-dumps


【解决方案1】:

其他事情正在发生。在整个操作码集中没有内存读取操作。您只有两次写入(push 和 mov)。您的对齐很好,并且正在将立即 qword 值 -2 放置在应该可以的堆栈区域中。

操作系统和操作码的细微之处与此有关。我一直使用 64 位寄存器。这就像在一切都是 16 位时使用 32 位一样。

到别处看看。

【讨论】:

    猜你喜欢
    • 2021-06-09
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多