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*

Я получаю большое количество таких ошибок, каждый раз меняя шестнадцатеричные адреса. Важно отметить, что эта ошибка не останавливает запуск моего скрипта. Я до сих пор получаю много блочных распечаток. По сути, я просто хочу убедиться, что из-за этой ошибки я не пропускаю базовые блоки, потому что, как я изначально заявил, мне нужны все базовые блоки для правильного выполнения моего анализа. Если бы кто-нибудь мог дать мне направление, как исправить эту проблему, или заверил меня, что я не пропускаю базовые блоки из-за этой ошибки, я был бы очень признателен! Ниже приведены инструкции по воссозданию возникшей у меня проблемы.

Шаги по воссозданию ошибки:

  1. Загрузите файловую систему Mini Root Filesystem x86 по следующей ссылке: https://alpinelinux.org/downloads/

  2. Запустите следующий скрипт (опять же, который я в основном украл из переполнения стека 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))
  1. Все ошибки должны появиться сразу же, а затем распечатать множество основных блоков. Если я правильно помню, у меня было 303 базовых блока для файла ssl_client.

РЕДАКТИРОВАТЬ: Я также пробовал это в живом скрипте, и основные ошибки возникают во время формирования CFG, а не во время распечаток блока или циклов for или чего-то еще. Просто хотел добавить это уточнение.

Еще раз спасибо, ребята!

0 ответов

Другие вопросы по тегам