Ревнивых А.В., Велижанин А.С. —
Исследование дизассемблированного представления исполняемых файлов, сформированных различными компиляторами. Пример уязвимости на переполнение буфера
// Кибернетика и программирование. – 2019. – № 1.
– С. 1 - 17.
DOI: 10.25136/2644-5522.2019.1.28238
URL: https://e-notabene.ru/kp/article_28238.html
Читать статью
Аннотация: Предметом исследования является потенциальная уязвимость, в частности на переполнение буфера, в различном программном обеспечении, связанная с функцией стандартной библиотеки языка программирования С/С++ strcpy и подходы и методы поиска таковой уязвимости. Объектом исследования выступают данные машинного кода компиляторов при выполнении сборки программы в различных режимах.
Целью исследования является провести анализ некоторых особенностей машинного кода, генерируемого различными компиляторами для Windows и Linux в режимах Debug и Release, в том числе, проведя на основе этого обзор уязвимости переполнения буфера. Методы исследования. В работе рассматриваются и развиваются методы построения алгоритмов поиска уязвимости переполнения буфера, исследуются характеристики данной уязвимости на уровне машинного кода. Для этого используются компиляторы Visual C++, Intel C++, g++, а также отладчики WinDBG, GDB.
Ключевые выводы. Сборка программ в различных режимах приводит к формированию различий в исполняемом коде, который сделан из полностью одного и того же кода языка программирования высокого уровня; эти различия проявляются в отличиях в поведении программы. В ходе исследования программного обеспечения в поисках уязвимостей важно проводить анализ машинного кода с целью выявления скрытых закономерностей.
Новизна исследования заключается в выявлении отличий в машинном коде, полученном после сборки одинакового высокоуровневого кода, определении «штампов» компиляторов при выполнении сборки программы в различных режимах. Особым вкладом автора в исследование темы является развитие методов построения алгоритмов поиска уязвимости переполнения буфера.
Abstract: The subject of the study is a potential buffer overflow vulnerability in various software related to the function of the standard C / C ++ strcpy programming language library and approaches and methods for finding such vulnerabilities. The object of the study is the data of the machine code of the compilers when the program is assembled in various modes. The purpose of the study is to analyze some features of the machine code generated by various compilers for Windows and Linux in the Debug and Release modes, including, on the basis of this, a review of the buffer overflow vulnerability. Research methods. The paper reviews and develops methods for constructing algorithms for searching for buffer overflow vulnerabilities, examines the characteristics of this vulnerability at the level of machine code. This is done using the Visual C ++ compilers, Intel C ++ compilers, g ++ compilers, as well as the WinDBG, GDB debuggers. Key findings. Building programs in different modes leads to the formation of differences in the executable code, which is made from the completely same high-level programming language code; these differences manifest themselves in differences in program behavior. In the course of researching software in search of vulnerabilities, it is important to analyze computer code in order to identify hidden patterns. The novelty of the study lies in identifying differences in the machine code obtained after assembling the same high-level code, identifying compiler stamps when executing the assembly of the program in different modes. A special contribution of the author to the study of the topic is the development of methods for constructing algorithms for searching for buffer overflow vulnerabilities.
Ревнивых А.В., Велижанин А.С. —
Метод автоматизированного исследования структуры дизассемблированного представления программного кода с уязвимостью на переполнение буфера с использованием матричного подхода
// Кибернетика и программирование. – 2018. – № 6.
– С. 11 - 30.
DOI: 10.25136/2644-5522.2018.6.28288
URL: https://e-notabene.ru/kp/article_28288.html
Читать статью
Аннотация: Предметом исследования являются алгоритмы оптимизации автоматизированного поиска зависимостей на дизассемблированном коде. Объектом исследования выступают зависимые блоки кода на х64 архитектуре процессоров производства корпорации «Intel» и листинги, полученные в результате реверс-инжиниринга программного обеспечения компиляторами с различными настройками в Windows и Linux.
Цель исследования. Целью исследования является рассмотреть возможность использования математических матриц для построения карты машинного кода, а также сделать обзор возможных проблем для автоматического анализа, совершить поиск путей следования информационных потоков. Методы исследования. В работе использовался компилятор Visual C++. Рассматривается архитектура, в которой передача информации может быть осуществлена способами: регистр-память, память-регистр, регистр-регистр. Для анализа был избран метод формирования списка функций, вызываемых до исследуемого потенциально опасного блока кода, сформированный для каждого рассматриваемого пути к исследуемому блоку. Описываются и развиваются методы реализации матричного подхода. Новизна и ключевые выводы. Метод математических матриц может быть использован для построения карты машинного кода. Однако для определения путей достижимости отдельных блоков кода может потребоваться значительное количество ресурсов. Кроме того, машинный код может быть подвергнут воздействию упаковщиков и обфускаторов, что так же вносит дополнительные сложности. Был выделен ряд потенциально опасных функций стандартной библиотеки языка программирования С/С++.
Abstract: The subject of the research is the optimization algorithms for automated dependency search on disassembled code. The object of the research is the dependent code blocks on the x64 architecture of Intel processors manufactured by the company and listings obtained as a result of reverse engineering software by compilers with different settings in Windows and Linux.Purpose of the study. The purpose of the study is to consider the possibility of using mathematical matrices to build a machine code map, and also to review possible problems for automatic analysis, to search for the paths of information flows. Research methods. We used the Visual C ++ compiler. We consider the architecture in which the transfer of information can be carried out in the following ways: register-memory, memory-register, register-register. For the analysis, the method of forming the list of functions called up to the potentially dangerous block of code under investigation, chosen for each considered path to the block under study, was chosen. Methods for implementing the matrix approach are described and developed. Novelty and key findings. Mathematical matrix method can be used to build a machine code map. However, determining the reachability paths of individual code blocks may require a significant amount of resources. In addition, the machine code can be exposed to packers and obfuscators, which also introduces additional complexity. A number of potentially dangerous functions of the standard library of the C / C ++ programming language were identified.