4

我对 python 很陌生,并试图移植一个我为堆栈溢出编写的简单漏洞(只是一个 nop 雪橇、shell 代码和返回地址)。这不是出于邪恶目的,而是为了在大学进行安全讲座。

给定一个十六进制字符串(deadbeef),最好的方法是:

  • 将其表示为一系列字节
  • 添加或减去一个值
  • 颠倒顺序(对于 x86 内存布局,即 efbeadde)

任何有关在 python 中编写漏洞利用的常见任务的提示和技巧也非常感谢。

4

3 回答 3

4

在 Python 2.6 及更高版本中,您可以使用内置bytearray类。

要创建您的bytearray对象:

b = bytearray.fromhex('deadbeef')

要更改字节,您可以使用数组表示法来引用它:

b[2] += 7

要反转bytearray原位,请使用b.reverse(). 要创建一个以相反顺序对其进行迭代的迭代器,您可以使用reversed函数:reversed(b)

您可能还对bytesPython 3 中的新类感兴趣,它类似bytearray但不可变。

于 2011-05-07T00:52:00.573 回答
0

不确定这是否是最好的方法...

hex_str = "deadbeef"
bytes = "".join(chr(int(hex_str[i:i+2],16)) for i in xrange(0,len(hex_str),2))
rev_bytes = bytes[::-1]

或者可能更简单:

bytes = "\xde\xad\xbe\xef"
rev_bytes = bytes[::-1]
于 2011-05-07T00:39:23.300 回答
0

在 Python 2.x 中,常规str值是二进制安全的。您可以使用binascii模块的b2a_hexa2b_hex函数来转换为十六进制。

您可以使用普通的字符串方法来反转或重新排列字节。但是,进行任何类型的算术运算都需要您使用该ord函数来获取单个字节的数值,然后chr将结果转换回来,然后进行连接以重新组装修改后的字符串。

对于具有更简单算术的可变序列,请使用类型为 code的数组'B'模块。a2b_hex如果您从十六进制开始,这些可以从结果中初始化。

于 2011-05-07T01:09:17.260 回答