Python 改变字符串的最后一个字节

Python 改变字符串的最后一个字节,python,string,byte,bytearray,padding-oracle-attack,Python,String,Byte,Bytearray,Padding Oracle Attack,我正在研究一个填充Oracle攻击,它涉及修改一个IV,并通过一个HTML post请求将其发送回。简单的版本是,我试图改变字符串的最后一个字节……我想我可能做错了。首先我们从甲骨文的原始IV开始 IV = 'NFhS0jOCAR0ymB2MM+3Pfg==' 我们不能用它,所以我们用它来进行base-64解码 IV = base64.b64decode(IV) 这会在我们的屏幕上把它变成垃圾(4XR�3.�2.��3.��~) 但现在它的形式是我们可以使用的。现在我们想找出IV的最后一个字

我正在研究一个填充Oracle攻击,它涉及修改一个IV,并通过一个HTML post请求将其发送回。简单的版本是,我试图改变字符串的最后一个字节……我想我可能做错了。首先我们从甲骨文的原始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)
当我检查新IV的长度时,它的长度与原始IV的长度相同,但我只是觉得这里有点不对劲。我是不是因为做了str(新字节)而搞砸了?我觉得我应该以某种方式使用bytearray执行此操作,但我对如何使用bytearray知之甚少。我是否正确更改了最后一个字节?

是否要使用将XORed整数转换回一个字符串:

NewByte = chr(ord(LastByte) ^ x)
chr()
ord()相反:

您可以使用负索引相对于字符串结尾进行切片或选择,无需在此处使用
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))
演示:

chr()是正确的答案。我的代码现在看起来更接近它应该做的事情,但我离我的最终目标还有一段距离。非常感谢!
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=='