Python中的漏洞 - 操纵十六进制字符串

时间:2011-05-07 00:36:51

标签: python security hex exploit

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

创建bytearray对象:

b = bytearray.fromhex('deadbeef')

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

b[2] += 7

要反转bytearray,请使用b.reverse()。要创建以相反顺序迭代它的迭代器,可以使用reversed函数:reversed(b)

您可能也对Python 3中的新bytes类感兴趣,类似bytearray但不可变。

答案 1 :(得分: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]

答案 2 :(得分:0)

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

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

对于算术更简单的可变序列,请使用类型代码为'B'的{​​{3}}模块。如果您从十六进制开始,可以从a2b_hex的结果初始化这些。