我正在进行Padding Oracle攻击,其中包括更改IV并使用HTML post请求将其发回。简单的版本是我试图改变字符串的最后一个字节....我想我可能做错了。首先,我们从Oracle开始使用Raw IV。
IV = 'NFhS0jOCAR0ymB2MM+3Pfg=='
我们无法使用它,所以我们对它进行base-64解码。
IV = base64.b64decode(IV)
在我们的屏幕上将其变成垃圾(4XR 3 2 3 ~),但现在它处于我们可以使用的形式。现在我们想找出IV的最后一个字节,所以我们说
LastByte = IV[len(IV)-1]
这给了我们“〜”作为最后一个字节。现在事情变得疯狂了,我们想通过XOR来改变IV的最后一个字节,用一个我们称之为X的数字。
NewByte = ord(LastByte) ^ x
newIV = IV[:len(IV)-1] + str(NewByte)
然后我们对它进行base64编码并继续
newIV = base64.b64encode(newIV)
当我检查newIV的长度时,它与原始IV的长度相同,但我觉得这里的东西不对。我是通过做str(NewByte)把它搞砸了吗?我觉得我应该以某种方式使用bytearray这样做,但我不知道使用它们在一个中做到这一点。我是否正确更改了最后一个字节?
答案 0 :(得分:1)
您想使用chr()
function将您的XORed整数重新转换为单字符字符串:
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=='