Консольные этюды Andrey Matveev Хакер, номер #071, стр. 071-102-2 % cat > spl0it.c << EOF #include <stdio.h> int main(void){printf("You are under attack!\n");exit(0);} EOF Утилита cat будет принимать вводимые тобой символы до тех пор, пока не встретит метку EOF, а затем содержимое буфера запишет в файл spl0it.c. Хотя того же результата можно добиться и более простым способом (сигнал отбоя Ctrl+D эмулирует End-Of-File): % cat > spl0it.c исходный код эксплоита Ctrl+D Стоит отметить, что продвинутые интерпретаторы командной строки и в данном случае позволяют обойтись без участия cat (zsh% > spl0it.c). Кошерная ищейка Рано или поздно все мы сталкиваемся с проблемой поиска нужной информации на своих многострадальных носителях. Однако процесс поиска может быть затруднен из-за довольно сложной структуры файловой системы, отсутствия файлового менеджера или графических средств поиска. И тогда к нам на помощь приходит утилита find: % time sh -c "find /usr/src -name '*.c' -exec grep fucked {} \; | wc -l" 3 40.67s user 123.22s system 64% cpu 4:13.73 total Проблема заключается в том, что параметр -exec одновременно может выполнить только одну указанную команду на одном файле. В этом случае для каждой команды будет происходить системный вызов fork(2), а это просто недопустимо. Чтобы процесс поиска занял как можно меньше системных ресурсов и нашего драгоценного времени, воспользуемся программой xargs, способной выполнять одну команду над многими файлами одновременно, тем самым существенно уменьшая время поиска: % time sh -c "find /usr/src -name '*.c' | xargs grep fucked | wc -l" 3 11.53s user 14.11s system 20% cpu 2:06.03 total Таким образом, упрощается и набор команд за счет того, что теперь не нужно указывать «{}» для замещения имени текущего найденного файла и «\;» для нахождения конца исполняемой программы. Также небольшой оптимизации можно добиться, применив команду fgrep (при поиске игнорируем регулярные выражения) и параметр -xdev утилиты find (поиск будет производиться только в текущей/указанной файловой системе). No kidding Для расширения кругозора приведу еще один интересный метод поиска контекстной информации. Здесь мы с помощью программы nm(1) проанализируем таблицу внешних символов всех статических библиотек из каталога /usr/lib, чтобы, к примеру, выяснить местоположение функции MD5Final (запись 'T MD5Final' означает поиск символа сегмента кода): % for i in /usr/lib/*.a > do > nm $i 2> /dev/null | fgrep 'T MD5Final' && echo $i > done Результат работы этой комбинации команд будет примерно следующий: 0000022c T MD5Final /usr/lib/libc.a 0000024c T MD5Final /usr/lib/libc_p.a 00000268 T MD5Final /usr/lib/libc_pic.a Теперь нам остается только просканировать сырцы libc на наличие искомой библиотечной функции: % fgrep -rw MD5Final /usr/src/lib/libc /usr/src/lib/libc/crypt/md5crypt.c: MD5Final(final,&ctx1); |