Эксплоит под wu-ftpd kas1e Xakep, номер #052, стр. 052-054-2 Теперь вкратце о том, что мы имеем относительно %n 'форматера': 1. возможность записи данных по адресу, на который указывает второй аргумент. 2. a) подсчет символов в строке форматирования. b) подсчет символов в строке с учетом предположительного размера строки форматирования. Вот, собственно, те нюансы, которые необходимо знать относительно %n - символа форматирования. Осталось понять взаимодействие стека и printf, прежде чем разобрать написание эксплоита. Объясню, для чего я буду рассматривать взаимодействие функции и стека. Нам нужна возможность двигаться по стеку в поисках информации, такой как адреса возвратов функций (надеюсь, из предыдущих статей ты помнишь, что такое адрес возврата). И вот что получается: ты можешь записывать данные как второй аргумент по адресу (т.е. в стек), ползать по самому стеку и находить адреса возвратов, перезаписываемые адресами наших шеллкодов (опять же, читай предыдущие статьи про переполнения буфера). В итоге получаешь: шеллы, руты и чруты. А теперь рассмотрим пример: #include <stdio.h> int main(int argc, char **argv) // берем данные с командной строки { int i = 1; // целая переменная i = 1 char buffer[64]; // символьный буфер в 64 байта char tmp[] = "\x01\x02\x03"; // символьный буфер с 3 байтами snprintf(buffer, sizeof buffer, argv[1]); // ограничиваем буфер 64 байтами buffer[sizeof (buffer) - 1] = 0; //печать размера буфера printf("buffer : [%s] (%d)\n", buffer, strlen(buffer)); //печать переменной i. printf ("i = %d (%p)\n", i, &i); } Пока что не пытаемся переполнить буфер или перезаписать какие-то данные в стеке, а просто копируем аргумент в символьный массив buffer. На основе этой программки легко понять, что происходит в стеке при использовании snprintf() функции. Откомпилим его и запустим: # gcc test_stack.c -o test_stack # ./test_stack haha buffer : [haha] (4) i = 1 (bffff674) Работает, как и запланировано. На рисунке показано, что же происходит со стеком при вызове sprintf(). Я не буду мучить тебя объяснениями, а сразу скажу результат. Используя символы форматирования как аргументы в командной строке, ты можешь читать данные из стека :). За более детальной информацией лучше всего обратиться к соответствующим ссылкам внизу (в блок-врезке). Т.е. ты можешь искать важную информацию, такую как адрес возврата функции (на самом деле можно искать и другое, но об этом в другой раз). wu-ftpd Этот ftp демон, написанный в вашингтонском университете (Washington University's ftp server = wu-ftpd), имеет расширенные возможности по сравнению с обычным ftpd. Видимо в результате таких расширений он и приобрел славу одного из самых глючных демонов. Уязвимость, которая будет описана далее, связана с некачественной обработкой команды SITE EXEC. Проблемный участок кода находится в ftpd.c файле, в функции vreply(). Вот как он выглядит: |