Эксплойты в Python - манипулирование шестнадцатеричными строками - PullRequest
4 голосов
/ 07 мая 2011

Я довольно новичок в python и пытаюсь перенести простой эксплойт, который я написал для переполнения стека (просто nop sled, код оболочки и адрес возврата).Это не для гнусных целей, а для лекции по безопасности в университете.

С учетом шестнадцатеричной строки (deadbeef), как лучше всего:

  • представить ее какпоследовательность байтов
  • добавляет или вычитает значение
  • в обратном порядке (для разметки памяти x86, т.е. efbeadde)

Любые советы и рекомендации, касающиеся общих задач вЭксплойт написание на Python также высоко ценится.

Ответы [ 3 ]

4 голосов
/ 07 мая 2011

В Python 2.6 и выше вы можете использовать встроенный класс bytearray.

Для создания объекта bytearray:

b = bytearray.fromhex('deadbeef')

Чтобы изменить байт, вы можете ссылаться на него, используя обозначение массива:

b[2] += 7

Чтобы обратить bytearray на место, используйте b.reverse().Чтобы создать итератор, который перебирает его в обратном порядке, вы можете использовать функцию reversed: reversed(b).

Также вас может заинтересовать новый класс bytes в Python 3, который похож наbytearray но неизменный.

0 голосов
/ 07 мая 2011

В Python 2.x обычные значения str являются бинарно-безопасными.Вы можете использовать функции b2a_hex и a2b_hex модуля binascii для преобразования в шестнадцатеричное и шестнадцатеричное значения.

Вы можете использовать обычные строковые методы, чтобы обратить или иным образом переставить байты.Однако выполнение любой арифметики потребует от вас использования функции ord для получения числовых значений для отдельных байтов, затем chr для преобразования результата обратно с последующей конкатенацией для повторной сборки измененной строки.

Для изменяемых последовательностей с более простой арифметикой используйте модуль array с кодом типа 'B'.Их можно инициализировать по результатам a2b_hex, если вы начинаете с шестнадцатеричного числа.

0 голосов
/ 07 мая 2011

Не уверен, что это лучший способ ...

hex_str = "deadbeef"
bytes = "".join(chr(int(hex_str[i:i+2],16)) for i in xrange(0,len(hex_str),2))
rev_bytes = bytes[::-1]

Или может быть проще:

bytes = "\xde\xad\xbe\xef"
rev_bytes = bytes[::-1]
...