Секреты покорения эльфов Крис Касперски ака мыщъх Хакер, номер #083, стр. 083-106-3 Начиная с адреса 40000000h, располагаются совместно используемые библиотеки ld-linix.so, libm.so, libc.so и другие, которые связывают операционную систему с прикладной программой. Ближайший аналог из мира Windows - KERNEL32.DLL, реализующая win32 API, но при желании программа может вызывать функции операционной системы и напрямую. В NT за это отвечает прерывание INT 2Eh, в Linux, как правило, INT 80h (подробнее о различии в реализации системных вызовов можно прочитать в документе UNIX Assembly Codes Development for Vulnerabilities Illustration Purposes или книге Зубкова «Ассемблер - язык неограниченных возможностей»). Для вызова функций типа открытия файла можно обратиться либо к библиотеке libc, либо непосредственно к самой операционной системе. Первый вариант - самый громоздкий, самый переносимый и наименее приметный. Последний - прост в реализации, но при первом же взгляде на дизассемблерный листинг тут же бросается в глаза (правильные программы INT 80h не вызывают!), к тому же он испытывает проблемы совместимости с различными версиями Linux. Вот она - расплата за простоту! Последний гигабайт адресного пространства (от адреса C0000000h и выше) занимают код и данные операционной системы, к которым мы будем обращаться только посредством прерывания INT 80h или через разделяемые библиотеки. Стек находится в нижних адресах. Он начинается с базового адреса загрузки и «растет вверх» по направлению к нулевым адресам. В большинстве линуксов стек исполняем (то есть сюда можно скопировать машинный код и передать на него управление), однако некоторые параноидальные администраторы устанавливают заплатки, отнимающие у стека атрибут исполняемости, но большой распространенности они не получили, и ими можно пренебречь. [имплантация чужеродного кода в ELF-файл] Для экспериментов по имплантации нам потребуется живой исполняемый файл, который при помощи компилятора и текстового редактора мы сможем изготовить и самостоятельно. Нажмем <Shift-F4> в Midnight Commander'е, наберем программу следующего содержания (см. листинг), затем <F2>/"имя-файла.c" и откомпилируем ее своим любимым gcc с настройками по умолчанию (gcc имя-файла.c -o имя-файла). Демонстрационная программа, в которую мы будем внедрять посторонний код #include <stdio.h> main() { printf("LORDI - the best group in the world!\n"\ "(www.lordi.org)\nmonsters, bondage and sado-maso\n"); } Образовавшийся файл загрузим в hex-редактор (./ht-0.7.5-linux-i386 имя-файла), а затем нажмем <F6> (mode) и выберем elf/image. Редактор перейдет в режим отображения образа исполняемого файла, автоматически перенося нас в окрестности точки входа, отмеченной меткой entrypoint. Если этого не произойдет, нажмем <F5> (goto) и введем entrypoint (без кавычек). Экран должен выглядеть приблизительно так: |