Linux список системных вызовов скрипта

linux notes

суббота, 13 февраля 2016 г.

Системные вызовы Linux небольшой справочник

Знание системных вызовов очень облегчает работу программистов (для написаний программ на языке программирования С) и системным администратором при дебаге какой-либо программы, с помощью таких инструментов, как: strace/gdb и пр. Вот небольшое описание системных вызовов Linux.

1. exit Завершение процесса
2. fork Создание дочернего процесса
3. read чтение из файлового дескриптора
4. write Запись в файловый дескриптора
5. open открытие файла или устройства
6. close закрытие файлового дескриптора
7. waitpid ожидание завершения процесса
8. creat создание файла или устройства (man 2 open)
9. link задание нового имени файла
10. unlink удаление имени и файла
11. execve выполнить программу
12. chdir изменить рабочую директорию
13. time получить время в секундах
14. mknod создание специального блочного или символьного файла
15. chmod изменение прав доступа к файлу
16. lchown изменение владельца файла
17. stat получения статус файла
18. lseek установка смещения для позиционирования операций чтения/записи
19. getpid получение идентификатора процесса
20. mount монтирование файловой системы
21. umount размонтирование файловой системы
22. setuid установить идентификатор пользователя
23. getuid получить идентификатор пользователя
24. stime установить системное время и дату
25. ptrace разрешить родительскому процессу контролировать выполнеине дочернего процесса
26. alarm установка времени доставки тревожного сигнала
27. fstat получить статус файла
28. pause останавливает процесс до получения сигнала
29. utime изменить время доступа и/или модификация inode
30. access проверить права доступа пользователя к файлу
31. nice изменить приоритет процесса
32. sync сброс буферов файловой системы
33. kill отправить сигнал процессу
34. rename изменить имя или расположение файла
35. mkdir создать директорию
36. rmdir удалить директорию
37. dup создать дубликат файлового дескриптора
38. pipe создает межпроцессорный канал
39. times ведет запись времен процесса
40. brk изменение размера сегмента данныхх
41. setdig установить идентификатор группы
42. getgid получить идентификатор группы
43. sys_signal ANSI C обработка сигналов
44. geteuid получить эффективный идентификатор пользователя, установленный setuid битом на исполняемом файле
45. getegid получить эффективный идентификатор группы, установленные setuid битом на исполняемом файле
46. acct включает или выключает учет процессов
47. umount2 размонтировать файловую систему
48. ioctl управление устройствами
49. fcntl манипуляция с файловым дескриптором
50. setpgid установить идентификатор группы дял процесса
51. umask получение или установка маски режима создания файлов
52. chroot изменение корневой директории
53. ustat получить статистику по файловой системе
54. dup2 создать дубликат файлового дескриптора
55. getppid получить ID родительского процесса
56. getpgrp получить ID группы процесса
57. setsid создает сеанс и устанвливает идентификатор группы
58. sigaction POSIX обработка сигналов
59. sgetmask ANSI C обработка сигналов
60. ssetmask ANCI C обработки сигналов
61. setreuid устанавливает действительный и/или действующий идентификатор пользователя
62. setregid устанавливает дейсвтительный и/или действующий идентификатор группы
63. sigsuspend временно изменяет значение маски блокировки сигналов процесса
64. sigpendind позволяет определить наличие ожидающих сигналов
65. sethostname устанавливает хостнейм
66. setrlimit устанавливает ограничения использования ресурсов
67. getrlimit получить ограничение использования ресурсов
68. getrusage получить максимальное ограничение использования ресурсов
69. gettimeofday получить время
70. settimeofday установить время
71. getgroups получить список дополнительных идентификаторов групп
72. setgroups установить список дополнительных идентификаторов групп
73. old_select синхронизировать I/O мультиплексирование
74. symlink создать символическую ссылку на файл
75. lstat считать статус файла
76. readlink вывести значение символической ссылки
77. uselib выбрать разделяемую библиотеку
78. swapon разрешает подкачку данных в файл/устройство
79. reboot перезагружает систему и разрешает/запрещает использование клавш Ctrl-Alt-Del
80. old_readdir считывает данные директории
81. old_mmap отражает файлы или устройства в памяти
82. munmap снимает отражение файлов или устройств в памяти
83. truncate укорачивает файл до заданной длины (файл должен быть доступен для записи)
84. ftruncate укорачивает файл до заданноой длины (файл должен быть открыт для записи)
85. fchmod изменить права доступа к файлу
86. fchown изменить владельца и группу файла
87. getpriority получить приоритет программы
88. setpriority установить приоритет программы
89. profil выполняет профилирование времени
90. statfs получить статистику файловой системы
91. fstatfs получить статистику файловой системы
92. ioperm устанавливает права на работу с портами ввода/вывода
93. socketcall системные вызовы сокетов
94. syslog читает и/или очищает кольцевой буфер сообщений ядра, устанавливает console_loglevel
95. setitimer устанавливает значение таймера интервалов (interval timer)
96. getitimer считывает значение таймера интервалов
97. sys_newstat получить статус файла
98. sys_newlstat получить статус файла
99. sys_newfstat получить статус файла
100. iopl менять уровень привелений ввода-вывода
101. vhangup имитирует прекращение работы на текущем терминале
102. idle делает процесс 0 простаиваемым
103. vm86old включить виртуальный 8086 режим
104. wait4 ожидает завершение работы процесса (стиль BSD)
105. swapoff запрещает подкачку данных в файл/устройство
106. sysinfo возвращает общесистемную статистику
107. ipc системные вызовы System V IPC
108. fsync синхронизирует состояние файла в памяти с состоянием на диске
109. sigreturn возвращается из обработчика сигнала и очищает временный стек
110. clone создать процесс-потомок
110. setdomainname установить имя домена
111. uname сообщает информацию о данном компьютере и операционной системе
112. modify_ldt получает или устанавливает ldt
113. adjtimex тонкая настройка часов в ядре
114. mprotect контролирует доступ к области памяти
115. sigprocmask POSIX-фукнция обработки сигналов
116. create_module создает загружаемый модуль
117. init_module инициализирует загружаемый модуль
118. delete_module удаляет загружаемый модуль
119. get_kernel_syms retrieve exported kernel and module symbols
120. quotactl работает с дисковыми квотами
121. getpgid получает группу процессов
122. fchdir изменить рабочий каталог
123. bdflush запустить, активизировать или настроить демона записи буферов кэша
124. sys_newfstat получает информацию о файловой системе
125. personality устанавливает домен исполнения процесса
126. setfsuid устанавливает идентификатор пользователя файловой системы
127. setfsgid устанавливает идентификатор группы для досутпа к файловой системе
128. sys_llseek move extended read/write file pointer
129. getdents получить записи каталога
130. select многопоточный синхронный ввод-вывод
131. flock установить или снять advisory Блокировку на открытый файл
132. msync синхронизирует содержимое файла с его отражением в памяти
133. readv чтение данных из нескольких буферов
134. writev запись данных в несколько буферов
135. sys_getsid get process group ID of session leader
136. fdatasync снихронизирует содержимое файла в памяти с содержимым на диске
137. sysctl читает/записывает параметры системы
138. mlock запрещает страинчный обмен в некоторых областях памяти
139. munlock разрашает страинчный обмен в некоторых областях памяти
140. mlockall запрещает страничный обмен всему процессу
141. munlockall разрашает страничный обмен всему процессу
142. sched_setparam устанавливает параметры планировщика
143. sched_getparam получает параметры планировщика
144. sched_setscheduler устанавливает алгоритм планировщика (и его параметры)
145. sched_getscheduler получает алгоритм планировщика (и его параметры)
146. sched_yield освободить процессор
147. sched_get_priority_max задать верхнюю планку диапазона статических приоритетов
148. sched_get_priority_min задать нижнию планку диапазона статических приоритетов
149. sched_rr_get_interval определяет временной интервал SCHED_RR для заданного процесса
150. nanosleep останавливает работу процесса на заданное время (нано секунды)
151. mremap изменяет отражение адреса виртуальной памяти
152. setresuid устанавливает идентификатор реальной, эффективной и сохранненной групп пользователей
153. getresuid получает идентификатор реальной, эффективной и сохранненной групп пользователей
154. vm86 войти в виртуальный режим 8086
155. query_module query the kernel for various bits pertain ing to modules
156. poll ожидает некоторое событие в файловом описателе
157. nfsservctl интерфейсная функция системного демона nfs
158. setresgid устанавливает идентификатор реальной, эффективной и сохранненной групп пользователей
159. getresgid получает идентификатор реальной, эффективной и сохранненной групп пользователей
160. prctl оперирует процессами
161. pread чтение информации из опистаеля файла согласно заданному смещению
162. pwrite запись информации из описателя файла согласно заданному смещению
163. chown изменяет владельца и группу файлов
164. getcwd возвращает текущий рабочий каталог
165. capget получить возможности процесса
166. capset установить возможности процесса
167. sigaltstack считывает или устанавливает содержимое дополнительного стека сигнала
168. sendfile производит обмен данными между описателями файлов
169. vfork создает дочерний процесс и блокирует родительский

Читайте также:  Windows 10 слетают ассоциации файлов

Источник

Перехват системных вызовов с помощью ptrace

ptrace (от process trace) — системный вызов в некоторых unix-подобных системах (в том числе в Linux, FreeBSD, Max OS X), который позволяет трассировать или отлаживать выбранный процесс. Можно сказать, что ptrace дает полный контроль над процессом: можно изменять ход выполнения программы, смотреть и изменять значения в памяти или состояния регистров. Стоит оговориться, что никаких дополнительных прав при этом мы не получаем — возможные действия ограничены правами запущенного процесса. К тому же, при трассировке программы с setuid битом, этот самый бит не работает — привилегии не повышаются.

В статье будет показано, как перехватывать системные вызовы на примере ОС Linux.

1. Немного о ptrace

#include
long ptrace( enum __ptrace_request request, pid_t pid, void *addr, void *data);

  • request — это действие, которое необходимо осуществить, например PTRACE_CONT, PTRACE_PEEKTEXT
  • pid — индентификатор трассируемого процесса
  • addr и data зависят от request‘а

Начать трассировку можно двумя способами: приаттачиться к уже запущенному процессу (PTRACE_ATTACH), либо запустить его самому с помощью PTRACE_TRACEME. Мы рассмотрим второй случай, он немножко попроще, но суть та же. Для управления трассировкой можно использовать следующие аргументы:

  • PTRACE_SINGLESTEP — пошаговое выполнение программы, управление будет передаваться после выполнения каждой инструкции; такая трассировка достаточна медленна
  • PTRACE_SYSCALL — продолжить выполнение программы до входа или выхода из системного вызова
  • PTRACE_CONT — просто продолжить выполнение программы

Для более подробной информации — man ptrace.

2. Просмотр системных вызовов

Напишем программу для вывода списка системных вызовов, используемых программой (простенький аналог утилиты strace).

Итак, для начала необходимо сделать fork — родительский процесс будет отлаживать дочерний:

int main( int argc, char *argv[]) <
pid_t pid = fork();
if (pid)
parent(pid);
else
child();
return 0;
>

В дочернем процессе все просто — начинаем трассировку с PTRACE_TRACEME и запускаем нужную программу:

void child() <
ptrace(PTRACE_TRACEME, 0, 0, 0);
execl( «/bin/echo» , «/bin/echo» , «Hello, world!» , NULL);
perror( «execl» );
>

При выполнении execl трассируемый процесс остановится, передав свое новое состояние родительскому. Поэтому родительский процесс сначала должен подождать запуска программы с помощью waitpid (можно просто wait, так как дочерний процесс всего один):

Читайте также:  Host файл windows путь

Чтобы как-то различать системные вызовы и другие остановки (например SIGTRAP), предусмотрен специальный параметр PTRACE_O_TRACESYSGOOD — при остановке на системном вызове родительский процесс получит в статусе SIGTRAP | 0x80:

ptrace(PTRACE_SETOPTIONS, pid, 0, PTRACE_O_TRACESYSGOOD);

Теперь можно в цикле выполнять PTRACE_SYSCALL до выхода из программы, и смотреть значение регистра eax для определения номера системного вызова. Для этого используем PTRACE_GETREGS. Следует отметить, что регистр eax в момент остановки заменен, и поэтому необходимо использовать сохраненный state.orig_eax:

struct user_regs_struct state;

ptrace(PTRACE_SYSCALL, pid, 0, 0);
waitpid(pid, &status, 0);

// skip after syscall
ptrace(PTRACE_SYSCALL, pid, 0, 0);
waitpid(pid, &status, 0);
>

Запустив программу, увидим нечто подобное:

.
SYSCALL 6 at b783a430
SYSCALL 197 at b783a430
SYSCALL 192 at b783a430
SYSCALL 4 at b783a430
Hello, world!
SYSCALL 6 at b783a430
SYSCALL 91 at b783a430
SYSCALL 6 at b783a430
SYSCALL 252 at b783a430

Как видно, после системного вызова №4 (а это sys_write) выводится наш текст.

3. Перехват системного вызова

Попробуем теперь перехватить вызов, и сделать что-нибудь хорошее. Системный вызов write выглядит так:

  • ebx: fd — файловый дескриптор (номер)
  • ecx: buf — указатель на текст для вывода
  • edx: n — количество байт

Для подмены текста используем PTRACE_POKETEXT:

// sys_write
if (state.orig_eax == 4) <
char * text = ( char *)state.ecx;
ptrace(PTRACE_POKETEXT, pid, ( void *)(text+7), 0x72626168); //habr
ptrace(PTRACE_POKETEXT, pid, ( void *)(text+11), 0x00000a21); //!\n
>

.
SYSCALL 6 at 00556416
SYSCALL 197 at 00556416
SYSCALL 192 at 00556416
SYSCALL 4 at 00556416
Hello, habr!
SYSCALL 6 at 00556416
SYSCALL 91 at 00556416
SYSCALL 6 at 00556416
SYSCALL 252 at 00556416

Таким образом, мы перехватили системный вызов sys_write в программе /bin/echo для вывода своего текста. Это всего лишь простой пример использования ptrace. С его помощью также можно легко делать дампы памяти (это, кстати, очень помогает при решении линуксовых крэкмисов), устанавливать breakpoint’ы (с помощью PTRACE_SINGLESTEP или заменой интсрукции на 0xCC), анализировать регистры/переменные и многое другое. ptrace очень полезен, например, когда до проблемного участка кода быстро не добраться — если в отладчике приходится многократно прыгать, подменять данные, а потом программа умирает и приходится все делать заново; если же написать программу для отладки ptrace’ом — все эти действия необходимо описать только один раз, и они будут выполняться автоматически. Конечно, в некоторых отладчиках можно писать скрипты — но по возможностям они навернякак уступают.

Читайте также:  Windows block all ads

Источник

Оцените статью