gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:05:24 24 4
gpt4 key购买 nike

我正在研究 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com