2

我正在研究 Padding Oracle 攻击,其中涉及更改 IV 并将其与 HTML 发布请求一起发回。简单的版本是我正在尝试更改字符串的最后一个字节......我想我可能做错了。首先,我们从 Oracle 的 Raw IV 开始。

IV = 'NFhS0jOCAR0ymB2MM+3Pfg=='

我们无法使用它,因此我们对其进行 base-64 解码。

IV = base64.b64decode(IV)

这会将它变成我们屏幕上的垃圾(4XR�3�2��3��~),但现在它是我们可以使用的形式。现在我们想找出 IV 的最后一个字节,所以我们说

LastByte = IV[len(IV)-1]

这给了我们“~”作为最后一个字节。现在事情变得疯狂了,我们想改变 IV 的最后一个字节,方法是用一个我们称之为 X 的数字对它进行异或运算。

NewByte = ord(LastByte) ^ x
newIV = IV[:len(IV)-1] + str(NewByte)

然后我们对它进行base64编码并继续

newIV = base64.b64encode(newIV)

当我检查 newIV 的长度时,它与原始原始 IV 的长度相同,但我只是觉得这里有些不对劲。我是不是通过 str(NewByte) 搞砸了?我觉得我应该以某种方式使用 bytearray 来执行此操作,但我对使用它们并没有足够的了解。我是否正确更改了最后一个字节?

4

1 回答 1

1

您想使用该chr()函数将 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=='
于 2014-03-16T01:20:29.377 回答