введение в этой статье описывается, как неинициализированные переменные могут стать причиной “неопределенного поведения” программы, а также приводится пример того, как данный факт может быть использован для перехвата управления приложением. все приведенные примеры были проверены на ubuntu linux [1]. надеемся, что читатель, ознакомившись с представленным материалом, заинтересуется аналогичными проблемами в функциях glibc, коде ядра и многопоточных приложениях [2]. все примеры написаны на си и ассемблере под x86. как читатель, вы должны разбираться в этих языках программирования, а также не испытывать проблем с дизассемблированием и получением информации из страниц стандартной документации (man pages). предыстория в начале 2005 года я изучал исходники одного почтового демона. в коде активно использовались указатели и связанные списки, а также присутствовало несколько ошибок, дающих возможность перехвата потока выполнения приложения из функции, в которой происходит разыменование неинициализированного указателя. исследуя эту уязвимость, я заметил несколько странностей, которые позволили мне предположить, что значение разыменованного неинициализированного указателя не всегда неопределенно. на основе опыта исследования этой уязвимости, я покажу, как разыменование неинициализированного указателя, при определенных условиях, может быть использовано для создания рабочего эксплойта. краткий взгляд на инициализацию чтобы начать дискуссию о “неопределенных” данных, я расскажу о двух основных этапах инициализации переменных. во время компиляции во время разработки приложения программист часто использует глобальные переменные, содержащие предопределенные значения. в том случае, если глобальной переменной присвоено значение, она является инициализированными данными и обычно находится в сегменте .data исполняемого файла. если значение переменной не определено, она считается неинициализированной и помещается в сегмент .bss исполняемого файла. example-1.c include int gvar = 12; int main(void) { printf(“%d ”, gvar); return gvar; } в примере выше, переменная ‘gvar’ объявлена как глобальная и инициализирована значением 12.
Copyright 2010 - All rights reserved Your Company name
Related Posts
Many Tags
May 2, 2008Readability Test
May 1, 2008Many Tags
May 2, 2008Readability Test
May 1, 2008