改变字符串的最后一个字节

时间:2014-03-16 01:17:01

标签: python string byte bytearray padding-oracle-attack

我正在进行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这样做,但我不知道使用它们在一个中做到这一点。我是否正确更改了最后一个字节?

1 个答案:

答案 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=='