Системный шпионаж в *nix часть 1 Крис Касперски ака мыщъх Хакер, номер #087, стр. 087-134-6 Далее подготовим тестовую программу, которая будет вызывать функцию gets. Один из вариантов реализации выглядит так: тестовая программа demo.c, используемая для экспериментов с функций gets char buf[666]; while(strcmp(buf, "exit")) printf(".", gets(buf)); Не выходя из hex-редактора, откомпилируем ее ("gcc demo.c -o demo") и запустим на выполнение ("./demo"). Программа выполняется, как и положено, а именно: ожидает ввода с клавиатуры и выходит по "exit". Теперь изменяем первый байт функции на C3h, сохраняем изменения по <F2> и запускаем ./demo еще раз. На этот раз функция gets немедленно возвращает управление, не обращая никакого внимания на клавиатуру, и экран заполняется стройными рядами точек. Ура! У нас получилось! Модификация gets() воздействует как на уже запущенные, так и на впоследствии запускаемые процессы, причем процессу очень сложно обнаружить, что его хакнули! Примечание: если gets() уже находится в ожидании ввода, то замена 55h на С3h не приводит к немедленному выходу из функции, и результат будет заметен только при ее следующем вызове. Но насколько это надежно? Что произойдет, если модифицированная страница в результате нехватки памяти отправится в изгнание, или какой-нибудь процесс попытается загрузить хакнутую библиотеку еще раз? Гарантирует ли операционная система непротиворечивость ситуации? Документация (см. "man mem") не дает ответа на поставленный вопрос, и это правильно, поскольку модификация страниц отслеживается не самой операционной системой, а процессором. При любой записи в страницу (не важно, каким путем она произошла, — хоть инструкцией mov, хоть через /dev/mem), процессор устанавливает dirty-флаг, сообщая ОС, что при вытеснении страницы ее следует сбрасывать на диск. Специального обработчика для поддержки "хакнутых" страниц нет, они обрабатываются так же, как остальные (как нам надо). Никакой процесс не может "перезагрузить" хакнутую библиотеку, поскольку ОС не видит никакой необходимости считывать с медленного диска то, что уже находится в оперативной памяти. Можно предположить, что, если все процессы выгрузят модифицированную библиотеку, спустя какое-то время операционка действительно выбросит ее из памяти и при повторной загрузке начнет дергать диском. Тогда наш хак пойдет лесом, но эта ситуация маловероятна. В любом случае ей можно противостоять путем перехвата dlclose(). |