【问题标题】:Randomly flipping bits in a python binary string在 python 二进制字符串中随机翻转位
【发布时间】:2013-06-28 15:36:00
【问题描述】:

我正在 python 中创建一些模糊测试,对于我来说,给定一个二进制字符串,随机翻转一些位并确保正确引发异常,或者正确显示结果以进行轻微更改,这对我来说是非常宝贵的给定有效的二进制文件。有谁知道我如何在 Python 中解决这个问题?我意识到这在低级语言中是非常微不足道的,但出于工作原因,我被告知要在 Python 中执行此操作,但我不确定如何开始,或者在 python 中获取某些东西的二进制表示。关于如何在 Python 中执行这些模糊测试的任何想法?

【问题讨论】:

  • 这在 python 中可能也很简单。你的二进制字符串是什么格式的?
  • @recursive 大多数二进制字符串会是 pdf、jpg 或 png,偶尔也会加入一些其他字符串。我认为它在 Python 中很简单,因为一切都是如此,我只是还没有看到它完成。
  • 你的位串是什么类型的对象?
  • @recursive 一个字符串-_-
  • 字符串是一系列字符,因此要获得该字符串的二进制编码,您还需要指定字符编码。除非您的意思是包含字符“0”和“1”的字符串?

标签: python bit-manipulation fuzz-testing


【解决方案1】:

字符串是不可变的,因此要进行更改,首先要做的可能是将其转换为列表。同时,您可以将数字转换为整数,以便于操作。

hexstring = "1234567890deadbeef"
values = [int(digit, 16) for digit in hexstring]

然后您可以翻转任何十六进制数字中的单个位。

digitindex = 2
bitindex = 3
values[digitindex] ^= 1 << bitindex

如果需要,您可以转换回十六进制。

result = "".join("0123456789abcdef"[val] for val in values)

【讨论】:

  • 啊,太好了!这正是我一直在寻找的。非常感谢。
【解决方案2】:

您可以尝试的一件事是将字符串转换为字节数组,然后对每个字符执行位操作。您可以通过索引访问每个字符并将其视为整数。

例如:

>>> a = "hello world"
>>> b = bytearray(a)
>>> b[0] = b[0] ^ 5    # bitwise XOR
>>> print b            # or do str(b) to convert it back to a string
mello world

您还可以在 Python wiki 上发现这篇关于 bit manipulation 的文章很有用。它详细介绍了 Python 中的位操作,以及大量有用的提示和技巧。

【讨论】:

  • 有没有比用一些随机数随机索引和异或更好的方法?如果不是,我会接受这个答案。理想情况下,我也想处理单个位,但我想这在功能上做同样的事情。
  • @SlaterTyranus -- 可能有,但不幸的是,我在这方面没有太多经验,所以我不知道。稍等片刻看看可能会弹出哪些更适合您正在尝试做的事情的其他答案可能是个好主意。
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2014-01-19
相关资源
最近更新 更多