Unicorn — это изящный легкий мультиплатформенный мультиархитектурный эмулятор процессора. Как только вы предоставите ему информацию о процессоре, который хотите эмулировать, вы можете передать ему необработанный двоичный файл, и он будет эмулировать процессор, корректируя значения регистров и памяти в соответствии с инструкциями, закодированными в двоичном файле. Это фантастический инструмент — проверьте, если вы еще этого не сделали.

Играя с Unicorn, я хотел разработать простой способ перейти от идентификации функции в двоичном файле, которую я хотел бы эмулировать, к сохранению всех байтов функции в формате Python bytes, который могла бы использовать библиотека Python unicorn. Пока это был самый простой способ, который я нашел — дайте мне знать, если есть что-то проще.

Используйте xxd и функцию bytes.fromhex() в Python. Допустим, вы хотите извлечь 0x17 байт из двоичного файла с именем a.out по смещению 0x1129. Вы можете сделать это следующим образом:

$ xxd -s 0x1129 -l 0x17 -p a.out

Если вы не знаете, сколько байт вы хотите извлечь, но знаете начальное и конечное смещение, используйте эту команду:

$ xxd -s 0x1129 -l $((0x1140-0x1129)) -p a.out

Примечание: удалите префикс «0x», чтобы использовать десятичные числа вместо шестнадцатеричных.

Это выведет поток байтов в форме «0123456789abcdef». Чтобы преобразовать эту строку в байтовую строку в Python, выполните следующие действия:

bytes.fromhex("0123456789abcdef") # returns b'\x01#Eg\x89\xab\xcd\xef'

Оригинально опубликовано на https://tristanwhite.net.