修补二进制文件

ktm*_*124 1 c assembly reverse-engineering

我写了一个简单的C程序,显示"Hello World!" 到stdout.然后我编译了它,并删除了源代码.

我已经将自己设置为修补程序的项目,以便显示除"Hello World!"之外的其他内容.为此,我发现存储在二进制文件中的字符串,并使用vi的十六进制编辑器将存储字符串的二进制偏移量(我假设它是数据部分)中的'a'替换为'e'.

我只更改了二进制文件的一个字节,0x65到0x61,'e' - >'a',然而,当我运行程序时,我得到了这个:

./simple: line 1: 0000000:: command not found
./simple: line 2: 0000010:: command not found
./simple: line 3: 0000020:: command not found
./simple: line 4: 0000030:: command not found
./simple: line 5: 0000040:: command not found
./simple: line 6: 0000050:: command not found
./simple: line 7: syntax error near unexpected token `('
./simple: line 7: `0000060: 0000 0000 0000 0000 1900 0000 2802 0000  ............(...'
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?即为什么单字节替换可以呈现其他可执行的二进制文件(我之前运行得很好)不可执行?该字节只是字符串的一部分 - 它不是指令的一部分 - 所以我不明白为什么会发生这种情况.

感谢所有反馈.

Rol*_*lig 7

您的编辑器保存的不是原始字节,而是它们的十六进制表示.该文件的第一行如下所示:

00000000:   45 4C 46 7F ...
Run Code Online (Sandbox Code Playgroud)

这就是shell发出错误消息的原因.它读取该行并尝试将其解释为脚本/bin/sh,因为它不是以字节开头ELF\x7F而是以字节开头00000000.

使用正确的十六进制编辑器,你会没事的.