 Здравствуйте. Сегодня мы будем переводить сток от NSpace Ganimino. Спасибо за приглашение. Сегодня мы будем разговаривать насчет разных способов быстрее делать фазинг. И интересные способы, чтобы смотреть на бинарки. Меня зовут Ганимо, я профессор в EPFL, который работает на разных формах Software Security. И смотрим насчет разных мотигаций. Мой друг Матио смотрит на свой master thesis, как изучать бинарки и как их таковать. И сегодня мы будем смотреть, как и можем писать методики, чтобы фазировать бинарки. Они нам будут давать изучать бинарки, которые мы не ждали до этого. Так что мы заметили то, что фазировать бинарки очень сложно. Мало инструментов, сложный сетап и очень сложно их приготовить способом, который будет хорошо работать. И результаты не такие очень интересные. Если мы будем смотреть потом на Kernel, фазировать вещи бинарки в Kernel еще сложнее. В принципе, просто очень сложно это делать. Так что сегодня мы будем презентировать новый способ, чтобы фазировать бинарки с скоростью такой же, который у тебя был истинативный код был. Если вы смотрите на современную систему, например, если вы смотрите на картинки котов, у вас будет Kernel, Lipsy и Desktop, где-то будет 100 миллионов линов кода. Если вы будете строить инструментацию для анализа безопасности, это очень сложно. Есть разные компайлеры, линкеры, и потом иногда разные системы используют, чтобы компилироваться. Если вы будете строить инструментацию для этого, это фактически невозможно, это просто сделать. Так что мы хотим вам дать возможность изучать специфические части, чтобы фазировать специфические части кода, давая вам лучше возможность тестировать системы, специфические системы, которые вас интересуют. Кто здесь работал на фазинг до этого? Много вас здесь. Вы используете EFL? Некоторые используют EFL. Липфазер теперь? 10-15% липфазер, 30% липфазер. Так что много людей уже использовали фазинг, но для тех, которые еще не пробовали, мы объясню быстренько, как работает эта техника, которую вам дает взять бинарку. Например, кром, и ты это экзекутироваешь в какой-то природе. Так что фазинг это берет инпуты, генерирует их, и потом проверяет, что твоя программа делает с этим входом. И в ответ, либо все хорошо, все проходит, или баг проходит. Если у вас есть баг, тогда вы можете найти вонрабилитий, вы можете найти какой-то ошибку в коде. Так что это фазинг, как работает? Так что как вы можете делать так, чтобы фазинг работал хорошо? Как вы можете смотреть на большие базы кода, если несколько простых способов, которые вы можете использовать? Сначала нужно будет создавать тесты, которые способны находить эти баг. И это очень сложно делать. Вам нужно знать, какие входы программы имеют, и вы должны понимать, как можно изучать эти разные части программы. Вы можете, конечно, иметь developer, которые пишут все эти тесты в рукой. Это берет много времени. Так что, смотря на coverage, это дает вам возможность изучать, какие части кода можно атакировать с фазинг. Так что фазер может использовать ответ от процесса, чтобы смотреть атаки, какие возможно. Вторая часть это то, что фазер должен находить эти ошибки, эти баг. Так что, если все хорошо, ваш software, ваша программа не будет крошировать, но все равно может давать вам баг. Так что они хотят иметь способ, что можно было находить эти виллации, эти багы. Например, здесь есть проблема с манерой, как вы используете память. И потом, третий пункт и последний пункт, это то, что скорость, это очень важно. У вас есть лимитированное количество времени, и вы умеете, например, 24 часа, чтобы найти максимальное количество багов. У вас есть столько лимитированного количества инструкций, которые вы можете использовать, и вам нужно найти, как вы приоритетизируете ваше время между экзекотирой с программой, санитизировать и писать тесты. Так что, если у вас есть дополнительные вещи, это вас будет замедлять. Так что, в конце итоге, это будет проблема в темизации. Как вы лучше всего используете ваши ресурсы? Когда вы фазируете код программы, это достаточно просто использовать существующие механизмы, которые вы можете использовать во время комбилации программы. Эти комбилаторы вам дают возможность добавлять разные коды для кафе, для санитизации. Например, современные компайлеры могут добавлять код для санитизации или за следом, какие части кода работают. И как только вы экзекутироваете эту бинарш, тогда вы можете видеть, что происходит и вам дает информацию. Даже если у вас есть сурс, иногда есть программы, которые не имеют сурс, так что нужно посмотреть, как вы можете еще смотреть на этот бинарш. Так что есть программы, где нету сурс-кода. Например, если вы идете на Android, а у вас есть много драйверов, которые нету в open source, то только бинаршики. Иногда целый software нету никакого сурс-кода. Мы все равно хотим найти ошибки в vulnerability в этих кодах, которые имеют сотни миллионов, сотни тысяч линии кода. Единственное решение, чтобы анализировать такие большие бинарки, это делать black box fuzzing. Другой вариант — это динамически переписать программу или бинаршик, когда вы его экзекутироваете. Когда вы его экзекутироваетесь, вы используете инструмент как пин или ангар, чтобы перевести бинаршик, добавляя инструментацию, которую вам дает информацию и дает вам fuzzing делать. Это просто, это достаточно понятно, но 10 до 100 раз медленнее, чем все остальное. Так что мы это не хотим делать, если мы что-то очень эффективное. И последний, а против, то, что мы смотрим, — это статические переписать коды. Так что они статически переписывают бинаршик до того, как его экзекутировают. Но это бы много быстрее работает, это много больше возможно сделать в меньше времени. Так что почему статическая переписка такая сложная? Если вы дезоцемплироваете из код, тогда это берет много времени, даже если что-то простое. И это может тоже сломать таргет. Очень неплохо, если вы выполняете код, как он есть, но вы изменяете offset в программе и изменяете все эти offset в программе. Просто добавляя код внутрь, вы все ломаете. Основное еще, вы должны найти все зависимости и все ссылки, и правильно их настроить. Если вы неправильно сделаете одно связь, то все сломается. Очень сложно, если вы смотрите на бинарник, очень сложно различить. Если одна зависимость неправильна, то программа может случайно сломаться и упасть. Например, если у вас есть такой код, как здесь, это берет значение и сохраняет его где-то в стек. Это может иметь исходники где-то еще, два различных случая. Например, взятие адреса от функции и сохранения его, или просто сохранение в стек какое-то значение, и вы не можете отличить их друг от друга. Если в случае с функцией вы можете изменять это значение, и в случае с каляра вы просто используете его. И вам нужно установить эту нехватающую информацию. Давайте посмотрим. Давайте отправимся в путешествие инструментирования бинарников в ядре. Первый, мы поговорим об инструментировании бинарников, потом, как, вроде бы, файзинг устроен, как мы можем давать синтезацию, и как мы это все вместе совмещаем, чтобы понять, что из этого получится. Посмотрим сначала на инструментирование бинарников. Я сначала поговорю о ретроврайт, который переписывает в бинарнике наш инструмент. Эта система для статистического инструментирования бинарников переводит все эти связи в лейблы, символизирует, проставляются символы на файлы из ассамбли, и их уже легко можно было инструментировать. И также... Ключевая особенность кода должна быть независима от позиции код, позиции на dependent code, потому что код может быть загружен по любому адресу, и это требование, если вы хотите iSLR или Shared Libraries, то есть подключаем ее в библиотеке. Весь код, который вы используете на ваших телефонах, на лаптопах, это все peak code, то есть position dependent code, не зависит от позиции. И таким образом этот код не может никаким образом использовать за хардкоженный, забитый воздями адрес, потому что это не... На x86, на intel, position dependent code имеет... использует адресацию, как offset, от pointer... Относительная ссылка. И поэтому мы можем отличить... мы можем отличить константы от ссылок в таких бинарниках. То есть если мы имеем что-то относительное, это значит мы имеем ссылку, если все остальное, это должно быть констант. Мы не поддерживаем peak, но мы можем так же переписать или другой код, наверное, с возможным. Как происходит символизация? Символизация заменяет все ссылки с лейблами. Все вызовы... Выспользуют... заменяются на ссылки. Мы фокусируемся на относительных джамбах и вызовах. Мы вставляем определенные лейблы в AssemblyCode. Мы находим просто скантер относительные адреса. И также мы добавляем все релокации данных, которые у нас есть. После этих трех этапов мы можем вставить новый код посередине. Мы можем добавить любой рывой код, например, инструментация, какая-то высокоуровневая. Мы можем солить кавыч гайдинг переменных или фазинг и все, что угодно. Теперь я передаю слово Mateo, чтобы она скажет про кавыч гайдинг фазинг. Сейчас у нас есть способ описать инструментирование бинарок. Сейчас мы посмотрим на покрытие основанное фазинг. Обнаружении интересных инпотов, которые приводят к определенным отпутам. Части программы, которые покрывают определенные входы, проверяют, содержат ли входные данные PNG. Если мы проверяем содержат ли части программы PNG, тогда мы находим другие пути программы, байт в один момент времени. Способ, который им работает фазер, интересный путь. Каждый раз, когда фазер генерирует вход, чтобы из-за входа вынуждена фазер. Так что, например, это эксперимент, который мы использовали с программой EFL. Так что человек, который это создал, он фазировал, использовал, он начинал с Hello, который был JPEG Image, но фазер соронос мог находить правильный формат, даже если Image не был правильный. После какого-то момента фазер начал создавать картинки с цветными и черно-белыми мотивами. Так что, реально, этот фазер нам даёт научить программу, даже если мы не знаем, что она делает. Так что, сейчас мы будем говорить о ценитизации. Если мы будем только смотреть на краш программы, тогда мы, наверное, не всё найдём. Если мы устанавливаем программу, мы всё равно можем найти что-то. Один из самых популярных программ — это адрес санитазер. Так что этот санитазер будет искать коррупцию памяти. Это очень старый тип и баг, но это баг, который всё ещё существует в сегодняших программах. Это будет находить, добавляя инструментацию в наши программы. Этот инструмент уже был использован, чтобы находить 1000 баг в кром и в линоксе. Он замедляет это два раза. Как он работает? Так что базовая идея — это то, что ASIN будет добавлять специальные зоны памяти, называя Red Zone, красные зоны. Так что в этом примере мы будем добавлять четыре частей памяти вокруг нашего бафора. Так что как только программа трогает этот красную зону, программа останавливается и она печатает, что случилось. Так что это нам даёт находить четыре частей памяти. В этом примере мы смотрим стринг, который имеет пять характеров. И мы видим, что краш происходит из-за того, что AAA. Так что если мы просто смотрели наши от баги, мы бы не нашли это, потому что это не краш, а просто баг. Так что теперь мы будем смотреть на инструментацию Kernel. Так что используя RetroRite мы можем добавлять инструментацию ASIN и Coverage Tracking к binary. Мы можем добавлять инструкции, где мы хотите. Мы можем добавлять Coverage Tracking и ASIN. Мы должны находить сначала каждого база блока в нашу инструментацию, в каждое начало блока, чтобы сказать нашему фазору, где программа начинается. ASIN может тоже быть добавлен, если вы находите разные места, где память используется. LeapASIN – это программа, которая нам помогает добавлять в наши программы, и она тоже монетирует все аспекты этого фазинга. Так что как мы можем добавлять это Kernel? Нужно понять, что фазировать Kernel намного сложнее, чем вещи, которые трогают использователи. Когда вы фазируете программу, в user space, вы видите краш. Но, если вы видите Kernel, вы не можете увидеть краш так просто. Если вы слишком много фазинга делаете, Kernel просто будет умирать. Он очень много аспектов машины крутит, и вы можете потерять всю информацию, которую вы получили от фазера. Так что, большинство Kernel-фазерсы делают, они фазируют Kernel в виртуальной машине. Если вы хотите фазировать программы, которые работают в user space, вы можете загрузить EFL, и это очень просто программа, которая работает, и вы можете найти информацию в туториалах. Но, если вы, например, хотите фазировать Linux Kernel, вам нужно много больше этапов пройти. Вам нужно компилировать Kernel, у вас нет так много гидов, так много туториалов, и в принципе, намного сложнее это делать и менее интивитивно. И в последней степени у нас проблема если у вас есть программа, которая работает в один трэд, она детерминистическая, и это влияет на как программа работает. Если у вас тест, который не детерминистический, очень сложно найти, что происходит. Так что в Kernel у вас есть проблемы, что есть интерапты, что есть много разных рэд. Вы можете иметь интерапты очень часто. Так что иногда вы можете получить баг, иногда вы можете не получить баг, так что достаточно сложно Kernel fuzzing делать. Так что у нас есть несколько разных вариантов, чтобы делать fuzzing. Первый вариант это Black Box fuzzing. Нам не так уж нравится этот вариант. Второй вариант это динамически переводить. Это работает. Люди использовали это. Они нашли баги. Но это очень медленно. Это добавляет 10 раз больше overhead. Чем больше вы добавляете тесты, чем лучше вы можете находить баги. Сейчас нету хорошего санитазерва для Kernel, для бинарщиков Kernel. Для User Space Program есть разные инструменты, которые существуют, но в Kernel нет такого. Дополнительный вариант это использовать Kernel Tracers, который приходит, например, Intel. Это вариант очень интересный и работает хорошо, но нужно иметь hardware, который поддерживает эту технологию. Так что если вы используете Android или старый CPU, вы не можете это делать. И все равно там нет всех функций. Например, санитизация неправильно работает. Так что дополнительный вариант это статический перевод. Так что у нас было хороший способ диатсфазинг переводить Kernel. И мы его поменяли чуть-чуть, чтобы можно было использовать Linux модулю. Мы использовали это, чтобы фазировать модулю Kernel. И заметили, что эта манера может быть использована также для User Space, для Kernel. Хорошая штука насчет Kernel Modules это то, что они все время независимые от позиции. Linux Modules они тоже дополнительный, специальный класс из Earth Files, даже если они не такие же бинарчики, как User Space, они достаточно близкие. Так что нам не нужно было менять мы вставили Code Coverage в ядро дополнительный. Идея проекта CarWaterRide мы хотели использовать существующие тулсы фазеров в User Space. У нас есть EFL tracking, которые полностью аналогичны. И инфраструктура кейков уже существует и мы хотели ее использовать. Негативная часть кейков изходный код Linux Open Source мы имплементировали кейков на бинарках здесь небольшой пример как мы это сделали функция TraysPC мы производим ядро и функцию фазинга и те, как мы имплементировали лип-ейсен и так далее в User Space мы сленковали приложение sleep-ayson в ядре мы собрали ядро с k-assan это называется kernel-assan и сохраняет всякую методату в методанной из нашем ядре в нашем подходе мы можем интегрироваться с фазированием в ядре мы видим это как довольно хорошие плюсы а не ограничения как вы сделаете эсен вы находите каждый запрос в доступ к памяти и с проверкой если все провалены проверки это как дают бак-репорт так же это совместимо с k-assan и поэтому мы довольно счастливы мы можем перезисписать модули и которые могут быть загружены и использовать фазирование с другими стандартными фазерами типа сэскалера и таким образом мы достигли конец нашего путешествия и теперь мы сейчас представим эксперименты, которые мы провели мы хотели сравнить производительность нашего бинарника саурс-бейст на основе исходного кода и другие фазерами для юзерспейса вы можете использовать мемпчек основан на бинарном перекодировании и работают с бинарниками мы собрали эсен и смотрели сколько это быстро и для драм мы решили провозировать некоторые файловые системы, драйверы и используем саурс-кейзан и также кейков вот наши результаты для юзерспейса красные это валграйнд очень-очень-очень долго для фазирования бинарник-эсен гораздо хорошее большое улучшение для этого и мы имеем в основном исходном коде саурс-эсен и бейстлен мы как мы видим саурс-эсен имеет некоторые overhead немного неэффективно, но тем не менее довольно неплохо это предательные результаты для ядра вы можете видеть, что overhead не такой большой это чистый CPU бенчмарк для BT-RFS как вы заметили, что вы можете с сколером из хоста в гости в виртуальную машину это занимает очень большое время и добавляет overhead в инструментацию с сколером таким образом, поскольку вы любите демо давайте посмотрим мы приготовили маленький модуль ядра этот модуль очень простой и он имеет небольшую уязвимость что он делает, он создает определенные устройства это такая вещь, которую вы записываете и можете из нее читать данные вместо файла они идут в ядро в драйвер и обратно как вы видите, происходит локация 16-байт в ядре копирует данные в использовании и если совпадает 1.337 то печатает по одному байту вы можете видеть, что этот бак выходит из границ мы соберем этот модуль копируем таким образом, мы получили наш модуль он уже инструментирован кейретро-райт вот так мы сделали инструментирование нашего модуля мы получили символизированный асамплифайл и сам модуль вот наш довольно большой, как вы можете видеть вы можете видеть инструментацию асан оригинальный код загружается к некоторой данной из этого адреса потом сначала вычисляет непосредственно адрес проверяется какой-то метод данной проверяет находится ли в красной зоне этот адрес или нет и если нет, то производит так трейс и выходит из программы запустим слева мы видим оригинальный модуль без инструментации справа у нас модуль с инструментированный асан так вы видите, оригинальный модуль имеет пуш и загрузку в памяти справа модуль инструментированный мы видим сначала инструментацию асан и загрузку и между этим всем мы видим нашу инструментацию все в порядке теперь мы можем проверить это и посмотреть что он делает мы загрузим очень простую линку систему и попробуем затронуть эту уязвимость и мы увидим что инструментированный код упадет а инструментированный нет так, мы запускаем нашу систему я не знаю почему так долго загружается это KVM пожалуйста, будьте легче с нами так, мы загрузили наш модуль как мы видим создал файл наш файл демо символное устройство мы можем записать туда что-то до доступа к памяти находится в границах, что все хорошо и попробуем сделать доступ вне границ нашего массива если мы записываем нашу магическое значение мы получаем определенное значение которое мы ожидали удалим этот модуль и попробуем сделать то же самое только с инструментированным модулем мы видим, что этот демо это устройство еще здесь и модуль все еще работает запишем 1, 2, 3, 4 он не падает и если мы запустим 1, 3, 3, 7 это создаст баг-репорт аплодисменты здесь очень много информации вы можете видеть, как была лоцирована память сколько была задач высвобождена размер каша вы видите, что это 16 байт мы видим layout нашей памяти мы видим неправильную память мы видим FCCCC это наша красная зона в которой мы инструментируем надеюсь, вам понравилось после того, как мы применили этот модуль мы можем посмотреть, что мы можем увидеть с реальной файловой системой и после какого-то времени мы получили несколько использований из автофрии чтений и записей мы проверили баг-репорты мы получили очень много-много проблем в Linux-хедре в этом модуле, который мы фазировали на тот момент и это заняло некоторое время, чтобы пофиксить этот баги как вы видите, в Linux-хедре очень много возможностей, где вы можете применить фазирование очень много целей для фазирования вы можете использовать это вы можете использовать очень много фазирования для того, чтобы найти очень много багов в ведре и дальше вы можете посмотреть на это поближе или сделать что-то еще у нас есть то комендарные драйверы или существующие же модули мы не хотим инструментировать все, что находится в ведре мы хотим инструментировать маленький фрагмент кода и сфокусироваться на нем и посмотреть, что мы можем там найти мы можем сделать и это зависит от вас, какого инструментации вы хотите вставить, это просто framework мы отправили вас в санитизацию инструментирование бинарников в ведре и нахождение крашей в ведре дайте мне заключить этот выступление если вы ищете пост-долг в позиции, то приходите к нам когда набираем исходный код этого всего будет за религию как open source мы работаем надо еще дополнительными демо и скоро будет много больше демо можете посмотреть на другую инструментацию, которую здесь есть и user space уже доступен через несколько недель у нас будет тут на фазирование ядра с пузырками ключевой итог chariot write et retro write позволяет статичная перезапись бинарников и нулевая стоимость этой инструментации Мы не основанно на юристиках, мы просто перезаписываем, ставим лейблы, и это гораздо проще, чем на больших приложениях. Вы можете сфокусировать фазирование на этих в частях. Другой итог — это то, что вы можете переспользовать уже из готовых инструментов, вы можете использовать асан, который уже существует, и уже использовать хорошую интеграцию с другими существующими инструментами. Попробуйте, посмотрите, скажите нам, если чёрта сломается, мы будем рады все это починить. И теперь временно для вопросов. Спасибо большое. Спасибо большое за хороший доклад, у нас есть несколько минут для вопросов, вопрос с первой микрофона. Здравствуйте, спасибо за доклад, спасибо за демо. Я не уверен, если я понял use case для Kernel с RetroVide. Обычно мы интересуемся фазировать binary в Kernel, когда у нас нету кода, например, для IOT или Android, но вы использовали в Kernel, где обычный Kernel, а не Kernel, который в IOT или в Android, так что у вас есть какой-то план инструментировать Kernel сам, а не модуль. Я думаю, что дополнительные проблемы, которые нам нужно решить, чтобы инструментировать HydroVide нам даёт совместимость с существующими инструментами, мы решали с K-Cow'ом и так далее. Вам нужно подумать об этом, если вам нужно добавить RedZone, это довольно сложно инструментировать другой код для обнаружения других проблем, это всё, я думаю, что вы можете это сделать, но это требует дополнительной работы, например, тезис, который занимает четыре месяца, четыре недели, четыре месяца. Я думаю, для Android, если Hydro под лицензией GPL, так что производители, которые меняют HydroVide, они должны выпустить это под GPL тоже. Вот, почему я спрашиваю, потому что я не понимаю, как это можно использовать в настоящем мире. Дайте мне давать это в перфектив. Мы используем уже существующие инструменты, например, K-Cow'а или Asan'а и интегрируем его с ними для хип-бейст-аллакацией мы используем дополнительные RedZones и вы можете основаться на другие локаторы, вы можете заупстить Hydro и посмотреть на Stacktrace, который там есть, это займет какие-то усилия, чтобы это сделать, но это для ядер, которые не собраны с K-SUN, это довольно не так сложно, да, на многих ядрах уже Asan'а уже включен, так что также есть довольно большое сообщество, которое может это решить, K-RetroRite и RetroRite, это просто платформа перезаписи, которая превращает Бинарник в AssemblyFile, который вы можете инструментировать и дальше использовать его, да, вы можете дозделаться в клад обратно. Было очень практично, спасибо, свежий вопрос с интернетом, есть вопрос на счет слайда, связан с SpecCPU беншмарк, второй или третий график имел результат, как бы быстрее, чем оригинал. Эффекта каша, вот и все, свежий вопрос, спасибо за презентацию, сколько архитектур вы используете и сколько вы будете в будущем, только X64, так что сейчас нет план для арм или MIPS, есть некоторое время технологии, другие архитектуры тоже в нашем списке, если кто-то хочет нам помочь и сделать в клад, то мы в принципе сейчас, у нас есть некоторые список целей и арм там первый, но основные это X86 и так об основные по форму. Свежий вопрос, вы пробовали фазировать настоящие программы, которые не имеют открытый source-код, так что вы пробовали только вещи, у кого есть открытый source-код, вы пробовали закрытый. Для оценки нам нужно было сравнить с инструментом сцембинарника и исходного кода, поэтому мы были сфокусированы на файловых системах с исходным кодом, который мы можем посмотреть, что до компайлера, мы хотели найти некоторые закрытые сходным кодом драйвера, чтобы найти какие-нибудь такие драйвера, это было очень интересно было. А с сколером у вас есть такая проблема, что вам нужно перезаписать правила с лаварией, вам нужно понимать, как нужно общаться с драйвером, да, например эти закрытые файлы с системы с закрытым сходным кодом, они… Спасибо, все еще вопросы, спасибо за заклады, я не знаю, если какие-то SKK или KSAN эквиваленты для Windows, но я хотел знать, если вы пробовали или будете пробовать Windows, потому что я знаю, что это может быть достаточно сложно с подвесами. Да, мы об этом думали, но у нас есть некому… Да, Windows это довольно сложно, мы академики и листочек, которые я производю в своей лаборатории исследования, и в основном он сфокусирует на Open Source, да, поддержка Windows находится вне зоны нашей работы, это гораздо больше работы и гораздо мало значимости в плане исследования. Если вы хотите нас спонсировать, пожалуйста, да, это вопрос стоимости, цены. Вы смотри на внутренний и юзерспейс, да, спасибо, вопросы, все еще вопросы, это больше всего интересует для vulnerabilities, которые Close Source, но выгодит, что очень просто остановить эту атаку, если вы делаете вашу просто Close Source программу, например, вы можете взять разницу между адресом двух функций, мы явно в оригинальной статье мы решили не работать с обфусырованным кодом или специальным кодом, который пытался обойти этот реврайтинг, перезапись, надо удалить этот странный код и обфусыренный код. В то же время драйвера не собираются с такой обфускацией, мы собираем обычным компайлером, это конечно ограничение, они сложные, не обязательно обфусырованы, только бинарные драйвера. Следующий вопрос, как вы решаете, куда поставить красные зоны, в один момент вы говорили о трансмитации памяти, много частей процесса, так что как вы это делаете? Я хочу салаться на статью для этом, по этому случаю, как раз мы обубликовали на гитхабе, если подумать об этом, то современные компайлеры вставляют кенарейку в стек, если буфер перезаполнен, то вставляется кенарейка, которая предотвратить это, и нам нужно найти этот стек кенарей, удалить эти кенарейки, удаляйте этот ког и добавляете свои асановские RED зоны, это довольно круто, потому что вы можете использовать вот этот код, который из компайлера и хакнуть Следующий вопрос из интернета, вы пробовали использовать LLVM IR для вашего кода вместо того, чтобы сделать ассамбль? Да, да, это будет довольно неплохо, чтобы использовать LLVM, мы реально посмотрели на это, это очень сложно, прямое мапирование между машином кодом и LLVM IR вам все-таки еще нужно восстановить все типы, это такая магия, чтобы превратить одно в другое, это реально очень сложно, если вы соберете IR в машинный код, вы теряете огромное количество информации, вам нужно восстановить эту всю информацию, и это довольно невозможно в многих случаях, например, мы только встанавливаем десимволизированный код, связи и референции, мы не поддерживаем эти, потому что мы не можем и решить эту проблему на данный момент, я могу поговорить об этом вам с нами позже, и также здесь в статье, это маленькая проблема, только если вы используете Assembly Files или IR, вы используете только сквозное восстановление, да, это было очень круто, но, к сожалению, это очень сложно, мы использовали некоторые евристики, но нету все равно решения для этой проблемы, которые было бы на 100% в корректном. Следующий вопрос, спасибо за доклад. Какие десасембры вы использовали для RetroRite, и у вас были проблемы с неправильной десасемблей, и если это было, тогда как вы это решили? RetroRite, мы использовали Capstone для десасимблирования, классная вещь, нам нужны некоторые, какая-то информация о том, какие функции, в модели хедра это довольно просто, потому что ему нужно построить стактрейсы, это проще, а в user space это менее распространено, мы не делаем некоторую мультифуксу, у нас возникли в некоторые проблемы с AT&T-синдексом, мы хотели использовать Gnu Assembler, Gnu Assembler, но некоторые инструкции были написаны одинаково, имени Моники были одинаковые, но проблема в том, что гидро не любит эти инструкции, и падает почему-то, и гидро использует динамическую патч адресов, и гидро падает из-за того, что меняет обсеты. Если вы увидели инструкции, которые не используются с десасимблером, вы увидели это, и программа кращировала, вы это должны были вручную, это чиниться? Если мы видели бы, что это была проблема, но я не помню, так чтобы была какая-то неизвестная инструкция, которая не попадала под это, это тоже занимает какое-то время работа. Я дам не повторить, это работа не в Assembler, но проблема с форматом инструкции, с одной и той же Mnemonic, которая превращается в несколько разных инструкций. Они оба используют идентичную Mnemonic, но кодируются в разные... Так что у вас не было проблем с инструкциями, которые не были поддержаны? Нет, нет, нет. Следующий вопрос. Ваша инструментация для обинарщиков, она также сильная, как Acryonal Casane. Она детекстирует все коррупции памяти. Глобальных переименах нет, но это все в куче происходит в хиппе. Некоторые есть вариации в стеке, потому что мы можем использовать Canary Code, как нету полного восстановления всего формата данных, нам нужно использовать уже всякие расширения Compiler, чтобы это использовалось. Но, например, как Canary, мы не поддерживаем потоки данных между... Для глобальных переименах у нас есть ограниченная поддержка только. Все время, которое у нас было для этого доклада, вы можете найти спикер потом здесь. И дайте им, пожалуйста...