我正在研究 Padding Oracle 攻击,它涉及更改 IV 并将其与 HTML post 请求一起发回。简单的版本是我试图改变字符串的最后一个字节......我想我可能做错了。首先,我们从 Oracle 的原始 IV 开始。
IV = 'NFhS0jOCAR0ymB2MM+3Pfg=='
我们无法使用它,所以我们对其进行 base-64 解码。
IV = base64.b64decode(IV)
这在我们的屏幕上变成了垃圾 (4XR�3�2�3�~),但现在它是我们可以使用的形式。现在我们想找出 IV 的最后一个字节,所以我们说
LastByte = IV[len(IV)-1]
这给了我们“~”作为最后一个字节。现在事情变得疯狂了,我们想通过将它与我们称为 X 的数字进行异或来更改 IV 的最后一个字节。
NewByte = ord(LastByte) ^ x
newIV = IV[:len(IV)-1] + str(NewByte)
然后我们对其进行base64编码并继续
newIV = base64.b64encode(newIV)
当我检查 newIV 的长度时,它与原始原始 IV 的长度相同,但我只是觉得这里有些不对劲。我是不是通过 str(NewByte) 把它搞砸了?我觉得我应该以某种方式用 bytearray 来做这件事,但我对使用它们合而为一知之甚少。我是否正确更改了最后一个字节?
最佳答案
您想使用 chr()
function将您的异或整数变回单字符字符串:
NewByte = chr(ord(LastByte) ^ x)
chr()
是 ord()
的倒数:
>>> ord('~')
126
>>> chr(126)
'~'
您可以使用负索引来相对于字符串的末尾进行切片或选择,而无需在此处使用len(IV)
:
IV = base64.b64decode(IV)
LastByte = IV[-1]
NewByte = chr(ord(LastByte) ^ x)
newIV = IV[:-1] + NewByte
newIV = base64.b64encode(newIV)
或者,更简洁:
IV = base64.b64decode(IV)
newIV = base64.b64encode(IV[:-1] + chr(ord(IV[-1]) ^ x))
演示:
>>> IV = 'NFhS0jOCAR0ymB2MM+3Pfg=='
>>> x = 128
>>> IV = base64.b64decode(IV)
>>> base64.b64encode(IV[:-1] + chr(ord(IV[-1]) ^ x))
'NFhS0jOCAR0ymB2MM+3P/g=='
关于python - 改变字符串的最后一个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22431833/