更改字符串的最后一个字节
我正在进行一个叫做填充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=='