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

4 投票
3 回答
4395 浏览
提问于 2025-04-16 17:10

我刚开始学习Python,正在尝试把我写的一个简单的漏洞利用代码移植过来,这个代码是针对栈溢出的(只是一些无操作指令、壳代码和返回地址)。这不是为了坏事,而是为了在大学的安全讲座上用。

给定一个十六进制字符串(deadbeef),有什么好的方法可以:

  • 把它表示成一系列字节
  • 加上或减去一个数值
  • 反转顺序(针对x86内存布局,比如变成efbeadde)

如果有关于在Python中编写漏洞利用时常见任务的小技巧和建议,也非常感谢。

3 个回答

0

在Python 2.x中,普通的str值是可以安全处理二进制数据的。你可以使用binascii模块里的b2a_hexa2b_hex函数来进行十六进制的转换。

你可以用普通的字符串方法来反转或者重新排列你的字节。不过,如果你想进行任何数学运算,就需要先用ord函数把每个字节转换成数字,然后再用chr把结果转换回来,最后通过拼接把修改后的字符串重新组合起来。

如果你想要更简单的数学运算,可以使用array模块,类型代码用'B'。如果你是从十六进制开始的,可以用a2b_hex的结果来初始化这些数组。

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

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

要创建一个bytearray对象,你可以这样做:

b = bytearray.fromhex('deadbeef')

如果你想修改某个字节,可以用数组的方式来引用它:

b[2] += 7

要在原地反转bytearray,可以使用b.reverse()。如果你想创建一个可以反向遍历它的迭代器,可以使用reversed函数:reversed(b)

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

撰写回答