地址处的不可读指令
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 地址 )(代码