【问题标题】:Overwriting a single byte in a binary file makes it unrecognizable by objdump?覆盖二进制文件中的单个字节使其无法被objdump识别?
【发布时间】:2017-04-13 09:41:48
【问题描述】:

我想覆盖二进制文件中特定offset 的单个字节。 cval 的值是一个整数。

为此,我编写了以下代码:

f = open(program, "wb")
f.seek(offset, 0) # absolute
#print(f.read(1))
f.write(bytes([cval]))
f.close()

代码在读取offset 处的字节时运行良好,但写入该位置会导致objdump 无法识别ELF 二进制文件。

mfo@mfo-Ubuntu:~/llvm-ir-obfuscation/checker$ objdump -dF fac_c
objdump: fac_c: File format not recognized

我看不出我做错了什么?

【问题讨论】:

  • 你确定你没有写在一些标题?
  • 当我执行f.read(1) 时,我在.text 部分正确读取了该位。然而,写操作不知何故把事情搞砸了。
  • 你真的应该因为在发布这个问题之前没有检查你的“无法识别”的文件大小而被否决。

标签: python linux python-3.x


【解决方案1】:

您使用w 模式打开文件,该模式会在打开文件时截断文件。所以你的最终文件将只包含你写的一个字节。

只需在更新模式下打开它:

f = open(program, "r+b")

应该没问题的。

【讨论】:

    【解决方案2】:

    请参阅 Python 文件 I/O 教程:

    https://www.tutorialspoint.com/python/python_files_io.htm

    rb+:以二进制格式打开一个文件进行读写。这 文件指针放在文件的开头。

    让您感到困惑的可能是您将 rb+ 视为阅读,而将 wb+ 视为写作。但是,两种模式都打开文件进行读写,而后者也会覆盖文件。

    因为后一种模式会覆盖文件,所以 ELF 二进制文件被有效地销毁(头文件消失了)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-10
      • 2010-10-08
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多