繁体   English   中英

如何在程序中查找非法指令?

[英]How to find illegal instructions in a program?

我有一个基准,它意味着在特定的模拟器上运行,一些指令添加到基准测试以与模拟器通信(不执行CPU操作),如转储统计或重置统计等。

现在我需要在另一个模拟器上运行相同的基准测试,并且实际上没有其他工作,我必须使用相同的二进制文件,当然它不起作用,因为它生成SIGILLIllegal Instruction错误。

我现在想要的是能够直接从可执行二进制文件中删除错误的指令(没有源代码,无法重新编译,无法从其他地方设置)并用NOP替换它们。 所以我在gdb运行了基准测试并使用layout asm命令来查找错误指令的地址。 这是输出: 在此输入图像描述

我的问题可能看起来有点愚蠢,但现在我在文本编辑器中打开了二进制文件,并尝试使用我从gdb获取的地址来查找二进制文件中的非法指令,但没有运气。 二进制文件的大小约为1MB,而地址从大约4MB开始。 如何使用从gdb获得的地址在二进制文件中找到非法指令? 以下是二进制文件的片段,显示其格式:

616c 6967 6e00 5f5f 7265 6769 7374 6572
5f66 7261 6d65 5f69 6e66 6f00 5f49 4f5f
7664 7072 696e 7466 005f 5f70 7468 7265
6164 5f73 6574 7370 6563 6966 6963 5f69
6e74 6572 6e61 6c00 7763 7274 6f6d 6200
5f64 6c5f 636f 7272 6563 745f 6361 6368
655f 6964 005f 646c 5f73 6f72 745f 6669
6e69 005f 5f6e 6577 5f66 6f70 656e 0063
6c6f 7365 005f 5f73 7472 6e63 7079 5f73
7365 3200 5f5f 6c69 6263 5f63 6f6e 6e65
6374 005f 5f77 6d65 6d63 7079 005f 494f
5f69 7465 725f 6e65 7874 006d 355f 7061
6e69 6300 5f64 6c5f 636c 6f73 655f 776f
726b 6572 005f 646c 5f70 6167 6573 697a
6500 5f5f 7661 6c6c 6f63 005f 5f6d 656d
616c 6967 6e5f 686f 6f6b 005f 5f70 7468
7265 6164 5f69 6e69 745f 7374 6174 6963
5f74 6c

你的十六进制转储只是一堆函数名,所以它并没有告诉我们多少。 你没有提到操作系统......

我假设您可以在其上运行gdb ,您也可以使用GNU binutils。

首先,您可以尝试objdump -h myprog 它将给出一个包含其大小,加载地址和文件偏移的部分列表。 如果它告诉您有一个部分从401000开始,文件偏移量为400且大小至少为af4 ,那么运行时位置401af4的文件偏移量为401af4-401000+400

如果违规地址在共享库中,或者程序已经重新映射其地址空间,则任务将更加困难。

您没有指定处理器或操作系统。 看起来像x86这使得它变得更加困难,因为它是一个可变长度的指令集,在第一个问题指令时反汇编程序如果你使用它可能会混淆,取决于反汇编程序。

试着找出模拟器响应的具体非法指令,找到二进制中的那些位模式,围绕反汇编进行交互,如果发现这些模式用nops替换它们并重复,而不是万无一失,并且取决于这个二进制文件是怎样的可能会有一些尝试来阻止这种黑客攻击。

当然是一项非平凡的任务......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM