Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Decompilation

Avatar for Moscow 2600 Moscow 2600
November 06, 2020

 Decompilation

Avatar for Moscow 2600

Moscow 2600

November 06, 2020
Tweet

More Decks by Moscow 2600

Other Decks in Research

Transcript

  1. Структура современного компилятора • Front-end генерирует ПП из исходного кода.

    • Middle-end оптимизирует и преобразует ПП в более низкоуровневую форму. • Back-end генерирует код для целевой архитектуры. https://en.wikibooks.org/wiki/GNU_C_Compiler_Internals/GNU_C_Compiler_Architecture https://blog.gopheracademy.com/advent-2018/llvm-ir-and-go/
  2. Front-end • Дизассемблер преобразовывает инструкции в специфичное для архитектуры ПП,

    • Резолвер потока выполнения выделяет базовые блоки кода, • Лифтер "поднимает" вывод дизассемблера в архитектурно- независимое ПП, основываясь на информации и потоке выполнения.
  3. Middle-end • Производит анализ стека и на основе него генерирует

    локальные переменные, • На основе анализа потока данных предоставляет резонеру потока выполнения информацию о переходах, которую невозможно получить на этапе дизассемблирования, • Оптимизирует код для удаления лишних переменных, неиспользуемого кода и пр., • Обнаруживает конструкции кода, соответствующие определённой семантике и заменяет их соответствующими выражениями.
  4. SSA-форма • Каждая переменная задаётся только один раз, • Если

    две версии значения достигают одного места, используется специальная Φ-функция, • Позволяет ассоциировать с каждой переменной единственный набор значений. https://ru.wikipedia.org/wiki/SSA
  5. Различные подходы к созданию промежуточного представления • Графовое промежуточное представление

    (TurboFan, Sea of Nodes), • Линейное промежуточное представление, • Что-то среднее.
  6. Различия в уровнях абстракции • LLIL, MLIL, HLIL в Binary

    Ninja, • 8 уровней "зрелости" микрокода в IDA Pro, • Конвейер в TurboFan.
  7. Что почитать? • Simple And Efficient Construction Of Static Single

    Assignment Form: https://pp.info.uni-karlsruhe.de/uploads/publikationen/braun13cc.pdf • Классическая Теория Компиляторов: http://rema44.ru/resurs/study/compiler1/Compiler1.pdf • Simplex Method in IDA Pro: https://www.hex-rays.com/blog/simplex-method-in-ida-pro/ • Hacker's Delight: https://www.amazon.com/Hackers-Delight-2nd-Henry-Warren/dp/0321842685 • 7 Days to Lift: A mission in microcode: https://blog.ret2.io/2020/07/22/ida-pro-avx-decompiler/ • Decompiler internals: microcode: https://i.blackhat.com/us-18/Thu-August-9/us-18-Guilfanov-Decompiler-Internals-Microcode-wp.pdf • Hex-Rays microcode API vs. Obfuscating compiler: https://www.hex-rays.com/blog/hex-rays-microcode-api-vs-obfuscating-compiler/, • Список для чтения TruboFan: https://v8.dev/docs/turbofan • Writing An Optimizing IL Compiler, For Dummies, By A Dummy: https://blog.can.ac/2020/04/11/writing-an-optimizing-il-compiler-for- dummies-by-a-dummy/