Изменение последнего байта строки
Я работаю над атакой Padding Oracle, которая включает в себя изменение IV и отправку его обратно с HTML-запросом. Простая версия состоит в том, что я пытаюсь изменить последний байт строки.... и я думаю, что я могу делать это неправильно. Сначала мы начнем с Raw IV от Oracle.
IV = 'NFhS0jOCAR0ymB2MM+3Pfg=='
Мы не можем работать с этим, поэтому мы делаем декодирование Base-64 на нем.
IV = base64.b64decode(IV)
Это превращает его в мусор на нашем экране (4XR 3 2 3 ~), но теперь это в форме, с которой мы можем работать. Теперь мы хотим выяснить последний байт IV, поэтому мы говорим
LastByte = IV[len(IV)-1]
Что дает нам "~" как последний байт. СЕЙЧАС все становится сумасшедшим, мы хотим изменить последний байт IV с помощью XOR, присвоив ему номер, который мы назовем X.
NewByte = ord(LastByte) ^ x
newIV = IV[:len(IV)-1] + str(NewByte)
И тогда мы base64 кодируем его и идем дальше
newIV = base64.b64encode(newIV)
Когда я проверяю длину newIV, она равна длине исходного raw, но я просто чувствую, что что-то здесь не так. Я испортил это, делая str(NewByte)? Я чувствую, что должен как-то делать это с помощью bytearray, но я не знаю достаточно об их использовании в одном. Правильно ли я изменил последний байт?
1 ответ
Вы хотите использовать chr()
функция, чтобы превратить целое число XORed обратно в односимвольную строку:
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=='