Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #71, НОЯБРЬ 2004 г.

Консольные этюды

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);

Назад на стр. 071-102-1  Содержание  Вперед на стр. 071-102-3