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

标签 python string byte arrays padding-oracle-attack

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

相关文章:

python - 如何正确调用字典中的函数名?

Python正则表达式提取两个特殊字符之间的正数和负数

c - 如何将 unsigned char* 转换为 char*

java - 分词和排列之间的时间复杂度差异

python - 为什么 numpy.fromstring 读取数字是错误的?

python - TensorFlow 中有打散操作吗?

c# - 使用 C# 将空间转换为 "+"

c - 在此代码中可以将 8 位或 16 位值存储到 16 位对齐缓冲区吗?

C 指针管理(地址、取消引用、重新分配)

arrays - Slick 使用 Scala 在 PostgreSQL 中管理 Array[byte]