Защита от хакеров корпоративных сетей - страница 71
>open(“/usr/share/i18n/locale.alias”, O_RDONLY) = -1 ENOENT
>(No such file or directory)
>open(“/usr/share/locale/en_US/LC_MESSAGES”, O_RDONLY) = 4
>fstat(4, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
>close(4) = 0
>open(“/usr/share/locale/en_US/LC_MESSAGES/SYS_LC_MESSAGES”,
>O_RDONLY) = 4
>fstat(4, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0
>old_mmap(NULL, 44, PROT_READ, MAP_PRIVATE, 4, 0)
>= 0x40015000
>close(4) = 0
>open(“/usr/share/locale/en_US/LC_MONETARY”, O_RDONLY) = 4
>fstat(4, {st_mode=S_IFREG|0644, st_size=93, ...}) = 0
>old_mmap(NULL, 93, PROT_READ, MAP_PRIVATE, 4, 0)
>= 0x40016000
>close(4) = 0
>open(“/usr/share/locale/en_US/LC_COLLATE”, O_RDONLY) = 4
>fstat(4, {st_mode=S_IFREG|0644, st_size=29970, ...}) = 0
>old_mmap(NULL, 29970, PROT_READ, MAP_PRIVATE, 4, 0)
>= 0x4010e000
>close(4) = 0
>brk(0x804d000) = 0x804d000
>open(“/usr/share/locale/en_US/LC_TIME”, O_RDONLY) = 4
>fstat(4, {st_mode=S_IFREG|0644, st_size=508, ...}) = 0
>old_mmap(NULL, 508, PROT_READ, MAP_PRIVATE, 4, 0)
>= 0x40017000
>close(4) = 0
>open(“/usr/share/locale/en_US/LC_NUMERIC”, O_RDONLY) = 4
>fstat(4, {st_mode=S_IFREG|0644, st_size=27, ...}) = 0
>old_mmap(NULL, 27, PROT_READ, MAP_PRIVATE, 4, 0)
>= 0x40018000
>close(4) = 0
>open(“/usr/share/locale/en_US/LC_CTYPE”, O_RDONLY) = 4
>fstat(4, {st_mode=S_IFREG|0644, st_size=87756, ...}) = 0
>old_mmap(NULL, 87756, PROT_READ, MAP_PRIVATE, 4, 0)
>= 0x40116000
>close(4) = 0
>fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 4),
>...}) = 0
>open(“test”, O_RDONLY|O_LARGEFILE) = 4
>fstat(4, {st_mode=S_IFREG|0664, st_size=6, ...}) = 0
Наконец, команда cat открывает наш файл «test». Конечно, имя файла – это входные данные команды, но они безопасны для работоспособности команды из-за ее логики работы. В других случаях может потребоваться учет содержимого входного файла.
>read(4, “hello\n”, 512) = 6
>write(1, “hello\n”, 6) = 6
>read(4, “”, 512) = 0
>close(4) = 0
>close(1) = 0
>_exit(0) = ?
В заключение cat пытается прочитать 512 байтов из файла (читает 6) и выводит их на экран (который описан STDOUT с дескриптором файла 1). При повторной попытке прочитать очередные 512 байтов файла читается 0 байт, что свидетельствует о достижении конца файла. В результате файл закрывается, дескриптор файла освобождается и выполняется нормальный выход (признаком нормального выхода является нулевой код завершения).
Для демонстрации читателю представляем очень простой пример. Логика работы команды cat очень проста и легко восстанавливается. На псевдокоде команду cat можно записать следующим образом:
>int count, handle
>string contents
>handle = open (argv[1])
>while (count = read (handle, contents, 512))
>write (STDOUT, contents, count)
>exit (0)
Для сравнения приведем результат выполнения утилиты truss для той же самой команды, выполненной в системе Solaris 7 на машине (x86):
>execve(“/usr/bin/cat”, 0x08047E50, 0x08047E5C) argc = 2
>open(“/dev/zero”, O_RDONLY) = 3
>mmap(0x00000000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC,
>MAP_PRIVATE, 3, 0) = 0xDFBE1000
>xstat(2, “/usr/bin/cat”, 0x08047BCC) = 0
>sysconfig(_CONFIG_PAGESIZE) = 4096
>open(“/usr/lib/libc.so.1”, O_RDONLY) = 4
>fxstat(2, 4, 0x08047A0C) = 0
>mmap(0x00000000, 4096, PROT_READ|PROT_EXEC, MAP_PRIVATE, 4,
>0) = 0xDFBDF000
>mmap(0x00000000, 598016, PROT_READ|PROT_EXEC, MAP_PRIVATE,
>4, 0) = 0xDFB4C000
>mmap(0xDFBD6000, 24392, PROT_READ|PROT_WRITE|PROT_EXEC,
>MAP_PRIVATE|MAP_FIXED, 4, 561152) = 0xDFBD6000
>mmap(0xDFBDC000, 6356, PROT_READ|PROT_WRITE|PROT_EXEC,