angr выдает множественные ошибки декодирования при формировании CFG
Работая с angr впервые, я в основном пытаюсь распечатать все основные блоки корневой файловой системы x86 Alpine Linux. Я нашел небольшой классный скрипт на Python в обмене стеком RE, который делает именно это:
https://reverseengineering.stackexchange.com/questions/24664/how-to-export-disassembly-using-angr
Единственная проблема заключается в том, что с большинством файлов, которые я пытаюсь проанализировать, я получаю ряд ошибок при запуске сценария (которые я поместил ниже в разделе "Действия по воссозданию"). Ошибка, которую я получаю, выглядит так:
ERROR | *Date/Time of Occurrence* | angr.analyses.cfg.cfg_fast | Decoding error occurred at address *hex address* of function *hex address*
Я получаю большое количество таких ошибок, каждый раз меняя шестнадцатеричные адреса. Важно отметить, что эта ошибка не останавливает запуск моего скрипта. Я до сих пор получаю много блочных распечаток. По сути, я просто хочу убедиться, что из-за этой ошибки я не пропускаю базовые блоки, потому что, как я изначально заявил, мне нужны все базовые блоки для правильного выполнения моего анализа. Если бы кто-нибудь мог дать мне направление, как исправить эту проблему, или заверил меня, что я не пропускаю базовые блоки из-за этой ошибки, я был бы очень признателен! Ниже приведены инструкции по воссозданию возникшей у меня проблемы.
Шаги по воссозданию ошибки:
Загрузите файловую систему Mini Root Filesystem x86 по следующей ссылке: https://alpinelinux.org/downloads/
Запустите следующий скрипт (опять же, который я в основном украл из переполнения стека RE). Я рекомендую использовать
\usr\bin\ssl_client
файл, поскольку он относительно небольшой:
import angr, os
os.chdir(' *Your file path here* ')
counter = 0
#If you choose to run the script on a different file, you'll have to change the 'ssl_client' below.
proj = angr.Project('ssl_client', main_opts={'backend': 'blob', 'arch': 'x86'},
load_options={'auto_load_libs': False})
cfg = proj.analyses.CFGFast()
cfg.normalize()
for func_node in cfg.kb.functions.values():
for block in func_node.blocks:
counter += 1
print('*** NEW BASIC BLOCK ***')
print()
block.pp()
print()
print('Total Number of Basic Blocks: ' + str(counter))
- Все ошибки должны появиться сразу же, а затем распечатать множество основных блоков. Если я правильно помню, у меня было 303 базовых блока для файла ssl_client.
РЕДАКТИРОВАТЬ: Я также пробовал это в живом скрипте, и основные ошибки возникают во время формирования CFG, а не во время распечаток блока или циклов for или чего-то еще. Просто хотел добавить это уточнение.
Еще раз спасибо, ребята!