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

2 投票
1 回答
1911 浏览
提问于 2025-04-17 22:30

我正在进行一个叫做填充Oracle攻击的项目,这个攻击涉及到修改一个初始化向量(IV),然后通过HTML的POST请求把它发送回去。简单来说,我想改变一个字符串的最后一个字节……但我觉得我可能做错了。首先,我们从Oracle那里得到了一个原始的IV。

IV = 'NFhS0jOCAR0ymB2MM+3Pfg=='

这个原始IV我们不能直接使用,所以我们对它进行Base64解码。

IV = base64.b64decode(IV)

解码后在屏幕上显示的内容看起来一团糟(4XR�3�2��3��~),但现在它变成了我们可以处理的格式。接下来,我们想找出这个IV的最后一个字节,所以我们说

LastByte = IV[len(IV)-1]

这样我们得到了“~”作为最后一个字节。现在事情变得复杂了,我们想通过把最后一个字节和一个我们称之为X的数字进行异或运算来改变它。

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

然后我们再进行Base64编码,继续下一步。

newIV = base64.b64encode(newIV)

当我检查新IV的长度时,它和原始的IV长度是一样的,但我总觉得哪里不对。我是不是因为用str(NewByte)搞错了?我觉得我应该用字节数组来处理这个,但我对如何使用字节数组还不太了解。我最后一个字节的修改是正确的吗?

1 个回答

1

你想用 chr() 函数 把你经过异或运算得到的整数转换回一个字符的字符串:

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

撰写回答