2011-05-07 61 views
4

我对python很陌生,试图移植一个我为堆栈溢出(只是一个nop sled,shell代码和返回地址)而写的简单漏洞。这不是为了恶意的目的,而是为了在大学进行安全讲座。在Python中的漏洞 - 操纵十六进制字符串

给出一个十六进制字符串(DEADBEEF),什么是最好的方式:

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

任何提示和技巧关于利用python写作的常见任务也非常感激。

回答

4

在Python 2.6及以上版本,可以使用内置的bytearray类。

要创建bytearray对象:

b = bytearray.fromhex('deadbeef') 

要改变一个字节,则可以使用数组符号引用它:

b[2] += 7 

为了扭转到位bytearray,使用b.reverse()。要创建一个以相反顺序遍历它的迭代器,可以使用reversed函数:reversed(b)

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

+3

bytearray也可在Python 2.6+ – zeekay 2011-05-07 01:31:59

+0

@zeekay:太棒了。我认为这只是一个Python 3的东西。我会编辑我的答案。 – 2011-05-07 10:49:44

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] 
0

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

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

对于易于计算的易变序列,请使用array模块,并输入代码'B'。如果您从十六进制开始,可以从a2b_hex的结果初始化这些值。