地址处的不可读指令

Posted

技术标签:

【中文标题】地址处的不可读指令【英文标题】:Unreadable instruction at address 【发布时间】:2021-09-25 20:08:07 【问题描述】:

我在某些情况下遇到分段错误(它是使用 DEC VAX FMS(表单管理系统)调用以在 CRT 屏幕上获取某个字段的 C 代码 - 相当旧的遗留代码)。我在 AIX 机器上,并且只安装了 dbx。 GDB、valgrind 等不可用。

这是我尝试调试时得到的结果:

Unreadable instruction at address 0x53484950

我不知道如何从这里开始。

我尝试了一些方法:

1.

(dbx) up
not that many levels
(dbx) down
not that many levels
(dbx) n
where

Segmentation fault in . at 0x53484950 ($t1)
0x53484950 (???) Unreadable instruction at address 0x53484950

    尝试过 tracei(用于机器指令)、dump(dump 提供了如此多的输出,我无法理解)等,但似乎没有任何帮助。

    (dbx) &0x53484950/X
    expected variable, found "1397246288"

我习惯于在“哪里”获取堆栈跟踪并从那里继续。这是我以前没有遇到过的,看来我也不太擅长 dbx。任何帮助至少找到导致问题的代码行表示赞赏。

【问题讨论】:

对于 1-2,我怀疑您的程序已损坏其堆栈,因此调试器无法找到堆栈帧或有效的调用方返回地址。对于 3,当您没有显示“这么多输出”时,没有人可以帮助您解释它。 4 看起来像语法错误;十六进制 53484950 是十进制 1397246288,如果 & 是 dbx 中的地址运算符,那么它告诉您它期望 & 的操作数是一个变量,而不是一个数字。也许0x53484950/X 会起作用。但是,由于堆栈损坏,我预计该数字没有用。您需要在此之前捕获程序。 不知何故您将x'53484950'=c'SHIP' 放入$pc 很可能您已经覆盖了堆栈上的一个数组。 如果源代码不可用,请确保在启动程序之前将终端大小调整为25x80。 你是对的。我做错了什么(在我编写的代码中使用了 FMS 调用的指针),这破坏了堆栈,并进一步导致了上述问题。我检查了代码并找到了它,尽管我花了很多时间才弄清楚这一点。 【参考方案1】:

一旦遇到段错误,就无法继续,所以 n 命令不会做任何事情。到那时,您所能做的就是检查堆栈和变量,除非您有源代码并且可以重新编译它,否则这将毫无意义。

事实上,如果没有源代码,我不确定您如何继续修复程序。即使您可以“反编译”程序,或者至少反汇编程序,在尝试修补二进制文件以修复它时出错的风险几乎是 100%。

对不起。鉴于您正在工作的限制,我认为这个问题是无法解决的。没有gdb或valgind等工具,很难找到问题,没有源代码,一旦找到问题就很难修复。

【讨论】:

你是对的。我做错了什么(在我编写的代码中使用了 FMS 调用的指针),这破坏了堆栈,并进一步导致了上述问题。我检查了代码并找到了它,尽管我花了很多时间才弄清楚这一点。

以上是关于地址处的不可读指令的主要内容,如果未能解决你的问题,请参考以下文章

用机器指令和汇编指令编程

Windows 逆向OD 调试器工具 ( 分析 OD 硬件断点处的关键代码 | 添加硬件断点 | 关键代码 | MOV 指令 | EAX 寄存器值分析 | 使用命令查看 esi+0cc 地址 )(代码

[bx]和loop

第九章 转移指令的原理 其二

汇编语言总结

‘第五章 [BX]和loop指令