<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on CTF.MSK.RU</title><link>https://ctf.msk.ru/post/</link><description>Recent content in Posts on CTF.MSK.RU</description><generator>Hugo -- gohugo.io</generator><language>ru-RU</language><lastBuildDate>Mon, 11 Nov 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://ctf.msk.ru/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Пошаговый мануал по использованию Burp Suite для тестирования веб-безопасности</title><link>https://ctf.msk.ru/p/burp-suite-tutorial/</link><pubDate>Mon, 11 Nov 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/burp-suite-tutorial/</guid><description>&lt;img src="https://ctf.msk.ru/post/burp-suite-tutorial.webp" alt="Featured image of post Пошаговый мануал по использованию Burp Suite для тестирования веб-безопасности" /&gt;&lt;h1 id="пошаговый-мануал-по-использованию-burp-suite-для-тестирования-веб-безопасности"&gt;Пошаговый мануал по использованию Burp Suite для тестирования веб-безопасности
&lt;/h1&gt;&lt;p&gt;&lt;strong&gt;Burp Suite&lt;/strong&gt; — это комплексный инструмент для тестирования безопасности веб-приложений, который позволяет перехватывать и анализировать HTTP-запросы, сканировать уязвимости, автоматизировать атаки и многое другое. В этом мануале мы рассмотрим, как настроить Burp Suite, перехватывать трафик и выполнять базовые проверки безопасности.&lt;/p&gt;
&lt;h2 id="установка-и-настройка-burp-suite"&gt;Установка и настройка Burp Suite
&lt;/h2&gt;&lt;p&gt;Для работы с Burp Suite установите программу, скачав её с официального сайта:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://portswigger.net/burp/communitydownload" target="_blank" rel="noopener"
&gt;Burp Suite Community Edition (бесплатная версия)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://portswigger.net/burp" target="_blank" rel="noopener"
&gt;Burp Suite Professional (платная версия)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Примечание&lt;/strong&gt;: Бесплатная версия предоставляет множество функций, необходимых для базового тестирования безопасности.&lt;/p&gt;
&lt;h3 id="шаг-1-настройка-прокси-сервера"&gt;Шаг 1: Настройка прокси-сервера
&lt;/h3&gt;&lt;p&gt;Burp Suite работает как прокси-сервер и перехватывает HTTP/HTTPS-трафик, направляемый через него. Для этого нужно настроить браузер на использование прокси.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Запустите Burp Suite&lt;/strong&gt;: Откройте программу и создайте новый проект.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Перейдите в &amp;ldquo;Proxy&amp;rdquo; -&amp;gt; &amp;ldquo;Options&amp;rdquo;&lt;/strong&gt;: Убедитесь, что прокси-сервер запущен на &lt;strong&gt;127.0.0.1:8080&lt;/strong&gt;. Это будет порт, через который Burp будет перехватывать трафик.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Настройка браузера&lt;/strong&gt;: Настройте браузер так, чтобы он использовал Burp Suite в качестве прокси-сервера.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В Firefox перейдите в &lt;strong&gt;Settings -&amp;gt; Network Settings&lt;/strong&gt; и установите прокси-сервер на &lt;code&gt;127.0.0.1:8080&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Импорт сертификата Burp&lt;/strong&gt;: Burp Suite использует собственный сертификат для перехвата HTTPS-трафика. Чтобы браузер доверял этому сертификату:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Откройте в браузере URL: &lt;code&gt;http://burpsuite&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Нажмите на &amp;ldquo;CA Certificate&amp;rdquo; для загрузки сертификата и установите его в браузере.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="шаг-2-перехват-и-анализ-http-запросов"&gt;Шаг 2: Перехват и анализ HTTP-запросов
&lt;/h3&gt;&lt;p&gt;Теперь Burp Suite может перехватывать все запросы, отправляемые из браузера.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Активируйте перехват трафика&lt;/strong&gt;: В Burp Suite перейдите в &lt;strong&gt;Proxy -&amp;gt; Intercept&lt;/strong&gt; и убедитесь, что &lt;strong&gt;Intercept&lt;/strong&gt; включён.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Отправьте запрос через браузер&lt;/strong&gt;: Откройте любой веб-сайт или веб-приложение в браузере. Burp Suite перехватит запрос и отобразит его в разделе &lt;strong&gt;Intercept&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Анализ запроса&lt;/strong&gt;: В окне Intercept вы можете увидеть запрос, в том числе метод (GET или POST), заголовки и параметры.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Изменение и отправка запроса&lt;/strong&gt;: При необходимости измените параметры запроса и отправьте его на сервер, нажав на кнопку &lt;strong&gt;Forward&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="шаг-3-использование-функции-repeater-для-анализа-уязвимостей"&gt;Шаг 3: Использование функции Repeater для анализа уязвимостей
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Repeater&lt;/strong&gt; — это инструмент в Burp Suite, позволяющий многократно отправлять запросы с изменёнными параметрами для анализа их реакции.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Отправьте запрос в Repeater&lt;/strong&gt;: Щёлкните правой кнопкой на перехваченный запрос в Intercept и выберите &lt;strong&gt;Send to Repeater&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Изменение параметров&lt;/strong&gt;: В разделе &lt;strong&gt;Repeater&lt;/strong&gt; вы можете редактировать параметры запроса, такие как &lt;code&gt;username&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;, &lt;code&gt;token&lt;/code&gt;, и отправлять изменённые версии запроса на сервер, нажимая &lt;strong&gt;Send&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Анализ ответов&lt;/strong&gt;: Сравнивайте ответы сервера на разные версии запроса, чтобы найти уязвимости. Например, проверяйте, как сервер реагирует на попытки SQL-инъекций или XSS.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="шаг-4-использование-intruder-для-автоматизированных-атак"&gt;Шаг 4: Использование Intruder для автоматизированных атак
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Intruder&lt;/strong&gt; позволяет автоматизировать атаки, такие как брутфорс или перехват данных.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Отправьте запрос в Intruder&lt;/strong&gt;: Нажмите правой кнопкой на нужный запрос и выберите &lt;strong&gt;Send to Intruder&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Выбор параметров для атаки&lt;/strong&gt;: В Intruder можно выбрать части запроса, которые будут изменяться, используя &lt;strong&gt;Add §&lt;/strong&gt; вокруг параметров (например, &lt;code&gt;username&lt;/code&gt; или &lt;code&gt;password&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Настройка атаки&lt;/strong&gt;: Выберите режим атаки:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sniper&lt;/strong&gt; — тестирует одну точку атаки за раз.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cluster Bomb&lt;/strong&gt; — комбинирует несколько параметров.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Добавьте список значений&lt;/strong&gt;: Например, если вы хотите протестировать несколько паролей, добавьте список значений в раздел &lt;strong&gt;Payloads&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Запуск атаки&lt;/strong&gt;: Нажмите &lt;strong&gt;Start attack&lt;/strong&gt;. Intruder переберёт все комбинации и покажет ответы сервера для каждого варианта.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="шаг-5-использование-scanner-для-поиска-уязвимостей"&gt;Шаг 5: Использование Scanner для поиска уязвимостей
&lt;/h3&gt;&lt;p&gt;Scanner (доступен в Professional-версии Burp Suite) позволяет автоматически сканировать веб-приложение на наличие уязвимостей.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Запустите сканирование&lt;/strong&gt;: Отправьте любой запрос в Scanner (правая кнопка -&amp;gt; &lt;strong&gt;Scan&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Анализ отчёта&lt;/strong&gt;: После завершения сканирования Burp Suite покажет список уязвимостей, таких как SQL-инъекции, XSS, уязвимости в заголовках безопасности.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="шаг-6-использование-декодера-для-анализа-и-преобразования-данных"&gt;Шаг 6: Использование декодера для анализа и преобразования данных
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Decoder&lt;/strong&gt; помогает декодировать и кодировать данные, такие как base64 или URL-формат.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Декодирование данных&lt;/strong&gt;: Скопируйте данные, которые нужно декодировать, и вставьте их в &lt;strong&gt;Decoder&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Выберите метод декодирования&lt;/strong&gt;: Выберите нужный формат (например, &lt;strong&gt;Decode as Base64&lt;/strong&gt; или &lt;strong&gt;URL Decode&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Анализ результата&lt;/strong&gt;: Decoder отобразит декодированное значение, что может помочь в расшифровке скрытых параметров.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="шаг-7-использование-comparer-для-сравнения-данных"&gt;Шаг 7: Использование Comparer для сравнения данных
&lt;/h3&gt;&lt;p&gt;Comparer позволяет сравнивать различные запросы или ответы, что полезно при анализе реакций сервера на разные параметры.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Отправка данных в Comparer&lt;/strong&gt;: Щёлкните правой кнопкой на ответ или запрос и выберите &lt;strong&gt;Send to Comparer&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Сравнение данных&lt;/strong&gt;: В Comparer выберите оба варианта для сравнения и проанализируйте изменения, что может помочь в выявлении уязвимостей.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="практическое-применение-пример-тестирования-логина-на-уязвимость-к-брутфорсу"&gt;Практическое применение: Пример тестирования логина на уязвимость к брутфорсу
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Перехватите запрос логина&lt;/strong&gt;: Введите данные в форму логина и перехватите запрос через &lt;strong&gt;Intercept&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Отправьте запрос в Intruder&lt;/strong&gt;: Выберите &lt;code&gt;username&lt;/code&gt; и &lt;code&gt;password&lt;/code&gt; как цели для атаки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Добавьте словари&lt;/strong&gt;: В разделе &lt;strong&gt;Payloads&lt;/strong&gt; добавьте словарь с популярными именами пользователей и паролями.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Запустите атаку&lt;/strong&gt;: Нажмите &lt;strong&gt;Start attack&lt;/strong&gt; и отслеживайте ответы сервера на разные комбинации логина и пароля.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="советы-по-безопасности-при-использовании-burp-suite"&gt;Советы по безопасности при использовании Burp Suite
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Тестируйте только свои или разрешённые веб-приложения&lt;/strong&gt;: Пентестинг без разрешения является незаконным и может привести к ответственности.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Отключайте прокси после работы&lt;/strong&gt;: Всегда удаляйте прокси-настройки из браузера после завершения работы с Burp Suite.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Будьте осторожны с автоматизированными атаками&lt;/strong&gt;: Такие атаки могут вызвать перегрузку сервера. Используйте их с осторожностью и только при необходимости.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Burp Suite — это мощный инструмент для тестирования безопасности веб-приложений. Он позволяет перехватывать трафик, отправлять запросы с модификациями, автоматизировать атаки и обнаруживать уязвимости. Используя этот мануал, вы сможете начать работать с Burp Suite и применять его для анализа веб-безопасности. Постепенное изучение всех функций поможет вам стать более уверенным в тестировании безопасности веб-приложений&lt;/p&gt;</description></item><item><title>Введение в пентестинг Wi-Fi: Инструменты и техники для тестирования сетей</title><link>https://ctf.msk.ru/p/wifi-pentesting-introduction/</link><pubDate>Thu, 07 Nov 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/wifi-pentesting-introduction/</guid><description>&lt;h1 id="введение-в-пентестинг-wi-fi-инструменты-и-техники-для-тестирования-сетей"&gt;Введение в пентестинг Wi-Fi: Инструменты и техники для тестирования сетей
&lt;/h1&gt;&lt;p&gt;Беспроводные сети активно используются для передачи данных и предоставления интернета, но они также уязвимы для различных атак. Wi-Fi-пентестинг помогает выявить слабые места в защите сетей и предотвратить атаки на них. В этой статье мы обсудим основные методы тестирования Wi-Fi, популярные атаки и инструменты, используемые для анализа беспроводных сетей.&lt;/p&gt;
&lt;h2 id="основные-понятия-wi-fi-пентестинга"&gt;Основные понятия Wi-Fi-пентестинга
&lt;/h2&gt;&lt;p&gt;Wi-Fi-пентестинг включает проверку уязвимостей в беспроводных сетях, таких как:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Неавторизованный доступ&lt;/strong&gt;: Злоумышленник может подключиться к сети, используя слабый пароль или недостаточную защиту.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Сниффинг (перехват данных)&lt;/strong&gt;: Злоумышленник может перехватить трафик и извлечь данные, передаваемые по сети.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Атака посредника (Man-in-the-Middle, MitM)&lt;/strong&gt;: Злоумышленник может вмешаться в трафик и изменять его.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brute-force атаки&lt;/strong&gt;: Подбор пароля для доступа к сети через перехват хеша.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="протоколы-безопасности-wi-fi"&gt;Протоколы безопасности Wi-Fi
&lt;/h2&gt;&lt;p&gt;Wi-Fi-сети используют несколько протоколов безопасности, которые определяют уровень защиты:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WEP (Wired Equivalent Privacy)&lt;/strong&gt;: Устаревший протокол, уязвимый для различных атак.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WPA (Wi-Fi Protected Access)&lt;/strong&gt;: Протокол, улучшивший защиту по сравнению с WEP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WPA2&lt;/strong&gt;: Основной стандарт безопасности для большинства сетей, использующий AES для шифрования.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WPA3&lt;/strong&gt;: Последняя версия протокола, с улучшенной защитой от атак, таких как перехват пароля.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="основные-техники-пентестинга-wi-fi"&gt;Основные техники пентестинга Wi-Fi
&lt;/h2&gt;&lt;h3 id="1-анализ-конфигурации-сети-и-скрытых-ssid"&gt;1. &lt;strong&gt;Анализ конфигурации сети и скрытых SSID&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Многие сети скрывают своё имя (SSID), однако это не обеспечивает полноценной защиты. Скрытые сети можно обнаружить, анализируя сеть на наличие передачи данных, даже если SSID скрыт.&lt;/p&gt;
&lt;h4 id="техника"&gt;Техника:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Сканируйте сеть на предмет скрытых SSID и проверьте уровень защиты.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-перехват-и-дешифровка-данных-сниффинг"&gt;2. &lt;strong&gt;Перехват и дешифровка данных (Сниффинг)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Сниффинг позволяет перехватывать пакеты, передаваемые в сети, и анализировать их на предмет утечек данных.&lt;/p&gt;
&lt;h4 id="инструменты"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wireshark&lt;/strong&gt; — позволяет захватывать и анализировать пакеты в реальном времени.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tcpdump&lt;/strong&gt; — утилита для захвата пакетов в терминале.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-атака-на-wep-и-wpawpa2-через-перехват-handshake"&gt;3. &lt;strong&gt;Атака на WEP и WPA/WPA2 через перехват Handshake&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Перехват аутентификационного Handshake помогает получить данные для брутфорса пароля.&lt;/p&gt;
&lt;h4 id="шаги"&gt;Шаги:
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Захватить Handshake, используя такие утилиты, как &lt;strong&gt;Aircrack-ng&lt;/strong&gt; или &lt;strong&gt;Kismet&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Применить брутфорс к перехваченному Handshake для расшифровки пароля.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="инструменты-1"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Aircrack-ng&lt;/strong&gt; — набор инструментов для перехвата и анализа трафика.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;hashcat&lt;/strong&gt; — мощная утилита для подбора пароля, используя GPU.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-деаутентификация-deauthentication-attack"&gt;4. &lt;strong&gt;Деаутентификация (Deauthentication Attack)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Эта атака разрывает соединение пользователя с Wi-Fi-сетью. В результате атаки пользователь будет вынужден снова подключиться к сети, и аутентификационные данные можно будет перехватить.&lt;/p&gt;
&lt;h4 id="инструменты-2"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;aireplay-ng&lt;/strong&gt; (из пакета Aircrack-ng) — отправляет deauth-пакеты для принудительного отключения устройств.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mdk3&lt;/strong&gt; — утилита для деаутентификации множества клиентов.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-атака-на-wps-wi-fi-protected-setup"&gt;5. &lt;strong&gt;Атака на WPS (Wi-Fi Protected Setup)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;WPS используется для упрощения подключения устройств, но он также уязвим к атакам. Устаревшие устройства поддерживают WPS, что может позволить злоумышленнику подобрать PIN-код.&lt;/p&gt;
&lt;h4 id="инструменты-3"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reaver&lt;/strong&gt; — утилита для подбора PIN WPS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bully&lt;/strong&gt; — альтернатива Reaver для WPS-брутфорса.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-атака-на-captive-portals"&gt;6. &lt;strong&gt;Атака на Captive Portals&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Многие сети используют captive portals для аутентификации, которые требуют ввода логина и пароля. Эти порталы можно обойти или атаковать.&lt;/p&gt;
&lt;h4 id="инструменты-4"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;wifiphisher&lt;/strong&gt; — утилита для создания поддельных captive portals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ettercap&lt;/strong&gt; — программа для проведения атак типа Man-in-the-Middle.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="популярные-инструменты-для-пентестинга-wi-fi"&gt;Популярные инструменты для пентестинга Wi-Fi
&lt;/h2&gt;&lt;h3 id="1-aircrack-ng"&gt;1. &lt;strong&gt;Aircrack-ng&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Полный набор утилит для работы с беспроводными сетями. С его помощью можно перехватывать трафик, проводить атаки deauthentication, брутфорсить пароли.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Основные компоненты&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;airmon-ng&lt;/strong&gt; — переводит адаптер в режим мониторинга.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;airodump-ng&lt;/strong&gt; — перехватывает пакеты, сканирует сети.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;aireplay-ng&lt;/strong&gt; — выполняет атаки deauthentication.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;aircrack-ng&lt;/strong&gt; — брутфорсит перехваченные ключи.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-kismet"&gt;2. &lt;strong&gt;Kismet&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Сканер беспроводных сетей, который позволяет обнаруживать скрытые сети, просматривать статистику пакетов и анализировать SSID и BSSID. Он удобен для создания карты сетевого покрытия.&lt;/p&gt;
&lt;h3 id="3-wireshark"&gt;3. &lt;strong&gt;Wireshark&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Универсальный инструмент для анализа пакетов, используемый для захвата и анализа данных сети. С помощью Wireshark можно перехватывать пакеты, декодировать протоколы и проверять наличие утечек данных.&lt;/p&gt;
&lt;h3 id="4-reaver"&gt;4. &lt;strong&gt;Reaver&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Специализированный инструмент для брутфорса PIN-кода на устройствах с включенным WPS. Работает эффективно, если сеть использует слабую защиту или уязвимые настройки WPS.&lt;/p&gt;
&lt;h3 id="5-hashcat"&gt;5. &lt;strong&gt;hashcat&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Утилита для подбора паролей, поддерживающая GPU для ускоренного брутфорса. Используется для расшифровки пароля, перехваченного через Handshake.&lt;/p&gt;
&lt;h2 id="рекомендации-по-защите-wi-fi-сетей"&gt;Рекомендации по защите Wi-Fi-сетей
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Отключите WPS&lt;/strong&gt;: Если функция WPS не используется, её рекомендуется отключить, чтобы избежать атак на PIN-код.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Используйте WPA3, если возможно&lt;/strong&gt;: WPA3 обеспечивает более высокий уровень защиты, чем WPA2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Создавайте сложные пароли&lt;/strong&gt;: Длинный и сложный пароль затруднит брутфорс-атаку.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ограничьте доступ к административным панелям&lt;/strong&gt;: Настройте доступ к настройкам роутера только для определённых устройств или IP-адресов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Регулярно обновляйте прошивку&lt;/strong&gt;: Обновления исправляют известные уязвимости, которые могут использовать злоумышленники.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="этика-и-правовые-аспекты"&gt;Этика и правовые аспекты
&lt;/h2&gt;&lt;p&gt;Важно помнить, что пентестинг Wi-Fi следует проводить только с разрешения владельца сети. Проведение тестов на сетях без разрешения незаконно и может привести к ответственности. Пентестинг предназначен для повышения уровня безопасности и не должен нарушать права других людей.&lt;/p&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Пентестинг Wi-Fi — это важная часть информационной безопасности, позволяющая выявить слабые места в беспроводных сетях и защитить их от потенциальных атак. С помощью инструментов, таких как Aircrack-ng, Reaver и Wireshark, можно провести полный аудит сети и укрепить её безопасность. Wi-Fi-пентестинг помогает специалистам и компаниям защищать данные, передаваемые по беспроводной сети, и предотвращать угрозы, возникающие при использовании устаревших технологий или слабых паролей.&lt;/p&gt;</description></item><item><title>Протокол Gemini — минималистичный подход к веб-контенту</title><link>https://ctf.msk.ru/p/protocol-gemini/</link><pubDate>Thu, 07 Nov 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/protocol-gemini/</guid><description>&lt;h1 id="протокол-gemini--минималистичный-подход-к-веб-контенту"&gt;Протокол Gemini — минималистичный подход к веб-контенту
&lt;/h1&gt;&lt;p&gt;Протокол &lt;strong&gt;Gemini&lt;/strong&gt; — это новая альтернатива HTTP, созданная для упрощённого взаимодействия с веб-контентом. Он предоставляет пользователям возможность доступа к информации без избыточных элементов современного интернета, таких как сложные скрипты, обильная реклама и отслеживание. В этом материале мы разберем, как работает протокол Gemini, его преимущества и недостатки, а также особенности разработки под этот протокол.&lt;/p&gt;
&lt;h2 id="что-такое-протокол-gemini"&gt;Что такое протокол Gemini?
&lt;/h2&gt;&lt;p&gt;Протокол Gemini был разработан с целью создания &amp;ldquo;тихой гавани&amp;rdquo; в интернете, где пользователи могут взаимодействовать с информацией без чрезмерной визуальной и интерактивной нагрузки. Основные особенности Gemini:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Минимализм&lt;/strong&gt;: Gemini фокусируется на тексте и базовых гиперссылках, что делает его крайне простым и быстрым.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Конфиденциальность&lt;/strong&gt;: Протокол не поддерживает трекинг и сложные механизмы, что делает его более защищённым от слежки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Низкие требования к устройствам&lt;/strong&gt;: Gemini-приложения и сайты (так называемые &amp;ldquo;капсулы&amp;rdquo;) могут работать на маломощных устройствах, так как не требуют тяжёлых ресурсов для рендеринга.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Протокол Gemini описывает стандарт, согласно которому страницы предоставляются в формате, называемом &lt;strong&gt;Gemtext&lt;/strong&gt; — упрощённом формате разметки, схожем с Markdown, но с ограниченной функциональностью.&lt;/p&gt;
&lt;h2 id="отличия-gemini-от-http-и-https"&gt;Отличия Gemini от HTTP и HTTPS
&lt;/h2&gt;&lt;p&gt;Gemini значительно проще и легче HTTP/HTTPS, так как намеренно ограничивает многие функции, доступные в традиционном интернете:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Протокол только для чтения&lt;/strong&gt;: Gemini не поддерживает формы, что делает его протоколом для потребления информации, а не для активного взаимодействия.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Отсутствие JavaScript и CSS&lt;/strong&gt;: Gemini фокусируется только на контенте. Это означает, что элементы стилей, динамические функции и анимации отсутствуют.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Использование TLS&lt;/strong&gt;: В отличие от HTTP, Gemini требует защищенного соединения (TLS) для всех соединений, что делает его более безопасным.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Отсутствие поддержки изображений и мультимедиа&lt;/strong&gt;: Gemini предназначен только для текстовой информации. При необходимости можно добавить ссылки на изображения, но они не отображаются непосредственно на странице.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="структура-протокола-и-формат-gemtext"&gt;Структура протокола и формат Gemtext
&lt;/h2&gt;&lt;p&gt;Формат Gemtext — это упрощённая разметка для создания Gemini-страниц. Он напоминает Markdown, но с минимальным набором элементов. Основные элементы Gemtext:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Заголовки&lt;/strong&gt;: Для создания заголовков используется &lt;code&gt;#&lt;/code&gt;, как в Markdown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ссылки&lt;/strong&gt;: Добавляются с помощью &lt;code&gt;=&amp;gt;&lt;/code&gt;, за которым следует URL и, при необходимости, описание ссылки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Маркированные списки&lt;/strong&gt;: Элементы списка обозначаются звёздочкой (&lt;code&gt;*&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="пример-страницы-в-формате-gemtext"&gt;Пример страницы в формате Gemtext
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Добро пожаловать на мою страницу Gemini!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Это моя личная страница, на которой я делюсь полезной информацией.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=&amp;gt; gemini://example.com Другая страница в сети Gemini
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* Полезная статья
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* Ссылки на ресурсы
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* Мои контакты
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="как-работает-протокол-gemini"&gt;Как работает протокол Gemini?
&lt;/h2&gt;&lt;p&gt;Протокол Gemini использует защищённое соединение через TLS, что делает его более безопасным для пользователей. Он функционирует на порту &lt;strong&gt;1965&lt;/strong&gt; по умолчанию, что также отличает его от HTTP/HTTPS.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Запрос&lt;/strong&gt;: Клиент запрашивает URL страницы, используя протокол Gemini.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ответ&lt;/strong&gt;: Сервер отвечает заголовком, за которым следует содержимое страницы в формате Gemtext.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Коды ответа&lt;/strong&gt;: Протокол Gemini поддерживает простую схему кодов ответа, которая включает успешный ответ, ошибки и перенаправления.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Основные коды ответа Gemini:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt; — Успешный запрос. Содержимое страницы отправляется клиенту.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3&lt;/code&gt; — Перенаправление. Указывает клиенту на другой URL.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;4&lt;/code&gt; — Ошибка клиента, например, несуществующий ресурс.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;5&lt;/code&gt; — Ошибка сервера, например, внутренняя ошибка.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="преимущества-использования-gemini"&gt;Преимущества использования Gemini
&lt;/h2&gt;&lt;h3 id="1-безопасность-и-конфиденциальность"&gt;1. &lt;strong&gt;Безопасность и конфиденциальность&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Gemini требует использования TLS, что защищает соединение от перехвата данных. Отсутствие поддержки скриптов и форм также ограничивает возможности для трекинга и сбора информации о пользователях, делая его безопасной средой.&lt;/p&gt;
&lt;h3 id="2-минималистичный-и-ненавязчивый-опыт"&gt;2. &lt;strong&gt;Минималистичный и ненавязчивый опыт&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Gemini создавался для предоставления пользователям контента без отвлекающих элементов. Это идеальный выбор для тех, кто ищет чистый и прямолинейный доступ к информации без рекламы и сложных анимаций.&lt;/p&gt;
&lt;h3 id="3-лёгкость-и-экономия-ресурсов"&gt;3. &lt;strong&gt;Лёгкость и экономия ресурсов&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Протокол идеально подходит для маломощных устройств и медленных соединений. Gemini-страницы занимают меньше места и требуют минимальных вычислительных ресурсов для отображения, так как работают с простым текстом и ссылками.&lt;/p&gt;
&lt;h2 id="недостатки-и-ограничения-gemini"&gt;Недостатки и ограничения Gemini
&lt;/h2&gt;&lt;h3 id="1-ограниченная-функциональность"&gt;1. &lt;strong&gt;Ограниченная функциональность&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Gemini намеренно ограничивает возможности взаимодействия с пользователем, что делает его непригодным для веб-приложений, требующих активного взаимодействия, например, для электронной коммерции или социальных сетей.&lt;/p&gt;
&lt;h3 id="2-малое-количество-контента"&gt;2. &lt;strong&gt;Малое количество контента&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Так как Gemini относительно молод, его экосистема ещё не может конкурировать с количеством контента, доступного в традиционном интернете. Однако сообщество активно развивается, и Gemini-контент постепенно растёт.&lt;/p&gt;
&lt;h3 id="3-недостаточная-поддержка-мультимедиа"&gt;3. &lt;strong&gt;Недостаточная поддержка мультимедиа&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Gemini не поддерживает прямое воспроизведение мультимедийного контента, что делает его менее удобным для сайтов, которые ориентированы на изображения или видео. Пользователи могут только переходить по ссылкам на внешние мультимедийные файлы.&lt;/p&gt;
&lt;h2 id="как-начать-пользоваться-gemini"&gt;Как начать пользоваться Gemini?
&lt;/h2&gt;&lt;p&gt;Чтобы просматривать Gemini-страницы, необходимо установить специализированный клиент, так как обычные браузеры не поддерживают этот протокол. Вот несколько популярных клиентов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lagrange&lt;/strong&gt; (доступен для Windows, macOS, Linux) — один из самых популярных клиентов для работы с Gemini, предлагает удобный интерфейс и поддержку всех функций протокола.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amfora&lt;/strong&gt; (доступен для терминала) — минималистичный и лёгкий клиент для пользователей, предпочитающих работать в командной строке.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ariane&lt;/strong&gt; (доступен для Android) — мобильный клиент для Gemini, который позволяет просматривать страницы прямо с телефона.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="установка-lagrange"&gt;Установка Lagrange
&lt;/h3&gt;&lt;p&gt;Для установки Lagrange можно скачать версию для своей операционной системы с официального сайта или установить его из командной строки, если он доступен в репозитории вашей системы:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Пример установки на Ubuntu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo add-apt-repository ppa:skyjake/lagrange
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install lagrange
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;После установки клиента можно открыть его и ввести URL-адрес страницы в сети Gemini (например, &lt;code&gt;gemini://example.com&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="gemini-и-будущее-альтернативных-протоколов"&gt;Gemini и будущее альтернативных протоколов
&lt;/h2&gt;&lt;p&gt;Протокол Gemini стал популярным среди энтузиастов, которые поддерживают идеи минимализма и конфиденциальности в интернете. Хотя он вряд ли станет массовым, Gemini продолжает привлекать внимание благодаря уникальному подходу к созданию и распространению контента.&lt;/p&gt;
&lt;p&gt;Интерес к Gemini также вдохновил разработчиков на создание других альтернативных протоколов, таких как &lt;strong&gt;Gopher&lt;/strong&gt;. Вместе они создают «интернет второго уровня», предоставляя безопасную и спокойную среду для тех, кто предпочитает простой доступ к информации.&lt;/p&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Gemini — это уникальный протокол, который возвращает пользователей к истокам интернета, когда доступ к информации был главным приоритетом. Для тех, кто устал от перегруженных сайтов и непрерывного слежения, Gemini предлагает безопасную, конфиденциальную и минималистичную альтернативу. Начав использовать Gemini, вы сможете открыть для себя новый способ взаимодействия с интернетом, основанный на простоте и уважении к приватности пользователя.&lt;/p&gt;</description></item><item><title>OWASP Top 10 — основные уязвимости веб-приложений</title><link>https://ctf.msk.ru/p/owasp-top-10/</link><pubDate>Wed, 06 Nov 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/owasp-top-10/</guid><description>&lt;h1 id="owasp-top-10--основные-уязвимости-веб-приложений"&gt;OWASP Top 10 — основные уязвимости веб-приложений
&lt;/h1&gt;&lt;p&gt;OWASP Top 10 — это руководство для разработчиков и специалистов по информационной безопасности, освещающее самые критичные уязвимости, которые могут возникнуть в веб-приложениях. В этой статье мы разберём каждый из пунктов OWASP Top 10, предоставив примеры атак и рекомендации по предотвращению.&lt;/p&gt;
&lt;h2 id="1-недостатки-контроля-доступа-broken-access-control"&gt;1. Недостатки контроля доступа (Broken Access Control)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Уязвимости, связанные с управлением доступом, возникают, когда приложение неправильно ограничивает доступ к данным или функциям. Например, если пользователь с низким уровнем доступа может получить доступ к административным функциям.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Изменение прав доступа к данным, манипуляция параметрами URL или перехват запросов для повышения прав.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Использование ролевых моделей доступа.&lt;/li&gt;
&lt;li&gt;Ограничение доступа на уровне сервера, а не на клиенте.&lt;/li&gt;
&lt;li&gt;Проверка прав доступа на всех уровнях, включая API.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-криптографические-ошибки-cryptographic-failures"&gt;2. Криптографические ошибки (Cryptographic Failures)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Эти уязвимости связаны с недостаточным шифрованием данных или хранением конфиденциальных данных в открытом виде.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Злоумышленник может перехватить и расшифровать данные, если приложение использует устаревшие алгоритмы шифрования или передаёт данные в открытом виде.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Использование современных алгоритмов шифрования (AES-256).&lt;/li&gt;
&lt;li&gt;Обеспечение защиты данных на всех этапах: при хранении и передаче.&lt;/li&gt;
&lt;li&gt;Настройка HTTPS с актуальными сертификатами.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-внедрение-injection"&gt;3. Внедрение (Injection)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Уязвимости внедрения возникают, когда непроверенные данные передаются в команду или запрос. К ним относятся SQL-инъекции, командные инъекции и инъекции в LDAP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; SQL-инъекция, позволяющая злоумышленнику получить доступ к данным, отправив запрос вида &lt;code&gt;OR '1'='1'&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Использование подготовленных запросов (prepared statements).&lt;/li&gt;
&lt;li&gt;Валидация и фильтрация пользовательского ввода.&lt;/li&gt;
&lt;li&gt;Ограничение прав доступа к базе данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-неправильная-настройка-безопасности-insecure-design"&gt;4. Неправильная настройка безопасности (Insecure Design)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Уязвимость возникает, если приложение изначально спроектировано без учёта безопасности, что может сделать его уязвимым к различным атакам.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Отсутствие многофакторной аутентификации в финансовом приложении или простой пароль для административной панели.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Использование принципов безопасного проектирования.&lt;/li&gt;
&lt;li&gt;Внедрение моделей угроз на этапе планирования.&lt;/li&gt;
&lt;li&gt;Проведение тестирования безопасности на всех этапах разработки.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-неправильная-настройка-безопасности-security-misconfiguration"&gt;5. Неправильная настройка безопасности (Security Misconfiguration)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Уязвимости, связанные с неправильной конфигурацией серверов и приложений, могут предоставить злоумышленнику доступ к информации или возможностям, которые не предназначены для него.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Доступ к конфиденциальным файлам (например, &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;backup.sql&lt;/code&gt;), оставленным в открытых директориях сервера.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Регулярное обновление и патчинг ПО.&lt;/li&gt;
&lt;li&gt;Использование безопасных конфигураций для всех компонентов.&lt;/li&gt;
&lt;li&gt;Сканирование приложения на открытые файлы и директории.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="6-уязвимые-и-устаревшие-компоненты-vulnerable-and-outdated-components"&gt;6. Уязвимые и устаревшие компоненты (Vulnerable and Outdated Components)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Использование устаревших библиотек, фреймворков или компонентов делает приложение уязвимым для известных атак, так как они могут содержать устаревшие уязвимости.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Использование старой версии библиотеки, которая содержит уязвимость XXE или XSS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Регулярное обновление используемых компонентов и библиотек.&lt;/li&gt;
&lt;li&gt;Проверка на наличие уязвимостей в сторонних компонентах.&lt;/li&gt;
&lt;li&gt;Использование инструментов для мониторинга версий, таких как Snyk и Dependabot.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="7-идентификация-и-управление-аутентификацией-identification-and-authentication-failures"&gt;7. Идентификация и управление аутентификацией (Identification and Authentication Failures)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Уязвимости, связанные с аутентификацией, возникают, когда приложение недостаточно защищает процессы аутентификации и управления сессиями.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Злоумышленник может угадать или перехватить пароль пользователя, если приложение позволяет использовать слабые пароли или не защищает сессии.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Реализация многофакторной аутентификации.&lt;/li&gt;
&lt;li&gt;Ограничение количества попыток входа.&lt;/li&gt;
&lt;li&gt;Использование надёжного шифрования для данных сессии.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="8-неправильное-управление-программным-обеспечением-и-целостностью-данных-software-and-data-integrity-failures"&gt;8. Неправильное управление программным обеспечением и целостностью данных (Software and Data Integrity Failures)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Эта категория охватывает уязвимости, возникающие из-за неправильного управления обновлениями программного обеспечения или из-за изменения данных без авторизации.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Злоумышленник может загрузить на сервер вредоносное обновление, которое выполнит вредоносный код.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Использование подписанных обновлений программного обеспечения.&lt;/li&gt;
&lt;li&gt;Настройка защиты целостности данных, особенно для критических компонентов.&lt;/li&gt;
&lt;li&gt;Регулярный аудит изменений в конфигурации и коде.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="9-недостатки-регистрации-и-мониторинга-безопасности-security-logging-and-monitoring-failures"&gt;9. Недостатки регистрации и мониторинга безопасности (Security Logging and Monitoring Failures)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Если приложение не ведёт логи и не отслеживает действия пользователей, это затрудняет обнаружение и предотвращение атак.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Злоумышленник может многократно пытаться войти в систему, и если логи не настроены, атака может остаться незамеченной.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Внедрение системы журналирования событий, отслеживающей действия пользователей.&lt;/li&gt;
&lt;li&gt;Настройка оповещений для критических событий.&lt;/li&gt;
&lt;li&gt;Проведение регулярного анализа логов.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="10-уязвимости-api-и-внешних-интерфейсов-server-side-request-forgery-и-другие-проблемы-api"&gt;10. Уязвимости API и внешних интерфейсов (Server-Side Request Forgery и другие проблемы API)
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Описание:&lt;/strong&gt; Атаки на API стали популярны в последние годы, и OWASP теперь включает уязвимости API, такие как SSRF, в свой список.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример атаки:&lt;/strong&gt; Злоумышленник может использовать SSRF для отправки запросов к внутренним сервисам, обходя аутентификацию.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Методы защиты:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ограничение запросов API к внешним ресурсам.&lt;/li&gt;
&lt;li&gt;Использование списков разрешённых и запрещённых IP-адресов.&lt;/li&gt;
&lt;li&gt;Внедрение защиты на стороне сервера от SSRF.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;OWASP Top 10 предоставляет разработчикам и специалистам по безопасности полезные рекомендации для защиты веб-приложений от наиболее распространённых и опасных уязвимостей. Понимание этих уязвимостей и внедрение мер защиты на всех этапах разработки поможет создать более безопасное приложение и снизить риск потенциальных атак.&lt;/p&gt;
&lt;p&gt;Изучение и практика с этими уязвимостями также помогут участникам CTF улучшить свои навыки, так как задачи по веб-безопасности часто включают уязвимости, описанные в OWASP Top 10.&lt;/p&gt;</description></item><item><title>Криптографическая безопасность сетевых протоколов</title><link>https://ctf.msk.ru/p/network-protocol-cryptography/</link><pubDate>Wed, 06 Nov 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/network-protocol-cryptography/</guid><description>&lt;h1 id="криптографическая-безопасность-сетевых-протоколов"&gt;Криптографическая безопасность сетевых протоколов
&lt;/h1&gt;&lt;p&gt;Криптография играет важную роль в защите сетевых протоколов, обеспечивая конфиденциальность, целостность и аутентичность данных, передаваемых по сети. В этой статье мы рассмотрим основные криптографические методы защиты сетевых протоколов, как они работают и какие уязвимости могут возникнуть при их использовании.&lt;/p&gt;
&lt;h2 id="зачем-нужна-криптографическая-безопасность-в-сетевых-протоколах"&gt;Зачем нужна криптографическая безопасность в сетевых протоколах?
&lt;/h2&gt;&lt;p&gt;Сетевые протоколы обмениваются данными между устройствами, и, если эти данные не защищены, злоумышленники могут их перехватить, изменить или подделать. Криптография помогает решить эти проблемы, используя несколько ключевых принципов:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Конфиденциальность&lt;/strong&gt;: Защита данных от несанкционированного доступа.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Целостность&lt;/strong&gt;: Защита данных от несанкционированного изменения.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Аутентификация&lt;/strong&gt;: Подтверждение личности отправителя и получателя данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Защита от отказа в обслуживании&lt;/strong&gt;: Предотвращение атак, направленных на нарушение работы сети.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="основные-криптографические-методы-защиты-сетевых-протоколов"&gt;Основные криптографические методы защиты сетевых протоколов
&lt;/h2&gt;&lt;h3 id="1-шифрование-данных-data-encryption"&gt;1. &lt;strong&gt;Шифрование данных (Data Encryption)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Шифрование — это процесс преобразования данных в нечитабельную форму, чтобы только авторизованные пользователи могли их расшифровать. В сетевых протоколах используются два основных типа шифрования:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Симметричное шифрование&lt;/strong&gt;: Одинаковый ключ используется для шифрования и дешифрования данных. Примеры алгоритмов: AES, DES, RC4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Асимметричное шифрование&lt;/strong&gt;: Для шифрования используется открытый ключ, а для дешифрования — закрытый ключ. Примеры алгоритмов: RSA, ECC.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="примеры-использования"&gt;Примеры использования:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;TLS (Transport Layer Security)&lt;/strong&gt; использует асимметричное шифрование для установления соединения и симметричное шифрование для передачи данных, обеспечивая безопасность передачи по интернету.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPSec (Internet Protocol Security)&lt;/strong&gt; применяет симметричное шифрование для защиты сетевых пакетов на уровне IP, обеспечивая безопасность виртуальных частных сетей (VPN).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-электронная-подпись-digital-signature"&gt;2. &lt;strong&gt;Электронная подпись (Digital Signature)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Электронные подписи используются для аутентификации отправителя и подтверждения целостности данных. Это важно, чтобы получатель мог быть уверен в том, что данные действительно пришли от заявленного отправителя и не были изменены.&lt;/p&gt;
&lt;h4 id="примеры-использования-1"&gt;Примеры использования:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Протоколы электронной почты, такие как S/MIME и PGP&lt;/strong&gt;, используют цифровые подписи для проверки отправителей и защиты целостности сообщений.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TLS&lt;/strong&gt; использует цифровые подписи для подтверждения подлинности сертификатов, удостоверяющих сервера.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-хеширование-данных-data-hashing"&gt;3. &lt;strong&gt;Хеширование данных (Data Hashing)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Хеширование — это преобразование данных в строку фиксированной длины, представляющую собой их уникальный отпечаток. Хеширование используется для проверки целостности данных, так как любое изменение данных приводит к изменению их хеша.&lt;/p&gt;
&lt;h4 id="примеры-использования-2"&gt;Примеры использования:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;HTTPS&lt;/strong&gt; использует хеширование для проверки целостности TLS-сообщений с помощью алгоритмов, таких как SHA-256.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPSec&lt;/strong&gt; использует хеширование для обеспечения целостности пакетов через HMAC (Hash-Based Message Authentication Code).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-аутентификация-на-основе-криптографических-токенов"&gt;4. &lt;strong&gt;Аутентификация на основе криптографических токенов&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Криптографические токены, такие как JWT (JSON Web Token), используются для аутентификации пользователей и предоставления доступа к системам. Эти токены содержат данные, подписанные с использованием криптографического ключа, что позволяет удостовериться в их подлинности и предотвратить подделку.&lt;/p&gt;
&lt;h4 id="примеры-использования-3"&gt;Примеры использования:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OAuth&lt;/strong&gt; использует токены для авторизации пользователей, что позволяет приложениям безопасно взаимодействовать друг с другом без обмена паролями.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenID Connect&lt;/strong&gt; — протокол, который строится на базе OAuth и также использует криптографические токены для аутентификации пользователей.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="уязвимости-криптографической-безопасности-в-сетевых-протоколах"&gt;Уязвимости криптографической безопасности в сетевых протоколах
&lt;/h2&gt;&lt;p&gt;Несмотря на использование криптографии, сетевые протоколы всё равно могут быть уязвимы. Рассмотрим некоторые распространённые уязвимости.&lt;/p&gt;
&lt;h3 id="1-атаки-на-шифрование-cryptographic-attacks"&gt;1. &lt;strong&gt;Атаки на шифрование (Cryptographic Attacks)&lt;/strong&gt;
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Атака посредника (Man-in-the-Middle, MITM)&lt;/strong&gt;: Злоумышленник встраивается между клиентом и сервером и перехватывает зашифрованные данные. Без правильной настройки криптографии такие атаки могут остаться незамеченными.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Атака на слабые ключи&lt;/strong&gt;: Если для шифрования используются слабые или короткие ключи, злоумышленник может легко их подобрать методом брутфорса.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="методы-защиты"&gt;Методы защиты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Использование современных алгоритмов шифрования с длиной ключа не менее 128 бит (например, AES-256).&lt;/li&gt;
&lt;li&gt;Реализация механизмов проверки сертификатов, чтобы предотвратить атаки посредника.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-уязвимости-в-реализации-протоколов"&gt;2. &lt;strong&gt;Уязвимости в реализации протоколов&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Даже если протоколы используют надёжные криптографические алгоритмы, ошибки в реализации могут сделать их уязвимыми для атак.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Heartbleed&lt;/strong&gt;: Уязвимость в реализации OpenSSL, которая позволяла злоумышленникам получать доступ к памяти сервера.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Padding Oracle&lt;/strong&gt;: Уязвимость, при которой злоумышленник может узнать содержимое зашифрованного сообщения, используя сообщения об ошибках дешифрации.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="методы-защиты-1"&gt;Методы защиты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Регулярные обновления и патчи для устранения уязвимостей в реализации криптографических библиотек.&lt;/li&gt;
&lt;li&gt;Минимизация использования устаревших и уязвимых протоколов, таких как SSL и старые версии TLS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-неправильное-управление-сертификатами"&gt;3. &lt;strong&gt;Неправильное управление сертификатами&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Цифровые сертификаты используются для удостоверения личности серверов и клиентов. Если сертификаты не управляются надлежащим образом, это может привести к компрометации.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Использование поддельных сертификатов&lt;/strong&gt;: Злоумышленники могут выдавать поддельные сертификаты, чтобы обманом заставить пользователя доверять фальшивому серверу.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Срок действия сертификатов&lt;/strong&gt;: Если сертификаты не обновляются вовремя, их срок действия может закончиться, что откроет путь для атак.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="методы-защиты-2"&gt;Методы защиты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Использование централизованной системы управления сертификатами.&lt;/li&gt;
&lt;li&gt;Настройка автоматического обновления сертификатов, чтобы они не становились просроченными.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="примеры-защищенных-сетевых-протоколов"&gt;Примеры защищенных сетевых протоколов
&lt;/h2&gt;&lt;h3 id="1-tls-transport-layer-security"&gt;1. &lt;strong&gt;TLS (Transport Layer Security)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;TLS — это один из самых популярных протоколов безопасности, который обеспечивает конфиденциальность, целостность и аутентификацию данных при передаче по сети. TLS использует асимметричное шифрование для установления соединения и симметричное шифрование для передачи данных, что делает его одним из самых безопасных протоколов.&lt;/p&gt;
&lt;h3 id="2-ipsec-internet-protocol-security"&gt;2. &lt;strong&gt;IPSec (Internet Protocol Security)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;IPSec — это набор протоколов, который обеспечивает безопасную передачу данных на сетевом уровне. Он использует шифрование, хеширование и аутентификацию для защиты данных и широко используется в VPN-сетях.&lt;/p&gt;
&lt;h3 id="3-ssh-secure-shell"&gt;3. &lt;strong&gt;SSH (Secure Shell)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;SSH — это криптографический сетевой протокол, используемый для безопасного управления устройствами и доступа к удалённым серверам. SSH применяет симметричное шифрование для защиты данных и асимметричное шифрование для аутентификации.&lt;/p&gt;
&lt;h2 id="полезные-инструменты-для-анализа-криптографической-безопасности-сетевых-протоколов"&gt;Полезные инструменты для анализа криптографической безопасности сетевых протоколов
&lt;/h2&gt;&lt;p&gt;Для анализа безопасности сетевых протоколов можно использовать следующие инструменты:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Wireshark&lt;/strong&gt;: Сетевой анализатор, который позволяет отслеживать и анализировать трафик, выявляя уязвимости в протоколах.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenSSL&lt;/strong&gt;: Мощный инструмент для тестирования TLS-соединений и настройки сертификатов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSL Labs&lt;/strong&gt;: Онлайн-сервис для анализа TLS/SSL-конфигураций, предоставляющий детальные отчёты и рекомендации по безопасности.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nmap&lt;/strong&gt;: Утилита для сканирования сети, которая позволяет обнаружить уязвимости в конфигурациях сетевых протоколов.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Криптографическая безопасность — это основа для защиты сетевых протоколов и обеспечения безопасности данных, передаваемых по сети. Несмотря на многочисленные методы защиты, важно помнить, что уязвимости могут возникнуть как в алгоритмах шифрования, так и в реализации протоколов. Постоянная практика, мониторинг и обновление конфигураций сетевых протоколов — важные шаги для обеспечения надёжной защиты данных.&lt;/p&gt;</description></item><item><title>Поиск уязвимостей в веб-приложениях</title><link>https://ctf.msk.ru/p/web-application-vulnerabilities/</link><pubDate>Wed, 06 Nov 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/web-application-vulnerabilities/</guid><description>&lt;h1 id="поиск-уязвимостей-в-веб-приложениях"&gt;Поиск уязвимостей в веб-приложениях
&lt;/h1&gt;&lt;p&gt;Веб-приложения играют важную роль в нашей повседневной жизни, но их сложность и интеграция с множеством систем делают их также уязвимыми для атак. Молодые специалисты и участники CTF должны уметь не только обнаруживать уязвимости, но и понимать методы их эксплуатации. В этой статье мы рассмотрим расширенные подходы к поиску уязвимостей, а также познакомимся с новыми типами атак.&lt;/p&gt;
&lt;h2 id="расширенные-методы-поиска-уязвимостей"&gt;Расширенные методы поиска уязвимостей
&lt;/h2&gt;&lt;h3 id="1-сканирование-веб-приложений-и-поиск-конфигурационных-ошибок"&gt;1. &lt;strong&gt;Сканирование веб-приложений и поиск конфигурационных ошибок&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Конфигурационные ошибки — одна из самых часто встречающихся проблем в веб-приложениях. Например, уязвимости могут возникать из-за отсутствия шифрования, неверной настройки HTTP-заголовков или из-за открытых файлов конфигурации.&lt;/p&gt;
&lt;h4 id="подходы"&gt;Подходы:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Проверка конфигурации заголовков HTTP&lt;/strong&gt;: Например, отсутствие &lt;code&gt;Strict-Transport-Security&lt;/code&gt; или &lt;code&gt;Content-Security-Policy&lt;/code&gt; может указывать на слабую защиту.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Поиск открытых файлов&lt;/strong&gt;: Доступ к файлам &lt;code&gt;.env&lt;/code&gt;, &lt;code&gt;.git&lt;/code&gt;, &lt;code&gt;config.php&lt;/code&gt; или &lt;code&gt;backup.sql&lt;/code&gt; может дать информацию о настройках приложения и доступах к базе данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="инструменты"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nikto&lt;/strong&gt; — инструмент для сканирования конфигураций серверов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gobuster&lt;/strong&gt; — утилита для поиска скрытых директорий и файлов на сервере.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-анализ-api-и-restful-сервисов"&gt;2. &lt;strong&gt;Анализ API и RESTful сервисов&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;API становятся важной частью веб-приложений, позволяя им взаимодействовать с другими сервисами. Однако неправильная реализация API может привести к серьёзным уязвимостям, таким как неавторизованный доступ и утечка данных.&lt;/p&gt;
&lt;h4 id="подходы-1"&gt;Подходы:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Тестирование уровней доступа&lt;/strong&gt;: Попробуйте отправить запросы к API с различными уровнями доступа или с поддельными токенами.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Анализ ограничений по IP и частоте запросов&lt;/strong&gt;: Отсутствие лимитов на количество запросов может привести к атакам, таким как брутфорс и перегрузка сервера.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="инструменты-1"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Postman&lt;/strong&gt; — удобен для тестирования API-запросов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Burp Suite&lt;/strong&gt; — перехватчик, который позволяет анализировать и модифицировать API-запросы.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-тестирование-безопасности-файлового-хранилища-и-загрузок"&gt;3. &lt;strong&gt;Тестирование безопасности файлового хранилища и загрузок&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Многие веб-приложения позволяют пользователям загружать файлы, что может быть опасным, если загрузка файлов недостаточно проверяется. Злоумышленники могут загружать вредоносные файлы или изменять файлы на сервере, если не установлены ограничения.&lt;/p&gt;
&lt;h4 id="подходы-2"&gt;Подходы:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Проверка MIME-типа и расширений&lt;/strong&gt;: Попробуйте обойти фильтры, изменяя MIME-тип файла или используя двойные расширения, такие как &lt;code&gt;file.php.jpg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Исследование путей загрузки&lt;/strong&gt;: Иногда загруженные файлы сохраняются на сервере в общедоступных местах. Определение этих путей может позволить атакующему получить доступ к файлам.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="инструменты-2"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ExifTool&lt;/strong&gt; — для анализа метаданных файлов, загружаемых на сервер.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Burp Suite&lt;/strong&gt; — позволяет тестировать загрузку файлов на сервер и изучать ответы приложения.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-анализ-и-защита-от-ssrf-server-side-request-forgery"&gt;4. &lt;strong&gt;Анализ и защита от SSRF (Server-Side Request Forgery)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;SSRF-атака позволяет злоумышленнику заставить сервер выполнять запросы к другим серверам, к которым клиентский доступ ограничен. Это может привести к утечке внутренних данных, таких как метаданные AWS или внутренние API.&lt;/p&gt;
&lt;h4 id="подходы-3"&gt;Подходы:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Исследование внутренних сетей&lt;/strong&gt;: Используйте SSRF для сканирования внутренних сетей и обнаружения дополнительных уязвимых сервисов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Получение метаданных облачных сервисов&lt;/strong&gt;: Некоторые облачные платформы позволяют получить метаданные через внутренние API, если серверу предоставлен доступ к этим данным.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="инструменты-3"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gopherus&lt;/strong&gt; — утилита для тестирования SSRF через gopher-протокол.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP Request Smuggler&lt;/strong&gt; — позволяет тестировать обходы фильтров для SSRF-атак.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="углублённые-техники-эксплуатации-уязвимостей"&gt;Углублённые техники эксплуатации уязвимостей
&lt;/h2&gt;&lt;h3 id="1-разделение-атак-xss-на-контексты"&gt;1. &lt;strong&gt;Разделение атак XSS на контексты&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;XSS-атака может быть более сложной и эффективной, если учитывать контексты исполнения. На CTF-соревнованиях можно встретить XSS-задачи с различными уровнями защиты, поэтому важно понимать:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DOM-based XSS&lt;/strong&gt;: Происходит на стороне клиента, когда данные не покидают браузер и выполняются в DOM. Задача — определить, какие данные вызывают XSS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Event-based XSS&lt;/strong&gt;: Происходит при активации событий, таких как &lt;code&gt;onclick&lt;/code&gt;, &lt;code&gt;onmouseover&lt;/code&gt;, что требует креативного подхода к внедрению атакующего кода.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-атака-на-json-web-tokens-jwt"&gt;2. &lt;strong&gt;Атака на JSON Web Tokens (JWT)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;JWT часто используется для аутентификации пользователей, но он может быть уязвимым, если используются ненадёжные алгоритмы или секретные ключи.&lt;/p&gt;
&lt;h4 id="подходы-4"&gt;Подходы:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Изменение алгоритма&lt;/strong&gt;: JWT может быть создан с указанием алгоритма &lt;code&gt;none&lt;/code&gt;, если это разрешено, что приводит к атаке без необходимости валидации.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Подбор секретного ключа&lt;/strong&gt;: Если секретный ключ слабый, его можно подобрать с помощью атаки брутфорс.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="инструменты-4"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JWT Cracker&lt;/strong&gt; — инструмент для подбора ключей JWT.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JWT.io&lt;/strong&gt; — онлайн-инструмент для анализа и тестирования токенов JWT.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-обход-защиты-от-брутфорса-и-dos-атак"&gt;3. &lt;strong&gt;Обход защиты от брутфорса и DoS-атак&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Защита от DoS и брутфорс-атак критична, но не всегда достаточно хорошо настроена в веб-приложениях. Участники CTF могут пробовать обходить ограничители скорости и защита от повторных попыток.&lt;/p&gt;
&lt;h4 id="подходы-5"&gt;Подходы:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Использование прокси&lt;/strong&gt;: Некоторые фильтры блокируют только один IP-адрес, что позволяет обходить лимиты с использованием прокси-сетей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Тестирование rate-limiting механизмов&lt;/strong&gt;: Проверка ограничений на количество запросов, посылая их с различной скоростью и отслеживая реакцию сервера.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="инструменты-5"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Burp Intruder&lt;/strong&gt; — позволяет отправлять автоматические запросы и тестировать ограничения.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hydra&lt;/strong&gt; — инструмент для брутфорса на различных сервисах, включая HTTP-формы.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="новые-типы-атак"&gt;Новые типы атак
&lt;/h2&gt;&lt;h3 id="инъекции-команд-в-yaml-и-xml"&gt;Инъекции команд в YAML и XML
&lt;/h3&gt;&lt;p&gt;Инъекции в YAML и XML становятся всё более популярными. Если приложение принимает YAML или XML-данные, злоумышленник может добавить вредоносные команды, что приведет к выполнению произвольных действий.&lt;/p&gt;
&lt;h4 id="подходы-6"&gt;Подходы:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;XXE (XML External Entity)&lt;/strong&gt;: Позволяет внедрить внешние ссылки в XML-файл, что может привести к утечке конфиденциальной информации.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YAML-инъекции&lt;/strong&gt;: Возможность выполнить произвольные команды, используя уязвимости в парсинге YAML.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="инструменты-6"&gt;Инструменты:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;XXE Injector&lt;/strong&gt; — инструмент для тестирования инъекций в XML.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yaml-payloads&lt;/strong&gt; — коллекция полезных нагрузок для тестирования уязвимостей YAML.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-тренировка"&gt;Практика и тренировка
&lt;/h2&gt;&lt;p&gt;Для того чтобы развить навыки поиска уязвимостей и их эксплуатации, важно постоянно практиковаться. Вот несколько ресурсов, которые помогут вам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hack The Box&lt;/strong&gt;: Платформа для практики взлома и защиты веб-приложений.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PortSwigger Web Security Academy&lt;/strong&gt;: Учебные материалы и задания по веб-безопасности, включая углубленные темы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CTFtime.org&lt;/strong&gt;: Ресурс для поиска и участия в CTF-соревнованиях по веб-безопасности.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Поиск уязвимостей в веб-приложениях — это не только понимание базовых атак, таких как SQL-инъекции и XSS, но и работа с расширенными техниками и новыми типами атак. Постоянная практика, внимание к деталям и изучение новых методов позволят вам стать более эффективными в веб-безопасности и решении задач на CTF-соревнованиях.&lt;/p&gt;</description></item><item><title>Часть VIII. Проектная работа по системному программированию</title><link>https://ctf.msk.ru/p/proektnaya-rabota-po-sistemnomu-programmirovaniyu/</link><pubDate>Fri, 18 Oct 2024 22:00:00 +0300</pubDate><guid>https://ctf.msk.ru/p/proektnaya-rabota-po-sistemnomu-programmirovaniyu/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/8-projects.webp" alt="Featured image of post Часть VIII. Проектная работа по системному программированию" /&gt;&lt;hr&gt;
&lt;h2 id="часть-viii-проектная-работа-по-системному-программированию"&gt;&lt;strong&gt;Часть VIII. Проектная работа по системному программированию&lt;/strong&gt;
&lt;/h2&gt;&lt;hr&gt;
&lt;h3 id="81-цели-проектной-работы"&gt;&lt;strong&gt;8.1 Цели проектной работы&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Проектная работа является важной частью учебного процесса и позволяет студентам применить на практике все полученные знания по системному программированию. Основной целью проектной работы является разработка системного программного обеспечения, которое решает конкретную задачу и использует современные инструменты и технологии, изученные в ходе курса.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Основные цели проектной работы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Применить знания системных вызовов, управления процессами, памяти и потоками.&lt;/li&gt;
&lt;li&gt;Использовать технологии параллелизма, виртуализации и контейнеризации.&lt;/li&gt;
&lt;li&gt;Реализовать безопасные механизмы работы с памятью и синхронизацией потоков.&lt;/li&gt;
&lt;li&gt;Интегрировать автоматизацию и инструменты CI/CD для развертывания и тестирования.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="82-примерные-темы-для-проектной-работы"&gt;&lt;strong&gt;8.2 Примерные темы для проектной работы&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В этом разделе будут приведены несколько возможных тем для проектных работ, каждая из которых включает в себя различные аспекты системного программирования. Студенты могут выбрать одну из предложенных тем или предложить собственную тему, которая соответствует целям курса.&lt;/p&gt;
&lt;h4 id="тема-1-разработка-мини-ос-с-базовыми-функциями-управления-процессами-и-памятью"&gt;&lt;strong&gt;Тема 1: Разработка мини-ОС с базовыми функциями управления процессами и памятью&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Описание проекта&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Реализовать простую операционную систему, которая поддерживает создание, управление и завершение процессов. ОС должна предоставлять базовые функции управления памятью (например, выделение и освобождение динамической памяти) и поддерживать параллельное выполнение нескольких процессов.&lt;/li&gt;
&lt;li&gt;В проекте также должны быть реализованы механизмы синхронизации процессов (например, использование семафоров).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Основные технологии&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Системные вызовы: управление процессами и памятью (fork, exec, malloc, free).&lt;/li&gt;
&lt;li&gt;Многопоточность и параллелизм.&lt;/li&gt;
&lt;li&gt;Автоматизация сборки и тестирования с использованием CI/CD инструментов (например, Jenkins).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Примерные шаги&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Создать систему, которая управляет процессами и выполняет системные вызовы для создания и завершения процессов.&lt;/li&gt;
&lt;li&gt;Реализовать механизм многозадачности с использованием потоков или процессов.&lt;/li&gt;
&lt;li&gt;Добавить механизм управления памятью с использованием динамического выделения и освобождения памяти.&lt;/li&gt;
&lt;li&gt;Интегрировать тестирование и развертывание с помощью инструментов CI/CD.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id="тема-2-разработка-драйвера-устройства-для-linux"&gt;&lt;strong&gt;Тема 2: Разработка драйвера устройства для Linux&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Описание проекта&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Разработать драйвер для работы с виртуальным или реальным устройством в операционной системе Linux. Драйвер должен поддерживать функции чтения и записи данных, а также обработку прерываний.&lt;/li&gt;
&lt;li&gt;Драйвер должен быть интегрирован в ядро Linux и протестирован на реальном или эмуляторе устройства.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Основные технологии&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Разработка модулей ядра Linux.&lt;/li&gt;
&lt;li&gt;Взаимодействие с устройствами через системные вызовы.&lt;/li&gt;
&lt;li&gt;Тестирование и отладка драйвера с использованием инструментов &lt;code&gt;gdb&lt;/code&gt; и &lt;code&gt;strace&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Примерные шаги&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Изучить структуру драйверов Linux и разработать базовый драйвер для устройства.&lt;/li&gt;
&lt;li&gt;Реализовать функции чтения и записи данных через системные вызовы.&lt;/li&gt;
&lt;li&gt;Настроить обработку прерываний устройства.&lt;/li&gt;
&lt;li&gt;Протестировать драйвер на реальном устройстве или эмуляторе и исправить возможные ошибки с помощью отладочных инструментов.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id="тема-3-создание-распределенной-системы-с-использованием-docker-и-kubernetes"&gt;&lt;strong&gt;Тема 3: Создание распределенной системы с использованием Docker и Kubernetes&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Описание проекта&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Разработать распределенное системное приложение, которое работает в контейнерах Docker и управляется с помощью Kubernetes. Приложение должно состоять из нескольких сервисов (например, веб-сервер, база данных), которые взаимодействуют друг с другом через сеть.&lt;/li&gt;
&lt;li&gt;В проекте должно быть реализовано автоматическое масштабирование и балансировка нагрузки между сервисами.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Основные технологии&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Контейнеризация с Docker и оркестрация с Kubernetes.&lt;/li&gt;
&lt;li&gt;Автоматизация развертывания и управления с использованием Ansible и Terraform.&lt;/li&gt;
&lt;li&gt;Параллельная обработка запросов с использованием горутин (Go) или потоков (C, Rust).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Примерные шаги&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Разработать системное приложение, состоящее из нескольких взаимодействующих сервисов.&lt;/li&gt;
&lt;li&gt;Запустить приложение в контейнерах Docker.&lt;/li&gt;
&lt;li&gt;Настроить оркестрацию с помощью Kubernetes для автоматического масштабирования и балансировки нагрузки.&lt;/li&gt;
&lt;li&gt;Интегрировать CI/CD для автоматического развертывания и тестирования приложения.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id="тема-4-разработка-высокопроизводительного-сетевого-сервера"&gt;&lt;strong&gt;Тема 4: Разработка высокопроизводительного сетевого сервера&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Описание проекта&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Разработать высокопроизводительный сетевой сервер, который обрабатывает несколько соединений одновременно. Сервер должен поддерживать асинхронную обработку запросов с использованием многопоточности или асинхронного программирования.&lt;/li&gt;
&lt;li&gt;Сервер может быть реализован на языке C с использованием &lt;code&gt;epoll&lt;/code&gt; или на языке Go с использованием горутин.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Основные технологии&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Сетевое программирование (сокеты, epoll).&lt;/li&gt;
&lt;li&gt;Асинхронное программирование или многопоточность.&lt;/li&gt;
&lt;li&gt;Тестирование производительности сервера с помощью профилировочных инструментов (например, &lt;code&gt;perf&lt;/code&gt; или &lt;code&gt;eBPF&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Примерные шаги&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Разработать сервер, который обрабатывает несколько клиентских соединений параллельно.&lt;/li&gt;
&lt;li&gt;Оптимизировать сервер с использованием асинхронных вызовов или многопоточности.&lt;/li&gt;
&lt;li&gt;Протестировать производительность сервера при высокой нагрузке с использованием профилировочных инструментов.&lt;/li&gt;
&lt;li&gt;Интегрировать сервер с CI/CD для автоматического тестирования и развертывания.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="83-ожидаемые-результаты-проектной-работы"&gt;&lt;strong&gt;8.3 Ожидаемые результаты проектной работы&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;После завершения проектной работы студенты должны предоставить следующие результаты:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Исходный код проекта&lt;/strong&gt;: Программа, реализованная в соответствии с выбранной темой.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Документация&lt;/strong&gt;: Подробное описание архитектуры программы, используемых технологий и инструментов. Документация также должна включать описание процесса установки, настройки и тестирования программы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Тестовые данные и результаты&lt;/strong&gt;: Результаты тестирования программы, включая профилирование производительности и анализ ошибок.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Автоматизация сборки и развертывания&lt;/strong&gt;: Скрипты для автоматической сборки, тестирования и развертывания программы с использованием инструментов CI/CD (например, Jenkins, Docker, Ansible).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="84-критерии-оценки"&gt;&lt;strong&gt;8.4 Критерии оценки&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Проектная работа будет оцениваться по следующим критериям:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Корректность реализации&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Программа должна корректно выполнять заявленные функции и соответствовать требованиям, указанным в описании темы.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Использование системного программирования&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Проект должен демонстрировать использование системных вызовов, управления процессами, многопоточности, работы с памятью и других аспектов системного программирования.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Безопасность&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Программа должна быть защищена от распространенных уязвимостей (например, переполнения буфера, гонки данных). Оценка будет основываться на использовании безопасных методов программирования и встроенных механизмов защиты ОС.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Оптимизация и производительность&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Проект должен быть оптимизирован для работы с ограниченными ресурсами системы и поддерживать параллельную обработку задач (если это применимо).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Автоматизация&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Проект должен включать средства для автоматизации сборки, тестирования и развертывания программного обеспечения (например, CI/CD пайплайны).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Документация&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Проект должен быть хорошо документирован, включая описание архитектуры, шагов установки и тестирования.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="практическое-задание"&gt;&lt;strong&gt;Практическое задание&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Задание 1&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Выберите тему проектной работы из предложенных вариантов или предложите собственную тему. Описать проект и его ключевые цели.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 2&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Реализуйте проект с использованием современных системных вызовов, механизмов параллелизма, безопасности и контейнеризации. Примените автоматизацию для развертывания и тестирования программы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 3&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Подготовьте документацию для проекта, включающую архитектурное описание, инструкцию по сборке, тестированию и развертыванию.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="заключение-к-главе-8"&gt;&lt;strong&gt;Заключение к главе 8&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Проектная работа — это ключевой этап обучения, позволяющий студентам применить на практике все знания, полученные в курсе системного программирования. Успешное выполнение проекта требует не только технических навыков, но и умения работать с современными инструментами автоматизации, безопасности и тестирования. Этот опыт поможет студентам подготовиться к решению реальных задач в сфере системного программирования.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="общее-заключение-учебного-пособия"&gt;&lt;strong&gt;Общее заключение учебного пособия&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;На этом мы завершили учебное пособие по системному программированию, которое охватывает широкий спектр тем — от основ работы с операционными системами и системными вызовами до современных технологий параллелизма, виртуализации, безопасности и автоматизации. Пособие направлено на развитие знаний и навыков в системном программировании, которые помогут студентам успешно решать сложные задачи в сфере ИТ.&lt;/p&gt;
&lt;p&gt;Спасибо за внимание! Удачи в проектной работе и дальнейших достижениях в системном программировании!&lt;/p&gt;
&lt;hr&gt;</description></item><item><title>Часть VII. Автоматизация и CI/CD в системном программировании</title><link>https://ctf.msk.ru/p/avtomatizatsiya-i-ci-cd-v-sistemnom-programmirovanii/</link><pubDate>Fri, 18 Oct 2024 21:00:00 +0300</pubDate><guid>https://ctf.msk.ru/p/avtomatizatsiya-i-ci-cd-v-sistemnom-programmirovanii/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/7-devops.webp" alt="Featured image of post Часть VII. Автоматизация и CI/CD в системном программировании" /&gt;&lt;h2 id="часть-vii-автоматизация-и-cicd-в-системном-программировании"&gt;&lt;strong&gt;Часть VII. Автоматизация и CI/CD в системном программировании&lt;/strong&gt;
&lt;/h2&gt;&lt;hr&gt;
&lt;h3 id="71-автоматизация-в-системном-программировании"&gt;&lt;strong&gt;7.1 Автоматизация в системном программировании&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="711-введение-в-автоматизацию"&gt;&lt;strong&gt;7.1.1 Введение в автоматизацию&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Автоматизация — это процесс создания систем, которые выполняют задачи без вмешательства человека. В системном программировании автоматизация применяется для настройки окружений, управления конфигурацией, развертывания и обновления программного обеспечения. Это позволяет упростить выполнение рутинных задач, улучшить согласованность и минимизировать количество ошибок.&lt;/p&gt;
&lt;p&gt;Основные области, где используется автоматизация в системном программировании:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Автоматическое развертывание и настройка системного ПО (например, установка и настройка веб-сервера).&lt;/li&gt;
&lt;li&gt;Управление конфигурацией серверов и сервисов (например, обновление конфигурационных файлов).&lt;/li&gt;
&lt;li&gt;Автоматизация тестирования и сборки программного обеспечения.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="72-инструменты-автоматизации-ansible-chef-puppet"&gt;&lt;strong&gt;7.2 Инструменты автоматизации: Ansible, Chef, Puppet&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="721-ansible-инструмент-для-автоматизации-задач"&gt;&lt;strong&gt;7.2.1 Ansible: инструмент для автоматизации задач&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Ansible&lt;/strong&gt; — это популярный инструмент для автоматизации системного администрирования, развертывания приложений и управления конфигурацией. Он позволяет создавать сценарии автоматизации (playbooks) на языке YAML, которые определяют, какие действия нужно выполнить на сервере.&lt;/p&gt;
&lt;p&gt;Основные возможности Ansible:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Безагентная архитектура: Ansible использует SSH для подключения к целевым серверам, что упрощает его настройку.&lt;/li&gt;
&lt;li&gt;Описание инфраструктуры в виде кода (Infrastructure as Code).&lt;/li&gt;
&lt;li&gt;Поддержка как идемпотентных операций (повторное выполнение одного и того же сценария не изменяет систему), так и условных действий.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример простого playbook в Ansible для установки веб-сервера Apache&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;webservers&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;become&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;yes&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Убедиться, что Apache установлен&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;apt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apache2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;present&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Запустить и включить Apache&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;apache2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;started&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Описание работы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Этот playbook запускается на хостах из группы &lt;code&gt;webservers&lt;/code&gt; и выполняет действия с привилегиями суперпользователя (&lt;code&gt;become: yes&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Он устанавливает пакет Apache и гарантирует, что служба Apache запущена и включена.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Команда для выполнения сценария&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ansible-playbook -i inventory playbook.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="722-chef-и-puppet-альтернативные-инструменты"&gt;&lt;strong&gt;7.2.2 Chef и Puppet: альтернативные инструменты&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Chef&lt;/strong&gt; и &lt;strong&gt;Puppet&lt;/strong&gt; — это другие популярные инструменты для автоматизации конфигурации. Они имеют похожие цели, но отличаются архитектурой и способом управления:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chef&lt;/strong&gt; использует язык Ruby для написания &amp;ldquo;рецептов&amp;rdquo;, которые управляют конфигурацией серверов. Chef требует наличия агентов на серверах.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Puppet&lt;/strong&gt; также использует агентно-серверную архитектуру и применяет декларативный подход, где администратор описывает желаемое состояние системы, а Puppet приводит ее в это состояние.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример рецепта для Chef, который устанавливает и запускает веб-сервер Nginx:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;nginx&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;service&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;nginx&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:enable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:start&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Puppet&lt;/strong&gt; использует язык, похожий на DSL, для определения конфигураций:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-puppet" data-lang="puppet"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;nginx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;ensure&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;installed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;service&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;&amp;#39;nginx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;ensure&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;running&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="73-автоматизация-сборки-и-развертывания-cicd"&gt;&lt;strong&gt;7.3 Автоматизация сборки и развертывания (CI/CD)&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="731-введение-в-cicd"&gt;&lt;strong&gt;7.3.1 Введение в CI/CD&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;CI/CD&lt;/strong&gt; (Continuous Integration / Continuous Delivery) — это практика непрерывной интеграции и непрерывного развертывания программного обеспечения. Она помогает автоматизировать процесс сборки, тестирования и развертывания кода, что значительно ускоряет разработку и улучшает качество программного обеспечения.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Continuous Integration (CI)&lt;/strong&gt;: Разработчики часто интегрируют изменения в коде в общую ветку, и каждый такой интеграционный шаг автоматически тестируется и собирается.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Continuous Delivery (CD)&lt;/strong&gt;: Автоматизация процесса развертывания программного обеспечения на серверах, что позволяет быстро и надежно выпускать новые версии.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Основные шаги CI/CD:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Автоматическая сборка кода при каждом изменении в системе контроля версий (например, Git).&lt;/li&gt;
&lt;li&gt;Автоматическое тестирование сборки с использованием различных тестов (юнит-тесты, интеграционные тесты).&lt;/li&gt;
&lt;li&gt;Автоматическое развертывание и настройка новой версии программного обеспечения.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id="732-использование-jenkins-для-cicd"&gt;&lt;strong&gt;7.3.2 Использование Jenkins для CI/CD&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Jenkins&lt;/strong&gt; — это один из самых популярных инструментов для автоматизации CI/CD процессов. Он предоставляет веб-интерфейс для создания и управления пайплайнами, которые определяют шаги сборки, тестирования и развертывания программного обеспечения.&lt;/p&gt;
&lt;p&gt;Основные возможности Jenkins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Интеграция с системами контроля версий (Git, SVN).&lt;/li&gt;
&lt;li&gt;Поддержка множества плагинов для различных инструментов сборки, тестирования и развертывания (например, Maven, Docker, Ansible).&lt;/li&gt;
&lt;li&gt;Возможность параллельного выполнения задач и распределения нагрузки на несколько агентов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример простого пайплайна в Jenkins&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Сборка&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;make build&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Тестирование&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;make test&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Развертывание&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ansible-playbook -i inventory deploy.yml&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Описание пайплайна&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Пайплайн состоит из трех стадий: сборка, тестирование и развертывание.&lt;/li&gt;
&lt;li&gt;Во время сборки выполняется команда &lt;code&gt;make build&lt;/code&gt;, которая собирает проект.&lt;/li&gt;
&lt;li&gt;Во время тестирования выполняется команда &lt;code&gt;make test&lt;/code&gt;, которая запускает тесты.&lt;/li&gt;
&lt;li&gt;В стадии развертывания Ansible используется для развертывания собранного ПО на серверах.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="74-docker-и-контейнеризация-в-cicd"&gt;&lt;strong&gt;7.4 Docker и контейнеризация в CI/CD&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="741-контейнеризация-с-docker"&gt;&lt;strong&gt;7.4.1 Контейнеризация с Docker&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; — это инструмент для создания и управления контейнерами, которые изолируют приложения и их зависимости от остальной системы. В контексте CI/CD контейнеризация позволяет создавать переносимые среды для разработки, тестирования и развертывания программного обеспечения.&lt;/p&gt;
&lt;p&gt;Преимущества Docker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Легкость в создании и развертывании приложений с их зависимостями.&lt;/li&gt;
&lt;li&gt;Изоляция процессов и данных.&lt;/li&gt;
&lt;li&gt;Переносимость контейнеров между различными окружениями (локальная разработка, тестирование, продакшн).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример создания Docker-контейнера для веб-приложения&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;python:3.8-slim&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; requirements.txt requirements.txt&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; pip install -r requirements.txt&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;COPY&lt;/span&gt; . .&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CMD&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;app.py&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt;Сборка и запуск контейнера&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build -t myapp .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -p 5000:5000 myapp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h4 id="742-интеграция-docker-в-jenkins"&gt;&lt;strong&gt;7.4.2 Интеграция Docker в Jenkins&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;В Jenkins можно использовать Docker для создания контейнеров в процессе CI/CD. Это позволяет изолировать сборку и тестирование в контейнерах, гарантируя одинаковое окружение для всех шагов пайплайна.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример пайплайна в Jenkins с использованием Docker&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;docker&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;python:3.8-slim&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Сборка&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;pip install -r requirements.txt&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;python setup.py build&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Тестирование&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;python -m unittest discover tests&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Описание пайплайна&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Используется Docker-образ &lt;code&gt;python:3.8-slim&lt;/code&gt; для изолированной среды выполнения.&lt;/li&gt;
&lt;li&gt;На стадии сборки устанавливаются зависимости и выполняется сборка проекта.&lt;/li&gt;
&lt;li&gt;На стадии тестирования запускаются юнит-тесты.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="75-инфраструктура-как-код-iac"&gt;&lt;strong&gt;7.5 Инфраструктура как код (IaC)&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="751-понятие"&gt;&lt;strong&gt;7.5.1 Понятие &amp;ldquo;Инфраструктура как код&amp;rdquo;&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Инфраструктура как код&lt;/strong&gt; (Infrastructure as Code, IaC) — это метод управления и предоставления вычислительных ресурсов через машинные файлы конфигурации, а не через ручные процедуры. С помощью IaC разработчики и администраторы могут описывать инфраструктуру в виде кода и автоматически управлять серверами, сетями и приложениями.&lt;/p&gt;
&lt;p&gt;Преимущества IaC:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Возможность быстрого создания и&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;восстановления инфраструктуры.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Минимизация ошибок при развертывании.&lt;/li&gt;
&lt;li&gt;Поддержка версионного контроля для конфигураций.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример использования Terraform для создания инфраструктуры:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Пример файла конфигурации Terraform для создания виртуальной машины в AWS&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;provider&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;aws&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;us-west-2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;aws_instance&amp;#34; &amp;#34;my_instance&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; ami&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ami-0c55b159cbfafe1f0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; instance_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;t2.micro&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt; Name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyInstance&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Команды для работы с Terraform&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Инициализация Terraform:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;terraform init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Применение конфигурации для создания виртуальной машины:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;terraform apply
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="практическое-задание"&gt;&lt;strong&gt;Практическое задание&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Задание 1&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Напишите playbook для Ansible, который автоматически устанавливает и настраивает веб-сервер на удаленном сервере. Убедитесь, что сервер запускается после установки.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 2&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Настройте Jenkins для автоматизации процесса сборки и развертывания простого приложения. Используйте пайплайн для выполнения шагов сборки, тестирования и развертывания.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 3&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Используйте Docker для создания контейнера с веб-приложением. Интегрируйте контейнер в процесс CI/CD с помощью Jenkins.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="заключение-к-главе-7"&gt;&lt;strong&gt;Заключение к главе 7&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В этой главе мы рассмотрели основные аспекты автоматизации в системном программировании, включая использование Ansible, CI/CD с Jenkins и контейнеризацию с Docker. Мы также обсудили концепцию инфраструктуры как кода и ее реализацию с помощью Terraform. Эти технологии играют важную роль в современном программировании, помогая автоматизировать задачи и управлять сложными системами более эффективно.&lt;/p&gt;</description></item><item><title>Часть VI. Безопасность системного программирования</title><link>https://ctf.msk.ru/p/bezopasnost-sistemnogo-programmirovaniya/</link><pubDate>Fri, 18 Oct 2024 19:00:00 +0300</pubDate><guid>https://ctf.msk.ru/p/bezopasnost-sistemnogo-programmirovaniya/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/6-security.webp" alt="Featured image of post Часть VI. Безопасность системного программирования" /&gt;&lt;h2 id="часть-vi-безопасность-системного-программирования"&gt;&lt;strong&gt;Часть VI. Безопасность системного программирования&lt;/strong&gt;
&lt;/h2&gt;&lt;hr&gt;
&lt;h3 id="61-управление-памятью-и-безопасность"&gt;&lt;strong&gt;6.1 Управление памятью и безопасность&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="611-уязвимости-связанные-с-памятью"&gt;&lt;strong&gt;6.1.1 Уязвимости, связанные с памятью&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Одной из самых распространенных категорий уязвимостей в системном программировании являются проблемы, связанные с управлением памятью. Если программы неправильно управляют памятью, это может привести к утечкам памяти, перезаписи критических данных и даже к выполнению вредоносного кода. Основные виды уязвимостей, связанных с памятью:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Переполнение буфера&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Происходит, когда программа записывает больше данных, чем выделено в буфере. Это может привести к перезаписи памяти, что может быть использовано для захвата управления программой злоумышленником.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример переполнения буфера&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;vulnerable_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;strcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Нет проверки длины строки
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;large_input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Очень длинная строка...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;vulnerable_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;large_input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Риск&lt;/strong&gt;: Если злоумышленник передаст строку, превышающую 10 символов, это может перезаписать критическую память и вызвать сбой программы или выполнение вредоносного кода.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Использование неинициализированной памяти&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Программа может использовать область памяти, которая не была инициализирована, что может привести к неопределенному поведению или утечке данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Использование неинициализированного указателя
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Двойное освобождение памяти (double free)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Когда программа пытается освободить одну и ту же область памяти более одного раза, это может привести к повреждению данных и сбоям.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ptr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Повторное освобождение памяти
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Утечки памяти&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Происходят, когда программа не освобождает память после ее использования, что может привести к исчерпанию доступной памяти и сбоям.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="612-защита-от-уязвимостей-в-управлении-памятью"&gt;&lt;strong&gt;6.1.2 Защита от уязвимостей в управлении памятью&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Существуют различные механизмы и методы, которые помогают предотвратить уязвимости, связанные с управлением памятью:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Механизмы защиты памяти на уровне ОС&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Address Space Layout Randomization (ASLR)&lt;/strong&gt;: Этот механизм случайно распределяет ключевые области памяти (например, стеки, кучи, сегменты кода), что затрудняет предсказание расположения данных в памяти и предотвращает атаки на основе переполнения буфера.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Execution Prevention (DEP)&lt;/strong&gt;: Запрещает выполнение кода в сегментах памяти, предназначенных только для данных (например, в куче или стеке).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Инструменты для выявления проблем с памятью&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Valgrind&lt;/strong&gt;: Анализатор памяти, который помогает выявлять утечки памяти, использование неинициализированной памяти и другие проблемы с памятью.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AddressSanitizer&lt;/strong&gt;: Инструмент для обнаружения ошибок в управлении памятью, включая переполнение буфера и использование освобожденной памяти.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Использование безопасных функций&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вместо небезопасных функций, таких как &lt;code&gt;strcpy()&lt;/code&gt; и &lt;code&gt;sprintf()&lt;/code&gt;, лучше использовать их безопасные аналоги, такие как &lt;code&gt;strncpy()&lt;/code&gt; и &lt;code&gt;snprintf()&lt;/code&gt;, которые принимают дополнительные параметры для ограничения объема копируемых данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Пример программы с исправлением переполнения буфера:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;safe_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;strncpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Гарантируем завершение строки нулевым символом
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;large_input&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Очень длинная строка...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;safe_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;large_input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="62-управление-доступом-и-безопасность-процессов"&gt;&lt;strong&gt;6.2 Управление доступом и безопасность процессов&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="621-управление-правами-доступа"&gt;&lt;strong&gt;6.2.1 Управление правами доступа&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Управление правами доступа является важным аспектом безопасности системного программирования. Операционные системы предоставляют различные механизмы для управления доступом процессов и пользователей к ресурсам системы.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Discretionary Access Control (DAC)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Это традиционный механизм управления доступом, который используется в UNIX и Linux. В DAC каждый файл и ресурс имеют права доступа для владельца, группы и остальных пользователей. Права доступа включают чтение, запись и выполнение.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls -l my_file.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; user group &lt;span class="m"&gt;1024&lt;/span&gt; Oct &lt;span class="m"&gt;18&lt;/span&gt; 12:00 my_file.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;В этом примере файл &lt;code&gt;my_file.txt&lt;/code&gt; имеет следующие права доступа:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Владелец файла (user) может читать и записывать файл.&lt;/li&gt;
&lt;li&gt;Пользователи группы могут только читать файл.&lt;/li&gt;
&lt;li&gt;Остальные пользователи могут только читать файл.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mandatory Access Control (MAC)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В MAC доступ к ресурсам контролируется системой на основе заданных политик. Примером MAC является &lt;strong&gt;SELinux&lt;/strong&gt; или &lt;strong&gt;AppArmor&lt;/strong&gt;, которые используются для более строгого контроля доступа к ресурсам и процессам.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Control Groups (cgroups)&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cgroups — это механизм в Linux, который позволяет ограничивать и изолировать ресурсы (такие как процессор, память, диск) для групп процессов. Это особенно полезно при работе с контейнерами, где необходимо ограничить использование ресурсов для каждого контейнера.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Пример использования cgroups для ограничения ресурсов:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cgcreate -g memory:/my_group
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cgset -r memory.limit_in_bytes&lt;span class="o"&gt;=&lt;/span&gt;500M /my_group
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cgexec -g memory:/my_group ./my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="622-работа-с-правами-суперпользователя-root"&gt;&lt;strong&gt;6.2.2 Работа с правами суперпользователя (root)&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Использование прав суперпользователя (root) должно быть ограничено для предотвращения несанкционированного доступа к критическим системным ресурсам. В системном программировании существует несколько подходов для минимизации использования прав суперпользователя:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Принцип наименьших привилегий&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Программы и пользователи должны получать минимальные права, необходимые для выполнения их задач. Это уменьшает потенциальные риски безопасности.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Setuid-программы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В UNIX-системах программы могут быть выполнены с привилегиями владельца файла, используя бит setuid. Это полезно для программ, которые должны временно получать права суперпользователя.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Пример установки setuid на программу:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod u+s my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="63-основные-уязвимости-и-их-предотвращение"&gt;&lt;strong&gt;6.3 Основные уязвимости и их предотвращение&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="631-атаки-типа"&gt;&lt;strong&gt;6.3.1 Атаки типа &amp;ldquo;переполнение буфера&amp;rdquo;&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Атаки типа &amp;ldquo;переполнение буфера&amp;rdquo; — это одна из наиболее распространенных уязвимостей в системном программировании. Злоумышленники могут использовать эту уязвимость для перезаписи памяти программы, что позволяет выполнить произвольный код с привилегиями программы.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Предотвращение переполнения буфера&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Используйте безопасные функции работы с буферами, такие как &lt;code&gt;strncpy()&lt;/code&gt;, &lt;code&gt;snprintf()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Применяйте защитные механизмы, такие как ASLR и DEP, которые затрудняют предсказание расположения буферов в памяти и выполнение вредоносного кода.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="632-гонки-данных"&gt;&lt;strong&gt;6.3.2 Гонки данных&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Гонки данных&lt;/strong&gt; происходят, когда несколько потоков или процессов одновременно обращаются к общим данным без надлежащей синхронизации. Это может привести к некорректному поведению программы и уязвимостям безопасности.&lt;/p&gt;
&lt;p&gt;Пример гонки данных:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Итоговое значение: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;В этой программе два потока одновременно увеличивают переменную &lt;code&gt;counter&lt;/code&gt;, что приводит к некорректному результату из-за гонки данных.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Предотвращение гонок данных&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Используйте механизмы синхронизации, такие как мьютексы или семафоры, для контроля доступа&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;к общим данным.&lt;/p&gt;
&lt;p&gt;Пример с мьютексом:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;pthread_mutex_t&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PTHREAD_MUTEX_INITIALIZER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1000000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_mutex_lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Итоговое значение: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="практическое-задание"&gt;&lt;strong&gt;Практическое задание&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Задание 1&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Напишите программу на C с использованием функций динамического выделения памяти (&lt;code&gt;malloc()&lt;/code&gt; и &lt;code&gt;free()&lt;/code&gt;). Специально создайте утечку памяти и используйте Valgrind для ее обнаружения и исправления.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 2&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Создайте программу, которая имитирует гонку данных между двумя потоками. Исправьте программу с использованием мьютексов для предотвращения гонки данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 3&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Настройте SELinux или AppArmor на Linux для защиты системного приложения, ограничив его права доступа к файловой системе и сетевым ресурсам.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="заключение-к-главе-6"&gt;&lt;strong&gt;Заключение к главе 6&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В этой главе мы изучили ключевые аспекты безопасности в системном программировании, включая управление памятью, контроль доступа и предотвращение распространенных уязвимостей, таких как переполнение буфера и гонки данных. В следующих разделах мы рассмотрим дополнительные современные темы, такие как автоматизация и DevOps-инструменты для системного программирования.&lt;/p&gt;</description></item><item><title>Часть V. Инструменты мониторинга и отладки системного программного обеспечения</title><link>https://ctf.msk.ru/p/instrumenty-monitoringa-i-otladki-sistemnogo-po/</link><pubDate>Fri, 18 Oct 2024 18:40:00 +0300</pubDate><guid>https://ctf.msk.ru/p/instrumenty-monitoringa-i-otladki-sistemnogo-po/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/5-mon-debug.webp" alt="Featured image of post Часть V. Инструменты мониторинга и отладки системного программного обеспечения" /&gt;&lt;h2 id="часть-v-инструменты-мониторинга-и-отладки-системного-программного-обеспечения"&gt;&lt;strong&gt;Часть V. Инструменты мониторинга и отладки системного программного обеспечения&lt;/strong&gt;
&lt;/h2&gt;&lt;hr&gt;
&lt;h3 id="51-введение-в-мониторинг-и-отладку-системного-по"&gt;&lt;strong&gt;5.1 Введение в мониторинг и отладку системного ПО&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="511-зачем-нужны-мониторинг-и-отладка"&gt;&lt;strong&gt;5.1.1 Зачем нужны мониторинг и отладка?&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Мониторинг и отладка — это ключевые процессы, которые помогают разработчикам системного программного обеспечения выявлять и устранять проблемы в работе программ, а также оптимизировать их производительность. Эти процессы особенно важны в системном программировании, поскольку системное ПО взаимодействует с аппаратурой и ядром операционной системы, где ошибки могут привести к серьезным сбоям.&lt;/p&gt;
&lt;p&gt;Основные задачи мониторинга и отладки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Выявление проблем с производительностью (например, чрезмерное использование процессора или памяти).&lt;/li&gt;
&lt;li&gt;Обнаружение утечек памяти, гонок данных и других ошибок многозадачности.&lt;/li&gt;
&lt;li&gt;Оптимизация системных вызовов и взаимодействия с ресурсами ОС.&lt;/li&gt;
&lt;li&gt;Отслеживание выполнения программы на уровне системных вызовов.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="512-общие-принципы-мониторинга-и-отладки"&gt;&lt;strong&gt;5.1.2 Общие принципы мониторинга и отладки&lt;/strong&gt;
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Мониторинг&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Позволяет отслеживать использование ресурсов (CPU, память, ввод-вывод, сеть) в реальном времени или через логи.&lt;/li&gt;
&lt;li&gt;Используется для профилактического контроля за системным ПО, чтобы минимизировать риски отказов системы.&lt;/li&gt;
&lt;li&gt;Важные инструменты для мониторинга: &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;htop&lt;/code&gt;, &lt;code&gt;iotop&lt;/code&gt;, &lt;code&gt;vmstat&lt;/code&gt;, &lt;code&gt;sar&lt;/code&gt;, а также специальные системы мониторинга (например, Prometheus, Grafana).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Отладка&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Позволяет пошагово анализировать выполнение программы, выявлять ошибки, которые могут привести к сбоям или неправильной работе.&lt;/li&gt;
&lt;li&gt;Основные инструменты: отладчики (например, &lt;code&gt;gdb&lt;/code&gt;), трассировщики системных вызовов (например, &lt;code&gt;strace&lt;/code&gt;), профилировщики (например, &lt;code&gt;perf&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="52-инструменты-мониторинга-системного-по"&gt;&lt;strong&gt;5.2 Инструменты мониторинга системного ПО&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="521-традиционные-инструменты-мониторинга"&gt;&lt;strong&gt;5.2.1 Традиционные инструменты мониторинга: &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;iotop&lt;/code&gt;, &lt;code&gt;htop&lt;/code&gt;, &lt;code&gt;vmstat&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Эти инструменты предоставляют в реальном времени информацию об использовании ресурсов системой:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;top&lt;/code&gt;&lt;/strong&gt;: Показывает активные процессы, их использование процессора и памяти. Используется для анализа загрузки системы.&lt;/p&gt;
&lt;p&gt;Пример использования:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;top
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;htop&lt;/code&gt;&lt;/strong&gt;: Более удобная версия &lt;code&gt;top&lt;/code&gt;, предоставляющая интерактивный интерфейс с дополнительной информацией о процессах и системных ресурсах.&lt;/p&gt;
&lt;p&gt;Пример использования:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;htop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;iotop&lt;/code&gt;&lt;/strong&gt;: Показывает использование ввода-вывода (I/O) процессами, что полезно для выявления узких мест в производительности ввода-вывода.&lt;/p&gt;
&lt;p&gt;Пример использования:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo iotop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;vmstat&lt;/code&gt;&lt;/strong&gt;: Показывает статистику виртуальной памяти, процессорных нагрузок, ввода-вывода и других системных параметров. Полезен для детального анализа работы памяти и ввода-вывода.&lt;/p&gt;
&lt;p&gt;Пример использования:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vmstat &lt;span class="m"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="522-инструменты-мониторинга-в-реальном-времени-prometheus-и-grafana"&gt;&lt;strong&gt;5.2.2 Инструменты мониторинга в реальном времени: Prometheus и Grafana&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Prometheus&lt;/strong&gt; — это мощная система мониторинга и алертинга, которая собирает метрики с разных узлов и служб, а затем отображает их в виде графиков или таблиц.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grafana&lt;/strong&gt; — это система визуализации данных, которая интегрируется с Prometheus и позволяет создавать красивые и интерактивные дашборды для анализа метрик.&lt;/p&gt;
&lt;p&gt;Пример установки и использования Prometheus и Grafana:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Установите Prometheus:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install prometheus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Настройте &lt;code&gt;prometheus.yml&lt;/code&gt; для сбора метрик:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;scrape_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;job_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;system&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;static_configs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;localhost:9090&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Установите Grafana:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install grafana
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Настройте Grafana для подключения к Prometheus и создайте дашборды для анализа системных метрик (CPU, память, сеть).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="53-инструменты-отладки-системного-по"&gt;&lt;strong&gt;5.3 Инструменты отладки системного ПО&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="531-отладчик-gdb"&gt;&lt;strong&gt;5.3.1 Отладчик gdb&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;gdb&lt;/code&gt;&lt;/strong&gt; — это мощный отладчик для программ на языке C/C++, который позволяет пошагово выполнять программу, анализировать значения переменных, следить за стеком вызовов и изменять код во время выполнения.&lt;/p&gt;
&lt;p&gt;Основные команды &lt;code&gt;gdb&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Запуск программы&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gdb ./my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Запускает программу в отладчике.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Установка точки останова&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;break main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Устанавливает точку останова на функции &lt;code&gt;main()&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Запуск программы до точки останова&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Пошаговое выполнение&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;step
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Просмотр переменных&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;var_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример программы для отладки:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;factorial&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Факториал %d = %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Процесс отладки&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Скомпилируйте программу с отладочной информацией:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcc -g -o factorial factorial.c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Запустите &lt;code&gt;gdb&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gdb ./factorial
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Установите точку останова на функции &lt;code&gt;factorial&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;break factorial
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Выполните программу до точки останова:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Пошагово выполните функцию и проанализируйте значения переменных:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;step
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="532-трассировка-системных-вызовов-с"&gt;&lt;strong&gt;5.3.2 Трассировка системных вызовов с &lt;code&gt;strace&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;strace&lt;/code&gt;&lt;/strong&gt; — это инструмент для трассировки системных вызовов, который позволяет увидеть, какие системные вызовы выполняет программа и какие ресурсы использует.&lt;/p&gt;
&lt;p&gt;Пример использования &lt;code&gt;strace&lt;/code&gt; для отслеживания системных вызовов программы:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;strace ./my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Основные параметры &lt;code&gt;strace&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Только системные вызовы для работы с файлами&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;strace -e &lt;span class="nv"&gt;trace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;open,read,write ./my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Сохранение вывода в файл&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;strace -o trace_output.txt ./my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример работы с &lt;code&gt;strace&lt;/code&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Создайте программу, которая открывает файл и записывает в него данные:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;FILE&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;test.txt&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Ошибка открытия файла&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Привет, мир!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;fclose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Запустите программу через &lt;code&gt;strace&lt;/code&gt;, чтобы увидеть системные вызовы, связанные с файлами:
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;strace -e &lt;span class="nv"&gt;trace&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;open,write,close ./my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="54-профилирование-системного-по"&gt;&lt;strong&gt;5.4 Профилирование системного ПО&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="541-профилирование-с-использованием"&gt;&lt;strong&gt;5.4.1 Профилирование с использованием &lt;code&gt;perf&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;perf&lt;/code&gt;&lt;/strong&gt; — это инструмент для профилирования программ в Linux, который позволяет анализировать производительность программы на уровне системных вызовов, инструкций процессора, времени выполнения и использования ресурсов.&lt;/p&gt;
&lt;p&gt;Основные команды &lt;code&gt;perf&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Запуск программы с профилированием&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;perf record ./my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Анализ профиля&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;perf report
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример профилирования программы&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Запустите программу с использованием &lt;code&gt;perf&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;perf record ./my_program
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;После завершения программы используйте команду &lt;code&gt;perf report&lt;/code&gt;, чтобы проанализировать, какие части программы занимают наибольшее время выполнения:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;perf report
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="542-профилирование-и-мониторинг-с-использованием-ebpf"&gt;&lt;strong&gt;5.4.2 Профилирование и мониторинг с использованием eBPF&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;eBPF&lt;/strong&gt; (extended Berkeley Packet Filter) — это технология, которая позволяет анализировать поведение ядра Linux без необходимости измен&lt;/p&gt;
&lt;p&gt;ять его код. eBPF используется для создания программ, которые выполняются в пространстве ядра и могут мониторить системные вызовы, работу процессоров, сети и другие ресурсы.&lt;/p&gt;
&lt;p&gt;Пример программы для использования eBPF:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Установите инструменты для работы с eBPF (например, bcc):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install bpfcc-tools linux-headers-&lt;span class="k"&gt;$(&lt;/span&gt;uname -r&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Запустите программу для мониторинга системных вызовов:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo /usr/share/bcc/tools/syscount
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Это позволит увидеть, какие системные вызовы выполняются на уровне ядра.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="практическое-задание"&gt;&lt;strong&gt;Практическое задание&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Задание 1&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Напишите программу на C, которая вычисляет факториал числа. Используйте &lt;code&gt;gdb&lt;/code&gt; для отладки программы, установите точки останова на функции &lt;code&gt;factorial&lt;/code&gt; и проанализируйте значения переменных во время выполнения программы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 2&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Напишите программу на C, которая открывает файл и записывает в него данные. Используйте &lt;code&gt;strace&lt;/code&gt;, чтобы отслеживать системные вызовы, связанные с работой с файлами.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 3&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Профилируйте свою программу с использованием &lt;code&gt;perf&lt;/code&gt;, чтобы определить, какие части программы занимают наибольшее время выполнения. Оптимизируйте программу на основе профиля.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="заключение-к-главе-5"&gt;&lt;strong&gt;Заключение к главе 5&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В этой главе мы рассмотрели важные инструменты и методы мониторинга и отладки системного программного обеспечения. Мы изучили &lt;code&gt;gdb&lt;/code&gt; для отладки, &lt;code&gt;strace&lt;/code&gt; для трассировки системных вызовов, а также инструменты профилирования, такие как &lt;code&gt;perf&lt;/code&gt; и eBPF. Эти инструменты помогают разработчикам создавать более стабильные, безопасные и оптимизированные системы. В следующей части мы рассмотрим вопросы безопасности и защиты в системном программировании.&lt;/p&gt;</description></item><item><title>Часть IV. Параллелизм и виртуализация</title><link>https://ctf.msk.ru/p/parallelizm-i-virtualizatsiya/</link><pubDate>Fri, 18 Oct 2024 18:30:00 +0300</pubDate><guid>https://ctf.msk.ru/p/parallelizm-i-virtualizatsiya/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/4-parallelizm-i-virtualizatsiya.webp" alt="Featured image of post Часть IV. Параллелизм и виртуализация" /&gt;&lt;h2 id="часть-iv-параллелизм-и-виртуализация"&gt;&lt;strong&gt;Часть IV. Параллелизм и виртуализация&lt;/strong&gt;
&lt;/h2&gt;&lt;hr&gt;
&lt;h3 id="41-параллелизм-и-конкурентность"&gt;&lt;strong&gt;4.1 Параллелизм и конкурентность&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="411-понятие-параллелизма-и-конкурентности"&gt;&lt;strong&gt;4.1.1 Понятие параллелизма и конкурентности&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Параллелизм&lt;/strong&gt; — это одновременное выполнение нескольких вычислительных задач с целью повышения производительности системы. Параллельное программирование позволяет максимально использовать ресурсы многоядерных процессоров, распределяя вычислительные задачи между несколькими потоками или процессами.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Конкурентность&lt;/strong&gt; (Concurrency) — это способность системы эффективно управлять несколькими задачами, которые выполняются в одно и то же время, но не обязательно параллельно. Конкурентные программы могут переключаться между задачами, даже если они не выполняются одновременно на разных ядрах процессора.&lt;/p&gt;
&lt;p&gt;Параллелизм и конкурентность имеют важные отличия:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Параллелизм&lt;/strong&gt; означает одновременное выполнение нескольких задач (например, на разных ядрах процессора).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Конкурентность&lt;/strong&gt; подразумевает переключение между задачами, которые могут выполняться в одно и то же время, но не обязательно параллельно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="412-модели-параллелизма"&gt;&lt;strong&gt;4.1.2 Модели параллелизма&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Параллелизм в современных системах может быть реализован с использованием различных моделей:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Многопоточность (Multithreading)&lt;/strong&gt;: Разделение одной программы на несколько потоков, которые выполняются параллельно.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Многопроцессорная обработка (Multiprocessing)&lt;/strong&gt;: Выполнение нескольких процессов параллельно, с использованием нескольких процессоров или ядер.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Асинхронное программирование (Asynchronous Programming)&lt;/strong&gt;: Управление параллельными задачами с использованием неблокирующих вызовов и событий.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;При разработке веб-сервера параллелизм может использоваться для одновременной обработки множества запросов клиентов, повышая пропускную способность и уменьшая время отклика.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="413-примеры-параллелизма"&gt;&lt;strong&gt;4.1.3 Примеры параллелизма&lt;/strong&gt;
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Многопоточность в C (использование pthreads)&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;В этой программе создается несколько потоков, каждый из которых выполняет задачу параллельно. Программа иллюстрирует, как можно разделить вычислительные задачи между потоками для ускорения работы.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;thread_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Поток: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thread_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Асинхронное программирование в Go&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;В Go встроена поддержка параллелизма с использованием горутин (goroutines). Это делает Go мощным инструментом для конкурентного программирования.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;printMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Millisecond&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;printMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Привет из горутины 1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;printMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Привет из горутины 2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Second&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Ждем завершения горутин&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="414-синхронизация-параллельных-задач"&gt;&lt;strong&gt;4.1.4 Синхронизация параллельных задач&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;В параллельных программах нередко требуется синхронизировать выполнение нескольких задач, чтобы избежать гонок данных и других проблем. Для этого используются &lt;strong&gt;мьютексы&lt;/strong&gt;, &lt;strong&gt;семафоры&lt;/strong&gt; и &lt;strong&gt;условные переменные&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Мьютекс (Mutex)&lt;/strong&gt;: Используется для ограничения доступа к общим данным. Только один поток может &amp;ldquo;захватить&amp;rdquo; мьютекс, другие потоки будут ждать его освобождения.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Семафор&lt;/strong&gt;: Механизм, позволяющий ограничить количество потоков, которые могут одновременно получить доступ к ресурсу.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Условные переменные&lt;/strong&gt;: Позволяют потокам ожидать наступления определенного события и просыпаться только тогда, когда это событие произойдет.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример программы с мьютексами на C&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;pthread_mutex_t&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PTHREAD_MUTEX_INITIALIZER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_mutex_lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Итоговое значение счетчика: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="42-виртуализация"&gt;&lt;strong&gt;4.2 Виртуализация&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="421-введение-в-виртуализацию"&gt;&lt;strong&gt;4.2.1 Введение в виртуализацию&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Виртуализация&lt;/strong&gt; — это технология, которая позволяет запускать несколько виртуальных машин (VM) на одном физическом сервере, обеспечивая изоляцию и управление ресурсами. Она позволяет более эффективно использовать ресурсы компьютера, такие как процессор, память и устройства ввода-вывода.&lt;/p&gt;
&lt;p&gt;Основные типы виртуализации:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Полная виртуализация&lt;/strong&gt;: Гостевая операционная система работает как на отдельном компьютере, не зная, что она виртуализирована (например, KVM).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Паравиртуализация&lt;/strong&gt;: Гостевая операционная система осознает, что она виртуализирована, и напрямую взаимодействует с гипервизором для оптимизации работы (например, Xen).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Контейнеризация&lt;/strong&gt;: Более легковесная альтернатива виртуализации, при которой контейнеры изолируются друг от друга, но работают на одном ядре ОС (например, Docker).&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="422-гипервизоры-и-их-типы"&gt;&lt;strong&gt;4.2.2 Гипервизоры и их типы&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Гипервизор&lt;/strong&gt; — это программное обеспечение, которое управляет виртуальными машинами. Существует два типа гипервизоров:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Тип 1 (bare-metal)&lt;/strong&gt;: Работает напрямую на аппаратуре, предоставляя виртуальные машины (например, KVM, Xen).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Тип 2 (hosted)&lt;/strong&gt;: Работает поверх операционной системы (например, VirtualBox, VMware Workstation).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Гипервизоры управляют выделением ресурсов виртуальным машинам и обеспечивают их изоляцию друг от друга.&lt;/p&gt;
&lt;h4 id="423-пример-создания-виртуальной-машины-с-kvm"&gt;&lt;strong&gt;4.2.3 Пример создания виртуальной машины с KVM&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;KVM (Kernel-based Virtual Machine) — это гипервизор типа 1 для Linux, который позволяет создавать и управлять виртуальными машинами.&lt;/p&gt;
&lt;p&gt;Пример создания виртуальной машины с использованием KVM:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Установите необходимые пакеты:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Проверьте, поддерживает ли ваша система виртуализацию:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;egrep -c &lt;span class="s1"&gt;&amp;#39;(vmx|svm)&amp;#39;&lt;/span&gt; /proc/cpuinfo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Создайте виртуальную машину:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;virt-install &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --name&lt;span class="o"&gt;=&lt;/span&gt;TestVM &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --vcpus&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --memory&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2048&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cdrom&lt;span class="o"&gt;=&lt;/span&gt;/path/to/iso &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --disk &lt;span class="nv"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --os-variant&lt;span class="o"&gt;=&lt;/span&gt;ubuntu20.04
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="424-контейнеризация-docker-и-podman"&gt;&lt;strong&gt;4.2.4 Контейнеризация: Docker и Podman&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; — это платформа для контейнеризации, которая позволяет изолировать приложения в контейнерах. Контейнеры делят одно ядро операционной системы, что делает их легче, чем виртуальные машины.&lt;/p&gt;
&lt;p&gt;Основные команды Docker:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Создание и запуск контейнера&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -it ubuntu bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Просмотр запущенных контейнеров&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Остановка контейнера&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop &amp;lt;container_id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример использования Docker для создания и запуска контейнера с веб-сервером:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Запустите контейнер с Apache-сервером:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run -d -p 8080:80 httpd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Откройте браузер и перейдите по адресу &lt;code&gt;http://localhost:8080&lt;/code&gt;, чтобы увидеть страницу Apache-сервера.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="425-использование-cgroups-и-namespaces-в-linux"&gt;&lt;strong&gt;4.2.5 Использование cgroups и namespaces в Linux&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Контейнеры в Linux изолируются с помощью технологий &lt;strong&gt;cgroups&lt;/strong&gt; и &lt;strong&gt;namespaces&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Namespaces&lt;/strong&gt;: Изолируют такие ресурсы, как PID (процессы), файловая система, сеть.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cgroups&lt;/strong&gt;: Управляют распределением ресурсов между контейнерами (CPU, память).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Эти механизмы обеспечивают безопасность и контроль за использованием ресурсов в контейнерах.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="практическое-задание"&gt;&lt;strong&gt;Практическое задание&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Задание 1&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Напишите программу на языке C, которая создает несколько потоков для параллельного выполнения задач. Используйте мьютексы для синхронизации доступа к общим ресурсам.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 2&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Создайте и настройте виртуальную машину с помощью KVM или VirtualBox. Установите на нее Linux и настройте базовые сетевые службы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 3&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Создайте контейнер с использованием Docker, который запускает веб-сервер Apache. Настройте сетевые порты и протестируйте работу сервера.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="заключение-к-главе-4"&gt;&lt;strong&gt;Заключение к главе 4&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В этой главе мы рассмотрели основы параллелизма, конкурентности и виртуализации. Мы узнали, как использовать многопоточность для повышения производительности, а также изучили виртуализацию с использованием KVM и контейнеризацию с Docker. Эти технологии играют важную роль в современных вычислительных системах, позволяя эффективно управлять ресурсами и изолировать процессы. В следующем разделе мы углубимся в инструменты для мониторинга и отладки системного программного обеспечения.&lt;/p&gt;
&lt;hr&gt;</description></item><item><title>Часть III. Управление памятью и многопоточность</title><link>https://ctf.msk.ru/p/upravlenie-pamjatyu-i-mnogopotochnost/</link><pubDate>Fri, 18 Oct 2024 17:30:00 +0300</pubDate><guid>https://ctf.msk.ru/p/upravlenie-pamjatyu-i-mnogopotochnost/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/3-mem-threading.webp" alt="Featured image of post Часть III. Управление памятью и многопоточность" /&gt;&lt;h2 id="часть-iii-управление-памятью-и-многопоточность"&gt;&lt;strong&gt;Часть III. Управление памятью и многопоточность&lt;/strong&gt;
&lt;/h2&gt;&lt;hr&gt;
&lt;h3 id="31-управление-памятью-в-системном-программировании"&gt;&lt;strong&gt;3.1 Управление памятью в системном программировании&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="311-введение-в-управление-памятью"&gt;&lt;strong&gt;3.1.1 Введение в управление памятью&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;В системном программировании управление памятью — это процесс выделения, управления и освобождения памяти для программ. Память — это критический ресурс, которым управляет операционная система, предоставляя приложениям доступ к необходимым блокам памяти.&lt;/p&gt;
&lt;p&gt;Основные задачи управления памятью:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Выделение памяти&lt;/strong&gt;: Программы запрашивают блоки памяти для хранения данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Освобождение памяти&lt;/strong&gt;: Программы освобождают память, когда она больше не требуется, чтобы предотвратить утечки памяти.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Защита памяти&lt;/strong&gt;: Каждому процессу выделяется изолированная область памяти, чтобы предотвратить вмешательство других процессов.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="312-адресное-пространство-процесса"&gt;&lt;strong&gt;3.1.2 Адресное пространство процесса&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Каждый процесс в операционной системе имеет свое &lt;strong&gt;виртуальное адресное пространство&lt;/strong&gt;, которое изолировано от других процессов. Виртуальная память позволяет программе работать с большими объемами данных, не заботясь о том, где физически расположена память.&lt;/p&gt;
&lt;p&gt;Адресное пространство процесса включает в себя:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Текстовый сегмент&lt;/strong&gt;: Содержит код программы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Данные&lt;/strong&gt;: Статические и глобальные переменные.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Куча&lt;/strong&gt;: Динамическая память, которая выделяется во время выполнения программы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Стек&lt;/strong&gt;: Хранит локальные переменные и адреса возврата для функций.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="313-выделение-и-освобождение-динамической-памяти"&gt;&lt;strong&gt;3.1.3 Выделение и освобождение динамической памяти&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;В языках системного программирования, таких как C, программист отвечает за управление динамической памятью с использованием функций &lt;code&gt;malloc()&lt;/code&gt; и &lt;code&gt;free()&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;malloc()&lt;/code&gt;&lt;/strong&gt;: Функция, которая выделяет блок памяти указанного размера и возвращает указатель на начало этого блока. Если памяти недостаточно, функция возвращает &lt;code&gt;NULL&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Ошибка: недостаточно памяти
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;free()&lt;/code&gt;&lt;/strong&gt;: Функция, которая освобождает ранее выделенный блок памяти, делая его доступным для других частей программы.&lt;/p&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="314-утечки-памяти-и-их-предотвращение"&gt;&lt;strong&gt;3.1.4 Утечки памяти и их предотвращение&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Утечка памяти&lt;/strong&gt; происходит, когда программа выделяет память, но не освобождает ее после завершения работы. Это может привести к значительному снижению производительности или даже к завершению программы из-за недостатка памяти.&lt;/p&gt;
&lt;p&gt;Предотвращение утечек памяти:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Всегда освобождайте динамически выделенную память с помощью &lt;code&gt;free()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Используйте инструменты для поиска утечек памяти, такие как &lt;code&gt;Valgrind&lt;/code&gt; и &lt;code&gt;AddressSanitizer&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример программы с утечкой памяти&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;leak&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Память не будет освобождена
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Исправленная версия&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;free_memory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Память освобождается
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="315-пример-использования-динамической-памяти"&gt;&lt;strong&gt;3.1.5 Пример использования динамической памяти&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Пример программы на C, которая динамически выделяет память для массива чисел, заполняет его случайными числами, сортирует и выводит результат:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;time.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Ошибка выделения памяти&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;srand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;qsort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;compare&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Отсортированный массив:&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;%d &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;free&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Объяснение программы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Мы динамически выделяем память для массива из 10 целых чисел с помощью &lt;code&gt;malloc()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Затем заполняем массив случайными числами и сортируем его с помощью функции &lt;code&gt;qsort()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;После вывода отсортированного массива освобождаем память с помощью &lt;code&gt;free()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="32-многопоточность-в-системном-программировании"&gt;&lt;strong&gt;3.2 Многопоточность в системном программировании&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="321-основы-многопоточности"&gt;&lt;strong&gt;3.2.1 Основы многопоточности&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Поток (thread)&lt;/strong&gt; — это наименьшая единица выполнения программы. Многопоточность позволяет программам выполнять несколько задач параллельно, что особенно важно для повышения производительности на многоядерных процессорах.&lt;/p&gt;
&lt;p&gt;Операционная система предоставляет механизм управления потоками, который позволяет программам создавать, синхронизировать и завершать потоки. В системном программировании часто используются потоки для параллельного выполнения вычислительных задач, работы с вводом-выводом и взаимодействия с аппаратным обеспечением.&lt;/p&gt;
&lt;p&gt;Преимущества многопоточности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Повышение производительности за счет параллельного выполнения.&lt;/li&gt;
&lt;li&gt;Эффективное использование ресурсов многоядерных процессоров.&lt;/li&gt;
&lt;li&gt;Возможность асинхронной обработки задач.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="322-создание-и-управление-потоками-с-использованием-posix-threads-pthreads"&gt;&lt;strong&gt;3.2.2 Создание и управление потоками с использованием POSIX Threads (pthreads)&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;В системах на основе UNIX потоки создаются и управляются с использованием библиотеки POSIX Threads (pthreads). Эта библиотека предоставляет функции для создания, синхронизации и завершения потоков.&lt;/p&gt;
&lt;p&gt;Основные функции pthreads:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pthread_create()&lt;/code&gt;: Создание нового потока.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pthread_join()&lt;/code&gt;: Ожидание завершения потока.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pthread_mutex_lock()&lt;/code&gt; и &lt;code&gt;pthread_mutex_unlock()&lt;/code&gt;: Управление мьютексами для синхронизации потоков.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример программы с потоками на C&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;thread_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Поток: %ld&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;thread_function&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Объяснение программы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В этой программе создается 5 потоков, каждый из которых выполняет функцию &lt;code&gt;thread_function()&lt;/code&gt;, которая просто выводит сообщение с номером потока.&lt;/li&gt;
&lt;li&gt;Функция &lt;code&gt;pthread_create()&lt;/code&gt; создает новый поток, а &lt;code&gt;pthread_join()&lt;/code&gt; позволяет главному потоку ожидать завершения каждого созданного потока.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="323-синхронизация-потоков-с-использованием-мьютексов"&gt;&lt;strong&gt;3.2.3 Синхронизация потоков с использованием мьютексов&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Когда несколько потоков одновременно обращаются к одним и тем же данным, могут возникнуть гонки данных. Для предотвращения этого используются механизмы синхронизации, такие как &lt;strong&gt;мьютексы&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Мьютекс (mutual exclusion) — это объект синхронизации, который позволяет только одному потоку одновременно получать доступ к критической секции программы (например, к общим данным).&lt;/p&gt;
&lt;p&gt;Основные функции работы с мьютексами:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pthread_mutex_lock()&lt;/code&gt;: Блокирует мьютекс, предоставляя доступ к критической секции только одному потоку.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pthread_mutex_unlock()&lt;/code&gt;: Освобождает мьютекс, позволяя другим потокам войти в критическую секцию.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Пример программы с синхронизацией потоков&lt;/strong&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;pthread_mutex_t&lt;/span&gt; &lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PTHREAD_MUTEX_INITIALIZER&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_mutex_lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_mutex_unlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pthread_t&lt;/span&gt; &lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;pthread_join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;threads&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Итоговое значение счетчика: %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Объяснение программы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Пять потоков увеличивают общий счетчик одновременно. Чтобы избежать гонки данных, каждый поток блокирует доступ к переменной &lt;code&gt;counter&lt;/code&gt; с помощью мьютекса перед увеличением значения.&lt;/li&gt;
&lt;li&gt;После увеличения переменной поток освобождает мьютекс, позволяя другим потокам получить доступ к счетчику.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="практическое-задание"&gt;&lt;strong&gt;Практическое задание&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Задание 1&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Напишите программу на C, которая динамически выделяет память для большого массива, заполняет его случайными числами, сортирует и выводит результат. Обязательно освободите память после завершения программы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Задание 2&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Напишите программу, которая создает несколько потоков для параллельного увеличения общего счетчика. Используйте мьютексы для предотвращения гонок данных и выведите итоговое значение счетчика.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="заключение-к-главе-3"&gt;&lt;strong&gt;Заключение к главе 3&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В этой главе мы изучили важные аспекты управления памятью и многопоточности в системном программировании. Эти знания необходимы для создания высокопроизводительных системных программ, которые эффективно используют ресурсы процессора и памяти. В следующем разделе мы углубимся в более продвинутые темы, такие как параллелизм и работа с виртуальными машинами.&lt;/p&gt;</description></item><item><title>Часть II. Операционные системы и системные вызовы</title><link>https://ctf.msk.ru/p/os-i-sistemnye-vyzovy/</link><pubDate>Fri, 18 Oct 2024 16:30:00 +0300</pubDate><guid>https://ctf.msk.ru/p/os-i-sistemnye-vyzovy/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/2-os.webp" alt="Featured image of post Часть II. Операционные системы и системные вызовы" /&gt;&lt;h2 id="часть-ii-операционные-системы-и-системные-вызовы"&gt;&lt;strong&gt;Часть II. Операционные системы и системные вызовы&lt;/strong&gt;
&lt;/h2&gt;&lt;hr&gt;
&lt;h3 id="21-введение-в-операционные-системы"&gt;&lt;strong&gt;2.1 Введение в операционные системы&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="211-определение-и-функции-операционной-системы"&gt;&lt;strong&gt;2.1.1 Определение и функции операционной системы&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Операционная система (ОС)&lt;/strong&gt; — это основной компонент системного программного обеспечения, который управляет ресурсами вычислительной системы и предоставляет интерфейсы для взаимодействия программ с этими ресурсами. Основной задачей операционной системы является эффективное управление аппаратными средствами компьютера и предоставление программам и пользователям удобного доступа к этим ресурсам.&lt;/p&gt;
&lt;p&gt;Основные функции операционной системы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Управление процессами&lt;/strong&gt;: ОС управляет созданием, выполнением, приостановкой и завершением процессов. Она распределяет процессорное время между активными процессами, используя различные алгоритмы планирования.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Управление памятью&lt;/strong&gt;: ОС отвечает за распределение и управление памятью для всех процессов. Она обеспечивает выделение памяти, защиту, а также освобождение памяти после завершения процессов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Управление файлами&lt;/strong&gt;: ОС организует доступ к файловой системе, предоставляя интерфейсы для создания, чтения, записи и удаления файлов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Управление устройствами ввода-вывода&lt;/strong&gt;: ОС контролирует и координирует работу с периферийными устройствами (жесткие диски, принтеры, сетевые устройства).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Безопасность и защита&lt;/strong&gt;: ОС обеспечивает защиту ресурсов от несанкционированного доступа и предотвращает сбои в системе.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="212-архитектура-операционной-системы"&gt;&lt;strong&gt;2.1.2 Архитектура операционной системы&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Операционные системы могут иметь различные архитектуры, но в общем случае они состоят из следующих компонентов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ядро (kernel)&lt;/strong&gt;: Это центральная часть операционной системы, которая выполняет критические задачи, такие как управление памятью, планирование процессов и обеспечение безопасности. Ядро работает в привилегированном режиме и имеет полный доступ к аппаратуре.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Системные библиотеки&lt;/strong&gt;: Они обеспечивают программы функциями, которые работают через системные вызовы. Например, стандартная библиотека языка C (libc) предоставляет интерфейсы для работы с файлами, памятью и процессами.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Драйверы устройств&lt;/strong&gt;: Драйверы обеспечивают связь между ОС и аппаратными устройствами, позволяя операционной системе управлять оборудованием через стандартизированные интерфейсы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Пользовательский интерфейс&lt;/strong&gt;: Может быть как командным (CLI), так и графическим (GUI). Это часть системы, которая позволяет пользователям взаимодействовать с компьютером.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="213-пример-операционной-системы-linux"&gt;&lt;strong&gt;2.1.3 Пример операционной системы: Linux&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Linux — это одна из самых популярных операционных систем для системного программирования. Linux имеет ядро с открытым исходным кодом и широко используется в серверах, встраиваемых системах, мобильных устройствах и персональных компьютерах. Разработка системного программного обеспечения под Linux имеет свои особенности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Используются системные вызовы POSIX.&lt;/li&gt;
&lt;li&gt;Множество утилит для отладки и мониторинга системного ПО (strace, gdb, perf).&lt;/li&gt;
&lt;li&gt;Прямой доступ к коду ядра, что позволяет разрабатывать модули ядра и драйверы устройств.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="22-системные-вызовы-связь-между-приложениями-и-ядром"&gt;&lt;strong&gt;2.2 Системные вызовы: связь между приложениями и ядром&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="221-что-такое-системный-вызов"&gt;&lt;strong&gt;2.2.1 Что такое системный вызов&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Системный вызов — это механизм, с помощью которого программа запрашивает услуги у ядра операционной системы. Системные вызовы позволяют программам выполнять низкоуровневые задачи, такие как работа с файлами, процессами, памятью и устройствами ввода-вывода. Когда приложение вызывает системный вызов, управление передается ядру, которое выполняет необходимые операции с ресурсами системы и возвращает результат приложению.&lt;/p&gt;
&lt;p&gt;Примеры типичных системных вызовов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Файловая система&lt;/strong&gt;: &lt;code&gt;open()&lt;/code&gt;, &lt;code&gt;read()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt;, &lt;code&gt;close()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Процессы&lt;/strong&gt;: &lt;code&gt;fork()&lt;/code&gt;, &lt;code&gt;exec()&lt;/code&gt;, &lt;code&gt;wait()&lt;/code&gt;, &lt;code&gt;exit()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Сигналы&lt;/strong&gt;: &lt;code&gt;kill()&lt;/code&gt;, &lt;code&gt;signal()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Управление памятью&lt;/strong&gt;: &lt;code&gt;mmap()&lt;/code&gt;, &lt;code&gt;munmap()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="222-взаимодействие-программы-с-системными-вызовами"&gt;&lt;strong&gt;2.2.2 Взаимодействие программы с системными вызовами&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Каждая программа работает в пользовательском пространстве и не имеет прямого доступа к аппаратным ресурсам компьютера. Для выполнения операций, требующих привилегированного доступа (например, чтение и запись на диск), программа должна обратиться к ядру операционной системы через системные вызовы. Этот процесс выглядит следующим образом:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Программа делает системный вызов, вызывая соответствующую функцию (например, &lt;code&gt;write()&lt;/code&gt; для записи в файл).&lt;/li&gt;
&lt;li&gt;Управление передается ядру, и процесс переходит в привилегированный режим.&lt;/li&gt;
&lt;li&gt;Ядро выполняет необходимые действия (например, запись данных на диск) и возвращает результат в пользовательский процесс.&lt;/li&gt;
&lt;li&gt;Программа продолжает выполнение.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Системные вызовы обычно реализуются как интерфейсы стандартных библиотек (например, библиотека C). Это означает, что программист взаимодействует с ними через высокоуровневые функции, такие как &lt;code&gt;printf()&lt;/code&gt;, которые в конечном итоге вызывают системные вызовы.&lt;/p&gt;
&lt;h4 id="223-основные-системные-вызовы-в-linux"&gt;&lt;strong&gt;2.2.3 Основные системные вызовы в Linux&lt;/strong&gt;
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Работа с файлами&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;open()&lt;/code&gt;: Открывает файл и возвращает файловый дескриптор.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read()&lt;/code&gt;: Читает данные из файла.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;write()&lt;/code&gt;: Записывает данные в файл.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;close()&lt;/code&gt;: Закрывает файл и освобождает ресурсы.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Работа с процессами&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fork()&lt;/code&gt;: Создает новый процесс путем копирования текущего процесса (родительского).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exec()&lt;/code&gt;: Заменяет образ текущего процесса новым процессом, загружая новую программу в память.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wait()&lt;/code&gt;: Ожидает завершения дочернего процесса.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exit()&lt;/code&gt;: Завершает выполнение процесса.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Управление памятью&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mmap()&lt;/code&gt;: Отображает файл или устройство в память процесса, что позволяет эффективно работать с большими объемами данных.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;munmap()&lt;/code&gt;: Удаляет отображение из адресного пространства процесса.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Сигналы&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kill()&lt;/code&gt;: Отправляет сигнал процессу (например, для его завершения).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;signal()&lt;/code&gt;: Определяет обработчики сигналов.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="224-пример-использования-системного-вызова"&gt;&lt;strong&gt;2.2.4 Пример использования системного вызова &lt;code&gt;fork()&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Пример программы на языке C, использующей системный вызов &lt;code&gt;fork()&lt;/code&gt; для создания нового процесса:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;pid_t&lt;/span&gt; &lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;fork&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Ошибка при создании процесса
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fork failed&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Это дочерний процесс
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Дочерний процесс: PID = %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;getpid&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;execl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/bin/ls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;ls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Выполняем другую программу
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Это родительский процесс
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Родительский процесс: PID = %d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;getpid&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Ждем завершения дочернего процесса
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Объяснение программы:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Системный вызов &lt;code&gt;fork()&lt;/code&gt; создает новый процесс. Если вызов успешен, то возвращает два значения: 0 для дочернего процесса и PID дочернего процесса для родительского.&lt;/li&gt;
&lt;li&gt;В дочернем процессе программа заменяет текущий образ процесса с помощью системного вызова &lt;code&gt;exec()&lt;/code&gt;, загружая команду &lt;code&gt;ls&lt;/code&gt; для выполнения.&lt;/li&gt;
&lt;li&gt;Родительский процесс ожидает завершения дочернего процесса с помощью &lt;code&gt;wait()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="23-управление-процессами-в-операционных-системах"&gt;&lt;strong&gt;2.3 Управление процессами в операционных системах&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="231-понятие-процесса-и-его-жизненный-цикл"&gt;&lt;strong&gt;2.3.1 Понятие процесса и его жизненный цикл&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;Процесс&lt;/strong&gt; — это экземпляр программы, который выполняется в системе. Каждый процесс имеет свой контекст выполнения, который включает в себя текущее состояние процессора, данные, память и другие ресурсы, необходимые для выполнения программы. Процессы могут быть созданы, приостановлены, возобновлены и завершены операционной системой.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Жизненный цикл процесса&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Создание&lt;/strong&gt;: Процесс создается с помощью системного вызова (например, &lt;code&gt;fork()&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Выполнение&lt;/strong&gt;: Процесс получает процессорное время и выполняет инструкции.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ожидание&lt;/strong&gt;: Процесс может быть переведен в состояние ожидания (например, в ожидании ввода-вывода).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Завершение&lt;/strong&gt;: Процесс завершает выполнение, освобождая все выделенные ему ресурсы.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="232-управление-процессами-с-использованием-системных-вызовов"&gt;&lt;strong&gt;2.3.2 Управление процессами с использованием системных вызовов&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Для управления процессами используются следующие системные вызовы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Создание процесса&lt;/strong&gt;: &lt;code&gt;fork()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Загрузка новой программы в процесс&lt;/strong&gt;: &lt;code&gt;exec()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Завершение процесса&lt;/strong&gt;: &lt;code&gt;exit()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ожидание завершения дочернего процесса&lt;/strong&gt;: &lt;code&gt;wait()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="практическое-задание"&gt;&lt;strong&gt;Практическое задание&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Задание:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Напишите программу на языке C, которая создает новый процесс с использованием системного вызова &lt;code&gt;fork()&lt;/code&gt;. Дочерний процесс должен запустить команду &lt;code&gt;ls&lt;/code&gt;, а родительский процесс должен дождаться его завершения и вывести сообщение о завершении.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Инструкции:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Используйте системные вызовы &lt;code&gt;fork()&lt;/code&gt;, &lt;code&gt;exec()&lt;/code&gt;, и &lt;code&gt;wait()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;В дочернем процессе выполните системную команду &lt;code&gt;ls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;В родительском процессе дождитесь завершения дочернего процесса с помощью &lt;code&gt;wait()&lt;/code&gt; и выведите сообщение.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="заключение-к-главе-2"&gt;&lt;strong&gt;Заключение к главе 2&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В этой главе мы познакомились с основными принципами работы операционных систем и системных вызовов. Мы рассмотрели взаимодействие программ с ядром операционной системы через системные вызовы и управление процессами. В следующей главе мы углубимся в управление памятью и изучим важные аспекты многопоточности и параллелизма.&lt;/p&gt;</description></item><item><title>Часть I. Введение в системное программирование</title><link>https://ctf.msk.ru/p/vvedenie-v-sistemnoe-programmirovanie/</link><pubDate>Fri, 18 Oct 2024 15:30:00 +0300</pubDate><guid>https://ctf.msk.ru/p/vvedenie-v-sistemnoe-programmirovanie/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/1-basics.webp" alt="Featured image of post Часть I. Введение в системное программирование" /&gt;&lt;h2 id="часть-i-введение-в-системное-программирование"&gt;&lt;strong&gt;Часть I. Введение в системное программирование&lt;/strong&gt;
&lt;/h2&gt;&lt;hr&gt;
&lt;h3 id="11-что-такое-системное-программирование"&gt;&lt;strong&gt;1.1 Что такое системное программирование&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="111-определение-и-основные-отличия-от-прикладного-программирования"&gt;&lt;strong&gt;1.1.1 Определение и основные отличия от прикладного программирования&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Системное программирование — это процесс разработки программного обеспечения, которое взаимодействует с аппаратным обеспечением и операционной системой на низком уровне. Это включает написание кода, который работает непосредственно с ресурсами компьютера, такими как процессор, память, устройства ввода-вывода и сети. В отличие от прикладного программного обеспечения, которое ориентировано на конечного пользователя, системное программное обеспечение (СПО) предназначено для обеспечения функционирования компьютерной системы и других программ.&lt;/p&gt;
&lt;p&gt;Пример системного программного обеспечения:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Операционные системы (ОС)&lt;/strong&gt; — обеспечивают управление ресурсами компьютера и их эффективное использование.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Драйверы устройств&lt;/strong&gt; — позволяют операционной системе взаимодействовать с аппаратными устройствами.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Компиляторы и интерпретаторы&lt;/strong&gt; — переводят программы на языке высокого уровня в машинный код, который может быть исполнен процессором.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="основные-задачи-системного-программирования"&gt;Основные задачи системного программирования:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Создание программ, которые взаимодействуют с операционной системой на уровне ядра (например, через системные вызовы).&lt;/li&gt;
&lt;li&gt;Оптимизация использования ресурсов системы, таких как процессор, память, устройства ввода-вывода.&lt;/li&gt;
&lt;li&gt;Обеспечение безопасности и надежности системы.&lt;/li&gt;
&lt;li&gt;Поддержка многозадачности и параллельного выполнения процессов.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="112-различия-между-системным-и-прикладным-программированием"&gt;&lt;strong&gt;1.1.2 Различия между системным и прикладным программированием&lt;/strong&gt;
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Уровень взаимодействия с аппаратным обеспечением&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В системном программировании программы работают на уровне ядра операционной системы и аппаратного обеспечения. Программисты используют низкоуровневые API и системные вызовы для управления ресурсами системы.&lt;/li&gt;
&lt;li&gt;В прикладном программировании разработчики создают программное обеспечение, которое работает поверх операционной системы и использует высокоуровневые API.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Оптимизация производительности&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Системное программирование требует высокой степени оптимизации для достижения максимальной производительности, так как ресурсы системы могут быть ограничены.&lt;/li&gt;
&lt;li&gt;Прикладное программное обеспечение, как правило, меньше заботится об оптимизации на уровне процессора и памяти, фокусируясь на пользовательском опыте.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Управление памятью&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;В системном программировании программисты часто вручную управляют памятью (например, используя &lt;code&gt;malloc()&lt;/code&gt; и &lt;code&gt;free()&lt;/code&gt; в языке C).&lt;/li&gt;
&lt;li&gt;В прикладном программировании управление памятью обычно автоматизировано (например, сборка мусора в языках Java или Python).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="113-пример-простая-программа-с-использованием-системного-вызова"&gt;&lt;strong&gt;1.1.3 Пример: простая программа с использованием системного вызова&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Для иллюстрации простейшего примера системного программирования рассмотрим программу на языке C, которая использует системный вызов &lt;code&gt;write()&lt;/code&gt; для вывода текста в стандартный поток вывода (консоль). Это типичный пример работы с системным вызовом, где происходит прямое обращение к ядру операционной системы для выполнения задачи.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello, World!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 1 - это файловый дескриптор для стандартного вывода
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Объяснение:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Здесь используется системный вызов &lt;code&gt;write()&lt;/code&gt;, который напрямую вызывает функции ядра ОС для вывода строки в стандартный поток вывода (консоль). Этот код иллюстрирует основную концепцию системного программирования — прямое взаимодействие с ресурсами системы.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="12-роль-системного-программного-обеспечения-в-ит-инфраструктуре"&gt;&lt;strong&gt;1.2 Роль системного программного обеспечения в ИТ-инфраструктуре&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="121-операционная-система-как-основа-системного-программного-обеспечения"&gt;&lt;strong&gt;1.2.1 Операционная система как основа системного программного обеспечения&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Операционная система (ОС) — это основной компонент системного программного обеспечения, который управляет всеми ресурсами компьютера и предоставляет интерфейс для взаимодействия с прикладным ПО. ОС выполняет следующие функции:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Управление процессами&lt;/strong&gt;: ОС организует выполнение нескольких процессов, предоставляя им возможность работать одновременно и эффективно использовать процессор.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Управление памятью&lt;/strong&gt;: ОС обеспечивает распределение и защиту памяти между процессами, предотвращая конфликты при доступе к данным.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Управление устройствами ввода-вывода&lt;/strong&gt;: ОС взаимодействует с периферийными устройствами (жесткие диски, принтеры, сетевые устройства), абстрагируя прикладные программы от деталей работы с аппаратурой.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Обеспечение безопасности&lt;/strong&gt;: ОС гарантирует, что приложения и пользователи не могут получить несанкционированный доступ к данным и ресурсам системы.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="122-важность-системного-по-в-современных-системах"&gt;&lt;strong&gt;1.2.2 Важность системного ПО в современных системах&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Системное программное обеспечение играет ключевую роль в современных вычислительных системах, обеспечивая:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Стабильность и надежность&lt;/strong&gt;: Без качественного системного ПО все приложения на компьютере могут работать нестабильно или некорректно, что приведет к сбоям и потере данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Производительность&lt;/strong&gt;: Оптимизация системного ПО позволяет максимально эффективно использовать ресурсы системы (CPU, RAM, диск и т.д.), что особенно важно в условиях высоких нагрузок.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Безопасность&lt;/strong&gt;: Системное ПО отвечает за обеспечение доступа к ресурсам системы, контроль привилегий и защиту от атак (например, обеспечение безопасности через мандатное управление доступом, такие как SELinux).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Виртуализация&lt;/strong&gt;: Системное программное обеспечение играет важную роль в современных облачных системах, предоставляя возможность виртуализации и контейнеризации. Это позволяет разделять ресурсы между различными пользователями и приложениями, обеспечивая изоляцию и безопасность.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="13-основные-задачи-системного-программирования"&gt;&lt;strong&gt;1.3 Основные задачи системного программирования&lt;/strong&gt;
&lt;/h3&gt;&lt;h4 id="131-взаимодействие-с-аппаратным-обеспечением"&gt;&lt;strong&gt;1.3.1 Взаимодействие с аппаратным обеспечением&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Одной из ключевых задач системного программирования является создание программ, которые напрямую работают с аппаратными компонентами системы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Управление устройствами (например, работа с устройствами хранения, сетевыми картами, принтерами).&lt;/li&gt;
&lt;li&gt;Использование драйверов для взаимодействия с периферией.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Написание драйвера для устройства ввода-вывода, который принимает запросы от ОС и управляет работой конкретного устройства.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="132-оптимизация-использования-ресурсов-системы"&gt;&lt;strong&gt;1.3.2 Оптимизация использования ресурсов системы&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Системное программное обеспечение должно быть эффективно, чтобы минимизировать накладные расходы на использование процессора, памяти и ввода-вывода. Оптимизация включает в себя:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Управление памятью и устранение утечек памяти.&lt;/li&gt;
&lt;li&gt;Минимизация времени ожидания ввода-вывода (например, асинхронные операции).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Оптимизация программы, использующей многопоточность для работы с сетевыми запросами, чтобы повысить производительность в условиях высокой нагрузки.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="133-работа-с-системными-вызовами"&gt;&lt;strong&gt;1.3.3 Работа с системными вызовами&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;Системные вызовы — это интерфейс, через который программы могут взаимодействовать с ядром операционной системы. Каждый системный вызов выполняется в привилегированном режиме и позволяет программе запрашивать ресурсы или выполнять определенные действия.&lt;/p&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Системные вызовы &lt;code&gt;open()&lt;/code&gt;, &lt;code&gt;read()&lt;/code&gt;, &lt;code&gt;write()&lt;/code&gt;, и &lt;code&gt;close()&lt;/code&gt; для работы с файлами.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Практическое задание&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Написать программу на C, которая создает новый процесс с использованием &lt;code&gt;fork()&lt;/code&gt;, а затем выполняет другую программу в дочернем процессе с помощью &lt;code&gt;exec()&lt;/code&gt;. Программа должна ждать завершения дочернего процесса и выводить его результат.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="заключение-к-главе-1"&gt;&lt;strong&gt;Заключение к главе 1&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Мы рассмотрели основные понятия системного программирования, его задачи и роль системного ПО в современных ИТ-системах. Системное программирование является неотъемлемой частью разработки программ, которые работают непосредственно с ресурсами системы, и требует глубокого понимания работы операционной системы и аппаратного обеспечения. В следующих разделах мы углубимся в конкретные аспекты системного программирования, такие как многопоточность, работа с памятью, системные вызовы и виртуализация.&lt;/p&gt;</description></item><item><title>Примеры системного программирования на Go (Golang)</title><link>https://ctf.msk.ru/p/system-programming-in-go/</link><pubDate>Fri, 18 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/system-programming-in-go/</guid><description>&lt;img src="https://ctf.msk.ru/post/system-programming/system-prog-go.webp" alt="Featured image of post Примеры системного программирования на Go (Golang)" /&gt;&lt;h2 id="примеры-системного-программирования-на-go-golang"&gt;Примеры системного программирования на Go (Golang)
&lt;/h2&gt;&lt;h3 id="введение"&gt;Введение
&lt;/h3&gt;&lt;p&gt;Go (Golang) — это современный язык программирования, который разрабатывался для создания высокопроизводительных системных приложений. Благодаря встроенной поддержке параллелизма и удобному управлению памятью, Go стал популярным выбором для системных программистов. В этой статье мы рассмотрим несколько примеров системного программирования на Go, которые помогут вам лучше понять, как использовать этот язык для решения задач управления процессами, параллелизма и сетевого взаимодействия.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="пример-1-параллелизм-с-горутинами"&gt;Пример 1: Параллелизм с горутинами
&lt;/h3&gt;&lt;p&gt;Одним из главных преимуществ Go является простота работы с параллелизмом. В Go для этого используются горутины (goroutines) — легковесные потоки, которые позволяют выполнять несколько задач одновременно.&lt;/p&gt;
&lt;h4 id="код"&gt;Код:
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;printNumbers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Millisecond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;printLetters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;E&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Millisecond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;%c\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;printNumbers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Выполняется параллельно&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;printLetters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Выполняется параллельно&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Даем горутинам время завершиться&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Завершение программы&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="описание"&gt;Описание:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;В этом примере две функции &lt;code&gt;printNumbers&lt;/code&gt; и &lt;code&gt;printLetters&lt;/code&gt; выполняются параллельно с использованием горутин.&lt;/li&gt;
&lt;li&gt;Функция &lt;code&gt;main()&lt;/code&gt; запускает две горутины и затем ждет некоторое время, чтобы дать им завершиться. Использование &lt;code&gt;time.Sleep&lt;/code&gt; симулирует асинхронное выполнение.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="пример-2-работа-с-процессами"&gt;Пример 2: Работа с процессами
&lt;/h3&gt;&lt;p&gt;Go предоставляет возможность взаимодействовать с внешними процессами с использованием пакета &lt;code&gt;os/exec&lt;/code&gt;. С помощью этого пакета можно запускать другие программы и управлять их вводом и выводом.&lt;/p&gt;
&lt;h4 id="код-1"&gt;Код:
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;os/exec&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Запускаем команду &amp;#34;ls&amp;#34; для вывода содержимого текущей директории&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ls&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;-l&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Output&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Ошибка:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Вывод команды &amp;#39;ls -l&amp;#39;:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="описание-1"&gt;Описание:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;В этом примере с помощью пакета &lt;code&gt;exec&lt;/code&gt; выполняется системная команда &lt;code&gt;ls -l&lt;/code&gt;, которая выводит содержимое текущей директории.&lt;/li&gt;
&lt;li&gt;Метод &lt;code&gt;Output()&lt;/code&gt; возвращает результат выполнения команды. Если при выполнении команды произошла ошибка, она будет обработана и выведена.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="пример-3-сетевое-программирование--создание-простого-tcp-сервера"&gt;Пример 3: Сетевое программирование — создание простого TCP-сервера
&lt;/h3&gt;&lt;p&gt;Go имеет встроенные инструменты для сетевого программирования. В этом примере мы создадим простой TCP-сервер, который принимает подключения от клиентов и отвечает им.&lt;/p&gt;
&lt;h4 id="код-2"&gt;Код:
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;main&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bufio&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;net&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Новое соединение:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;RemoteAddr&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Чтение данных от клиента&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;scanner&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bufio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;NewScanner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;scanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Получено сообщение: %s\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="nb"&gt;byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Сообщение получено\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;func&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Создаем TCP-сервер, слушающий на порту 8080&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Ошибка запуска сервера:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Сервер запущен на порту 8080&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Ожидаем подключения клиентов&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;listener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Ошибка при подключении клиента:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Обрабатываем каждое соединение в отдельной горутине&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;go&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;handleConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="описание-2"&gt;Описание:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;Этот пример создает TCP-сервер, который слушает порт &lt;code&gt;8080&lt;/code&gt; и принимает подключения от клиентов.&lt;/li&gt;
&lt;li&gt;Когда клиент подключается, сервер запускает новую горутину для обработки каждого соединения. Данные от клиента читаются и сервер отправляет ответ обратно.&lt;/li&gt;
&lt;li&gt;Взаимодействие с клиентом выполняется через буферизованное чтение и запись данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id="заключение"&gt;Заключение
&lt;/h3&gt;&lt;p&gt;Go — это мощный язык для системного программирования, предлагающий высокую производительность и удобство работы с параллелизмом, процессами и сетями. В этой статье мы рассмотрели несколько примеров, которые демонстрируют, как использовать Go для выполнения системных задач. Параллелизм с горутинами, работа с внешними процессами и создание TCP-сервера — это лишь малая часть того, что можно реализовать на Go. Продолжайте изучать этот язык и его возможности для создания эффективных системных приложений!&lt;/p&gt;
&lt;hr&gt;</description></item><item><title>Безопасность и уязвимости в веб-приложениях</title><link>https://ctf.msk.ru/p/web-application-security/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/web-application-security/</guid><description>&lt;h1 id="безопасность-и-уязвимости-в-веб-приложениях"&gt;Безопасность и уязвимости в веб-приложениях
&lt;/h1&gt;&lt;p&gt;Безопасность веб-приложений — это комплекс мер, направленных на защиту веб-сайтов и веб-приложений от угроз, таких как хакерские атаки, утечки данных и несанкционированный доступ. В этой статье мы рассмотрим основные типы уязвимостей веб-приложений, методы их эксплуатации на CTF-соревнованиях и способы защиты от них.&lt;/p&gt;
&lt;h2 id="почему-веб-приложения-уязвимы"&gt;Почему веб-приложения уязвимы?
&lt;/h2&gt;&lt;p&gt;Современные веб-приложения становятся все сложнее, а это означает, что в них может быть больше потенциальных уязвимостей. Вот несколько причин, почему веб-приложения подвержены атакам:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Сложность кода&lt;/strong&gt;: Веб-приложения содержат тысячи строк кода, и даже небольшая ошибка может привести к уязвимости.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ошибки конфигурации&lt;/strong&gt;: Неправильно настроенные серверы, базы данных или другие компоненты могут быть атакованы злоумышленниками.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Неправильное управление сессиями&lt;/strong&gt;: Если сеанс пользователя не защищен должным образом, злоумышленник может перехватить его и получить несанкционированный доступ.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Внешние зависимости&lt;/strong&gt;: Использование сторонних библиотек и фреймворков может открыть приложение для атак, если эти зависимости содержат уязвимости.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="распространенные-уязвимости-в-веб-приложениях"&gt;Распространенные уязвимости в веб-приложениях
&lt;/h2&gt;&lt;h3 id="sql-инъекции-sqli"&gt;&lt;strong&gt;SQL-инъекции (SQLi)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;SQL-инъекция&lt;/strong&gt; — это одна из самых распространённых и опасных уязвимостей. Она возникает, когда веб-приложение позволяет злоумышленнику вставлять произвольные SQL-запросы в базу данных через пользовательский ввод.&lt;/p&gt;
&lt;h4 id="как-это-работает"&gt;Как это работает?
&lt;/h4&gt;&lt;p&gt;SQL-инъекция происходит, когда данные, введённые пользователем, напрямую используются в SQL-запросах без должной проверки. Например, если приложение позволяет ввести имя пользователя для входа, злоумышленник может ввести вместо имени SQL-код, который изменит поведение запроса.&lt;/p&gt;
&lt;h4 id="пример"&gt;Пример
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$username&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Злоумышленник может ввести следующий код вместо имени пользователя:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39; OR 1=1 --
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Это изменит запрос на:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;WHERE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;OR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;--&amp;#39;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Такой запрос вернет всех пользователей, и злоумышленник может получить доступ к системе без правильной аутентификации.&lt;/p&gt;
&lt;h4 id="методы-защиты"&gt;Методы защиты:
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Использование подготовленных запросов (prepared statements), которые разделяют код и данные.&lt;/li&gt;
&lt;li&gt;Валидация и фильтрация пользовательского ввода.&lt;/li&gt;
&lt;li&gt;Минимизация прав пользователя базы данных, чтобы ограничить возможности SQL-инъекций.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="межсайтовый-скриптинг-xss"&gt;Межсайтовый скриптинг (XSS)
&lt;/h3&gt;&lt;p&gt;XSS-атака позволяет злоумышленнику внедрять вредоносный код (обычно JavaScript) в веб-страницу, которая будет выполнена в браузере другого пользователя.&lt;/p&gt;
&lt;p&gt;Типы XSS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Отражённый XSS: Вредоносный код внедряется через URL или форму и немедленно возвращается в ответе сервера.&lt;/li&gt;
&lt;li&gt;Сохранённый XSS: Вредоносный код сохраняется на сервере и выполняется каждый раз, когда страница загружается пользователем.&lt;/li&gt;
&lt;li&gt;DOM-based XSS: Атака происходит на стороне клиента, когда изменяется DOM-структура страницы, используя ненадёжные данные.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="пример-задачи"&gt;Пример задачи:
&lt;/h4&gt;&lt;p&gt;Предположим, что веб-приложение принимает комментарии от пользователей и не проверяет их содержимое. Злоумышленник может вставить вредоносный JavaScript-код, который будет выполняться всякий раз, когда другой пользователь откроет эту страницу:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;XSS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="методы-защиты-1"&gt;Методы защиты:
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Правильная экранизация данных, чтобы пользователи не могли вводить код в страницы.&lt;/li&gt;
&lt;li&gt;Использование политики безопасности содержимого (Content Security Policy, CSP), которая ограничивает выполнение скриптов на странице.&lt;/li&gt;
&lt;li&gt;Валидация и фильтрация пользовательских данных перед их отображением.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="межсайтовая-подделка-запросов-csrf"&gt;Межсайтовая подделка запросов (CSRF)
&lt;/h3&gt;&lt;p&gt;CSRF-атака заставляет пользователя выполнить нежелательное действие на сайте, на котором он уже аутентифицирован. Злоумышленник может использовать авторизованную сессию пользователя для выполнения действий от его имени.&lt;/p&gt;
&lt;h4 id="пример-1"&gt;Пример:
&lt;/h4&gt;&lt;p&gt;Предположим, что пользователь авторизован на сайте банка. Злоумышленник отправляет ему ссылку на вредоносный сайт, который отправляет POST-запрос на перевод денег с его счёта. Если сайт банка не защищён от CSRF-атак, запрос будет выполнен, и деньги будут переведены.&lt;/p&gt;
&lt;h4 id="методы-защиты-2"&gt;Методы защиты:
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Использование токенов CSRF, которые добавляются к каждой форме и проверяются сервером.&lt;/li&gt;
&lt;li&gt;Подтверждение ключевых действий с помощью дополнительной аутентификации (например, запрос пароля перед переводом денег).&lt;/li&gt;
&lt;li&gt;Использование методов, таких как SameSite cookies, для ограничения отправки cookie в межсайтовых запросах.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="директории-и-файловые-включения"&gt;Директории и файловые включения
&lt;/h3&gt;&lt;p&gt;Злоумышленник может использовать уязвимости, связанные с включением файлов (например, include или require в PHP), чтобы внедрить и выполнить произвольный код или получить доступ к конфиденциальным данным.&lt;/p&gt;
&lt;h4 id="пример-2"&gt;Пример:
&lt;/h4&gt;&lt;p&gt;Если веб-приложение принимает путь к файлу через параметр URL, злоумышленник может использовать относительные пути для доступа к системным файлам:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-PHP" data-lang="PHP"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_GET&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;file&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Параметр file может быть изменён на:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;../../etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Это даст злоумышленнику доступ к файлу /etc/passwd, содержащему информацию о пользователях системы.&lt;/p&gt;
&lt;h4 id="методы-защиты-3"&gt;Методы защиты:
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Ограничение доступа к конкретным директориям, использование whitelist для допустимых файлов.&lt;/li&gt;
&lt;li&gt;Валидация входных данных, чтобы избежать использования относительных путей.&lt;/li&gt;
&lt;li&gt;Отключение включения удалённых файлов на уровне конфигурации сервера.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="недостатки-управления-сессиями-и-аутентификацией"&gt;Недостатки управления сессиями и аутентификацией
&lt;/h3&gt;&lt;p&gt;Ошибки в управлении сессиями и аутентификацией могут привести к угону сессий и несанкционированному доступу. Злоумышленники могут перехватывать сессии пользователей и выполнять действия от их имени.&lt;/p&gt;
&lt;h4 id="пример-задачи-1"&gt;Пример задачи
&lt;/h4&gt;&lt;p&gt;Участникам CTF предлагается перехватить сессию пользователя через уязвимость в системе управления сессиями и использовать её для получения доступа к конфиденциальной информации.&lt;/p&gt;
&lt;h4 id="методы-защиты-4"&gt;Методы защиты
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;Использование надёжных сеансовых токенов, которые генерируются случайным образом.&lt;/li&gt;
&lt;li&gt;Ограничение времени жизни сессий и автоматический выход после периода бездействия.&lt;/li&gt;
&lt;li&gt;Использование SSL/TLS для шифрования данных сессий.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="полезные-инструменты-для-тестирования-безопасности-веб-приложений"&gt;Полезные инструменты для тестирования безопасности веб-приложений
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Burp Suite: Один из самых мощных инструментов для тестирования безопасности веб-приложений, который включает функции для автоматизации тестов.&lt;/li&gt;
&lt;li&gt;OWASP ZAP: Бесплатный инструмент для тестирования уязвимостей, созданный OWASP.&lt;/li&gt;
&lt;li&gt;sqlmap: Инструмент для автоматизированного поиска и эксплуатации SQL-инъекций.&lt;/li&gt;
&lt;li&gt;XSSer: Инструмент для поиска и эксплуатации уязвимостей XSS.&lt;/li&gt;
&lt;li&gt;Nikto: Сканер уязвимостей, который ищет известные проблемы конфигурации и уязвимости в веб-серверах.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-ресурсы"&gt;Практика и ресурсы
&lt;/h2&gt;&lt;p&gt;Чтобы стать экспертом в области веб-безопасности, важно регулярно практиковаться и использовать реальные задачи. Вот несколько платформ, которые помогут вам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PortSwigger Web Security Academy: Бесплатные курсы и задачи по веб-безопасности.&lt;/li&gt;
&lt;li&gt;Hack The Box: Платформа для тренировки в области взлома и защиты веб-приложений.&lt;/li&gt;
&lt;li&gt;CTFtime: Календарь CTF-соревнований с заданиями по веб-безопасности.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Безопасность веб-приложений — это сложная и многослойная область, требующая как глубоких технических знаний, так и постоянной практики. На CTF-соревнованиях задачи по веб-безопасности могут быть весьма разнообразными и интересными. Чтобы успешно справляться с такими задачами, необходимо постоянно учиться, анализировать реальные уязвимости и оттачивать свои навыки.&lt;/p&gt;</description></item><item><title>Введение в криптографию</title><link>https://ctf.msk.ru/p/cryptography-introduction/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/cryptography-introduction/</guid><description>&lt;h1 id="введение-в-криптографию"&gt;Введение в криптографию
&lt;/h1&gt;&lt;p&gt;Криптография — это наука о защите данных с помощью шифрования. Она играет важную роль в современной информационной безопасности, обеспечивая конфиденциальность и целостность данных. В мире CTF-соревнований задачи по криптографии являются одними из самых популярных и часто включают в себя шифрование, дешифрование, анализ криптосистем и многое другое.&lt;/p&gt;
&lt;h2 id="основные-понятия"&gt;Основные понятия
&lt;/h2&gt;&lt;h3 id="шифрование-и-дешифрование"&gt;Шифрование и дешифрование
&lt;/h3&gt;&lt;p&gt;Шифрование — это процесс преобразования исходного текста (понятного человеку) в зашифрованный (непонятный) вид, с использованием ключа шифрования. Дешифрование — это обратный процесс, при котором зашифрованные данные преобразуются обратно в исходный текст с использованием ключа дешифрования.&lt;/p&gt;
&lt;h3 id="симметричное-и-асимметричное-шифрование"&gt;Симметричное и асимметричное шифрование
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Симметричное шифрование&lt;/strong&gt;: один и тот же ключ используется для шифрования и дешифрования. Пример: алгоритм AES (Advanced Encryption Standard).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Асимметричное шифрование&lt;/strong&gt;: используется два разных ключа — открытый и закрытый. Открытый ключ используется для шифрования, а закрытый — для дешифрования. Пример: алгоритм RSA.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="хеширование"&gt;Хеширование
&lt;/h3&gt;&lt;p&gt;Хеширование — это процесс преобразования данных в строку фиксированной длины, называемую хешем, с использованием хеш-функции. В отличие от шифрования, хеширование является необратимым процессом. Пример: алгоритмы MD5, SHA-256.&lt;/p&gt;
&lt;h2 id="популярные-криптографические-задачи-в-ctf"&gt;Популярные криптографические задачи в CTF
&lt;/h2&gt;&lt;h3 id="1-задачи-на-классические-шифры"&gt;1. &lt;strong&gt;Задачи на классические шифры&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В CTF часто встречаются задачи, связанные с классическими шифрами, такими как:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Цезарь&lt;/strong&gt; (Caesar cipher): простой сдвиг букв в алфавите.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Виженер&lt;/strong&gt; (Vigenère cipher): использование ключевого слова для сдвига каждой буквы на разное количество позиций.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Атбаш&lt;/strong&gt; (Atbash cipher): зеркальный алфавит.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Пример задачи: вам предоставляется зашифрованное сообщение, и нужно найти ключ и расшифровать его.&lt;/p&gt;
&lt;h3 id="2-шифрование-с-использованием-современных-алгоритмов"&gt;2. &lt;strong&gt;Шифрование с использованием современных алгоритмов&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Задачи могут включать шифры, такие как AES, RSA или DES. Обычно нужно определить алгоритм, которым было зашифровано сообщение, и попытаться его расшифровать с помощью предоставленных данных или уязвимостей в реализации.&lt;/p&gt;
&lt;h3 id="3-задачи-на-хеширование"&gt;3. &lt;strong&gt;Задачи на хеширование&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Задачи на хеширование часто требуют найти оригинальные данные, которые соответствуют заданному хешу. Примеры задач:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Восстановить пароль по его хешу.&lt;/li&gt;
&lt;li&gt;Найти коллизии в хеш-функциях (одинаковые хеши для разных входных данных).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-анализ-и-криптоанализ"&gt;4. &lt;strong&gt;Анализ и криптоанализ&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В криптографических задачах может потребоваться провести криптоанализ — это процесс нахождения слабых мест в криптографической системе и их использования для расшифровки данных. Например:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Атака методом частотного анализа&lt;/strong&gt; на шифр Цезаря или Виженера, где анализируется частота появления символов в шифрованном тексте для их дешифровки.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Анализ слабых мест в RSA&lt;/strong&gt; (например, атаки на ключи с малой степенью или факторизацию).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="полезные-инструменты-для-решения-задач-по-криптографии"&gt;Полезные инструменты для решения задач по криптографии
&lt;/h2&gt;&lt;p&gt;Для работы с криптографией на CTF-соревнованиях важно иметь под рукой удобные инструменты. Вот несколько полезных программ и библиотек:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CyberChef&lt;/strong&gt;: онлайн-инструмент для работы с шифрами, хешами, кодировками и другими типами данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hashcat&lt;/strong&gt;: мощная утилита для брутфорса хешей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;John the Ripper&lt;/strong&gt;: популярный инструмент для восстановления паролей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPG&lt;/strong&gt;: инструмент для шифрования и дешифрования данных с использованием асимметричных ключей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenSSL&lt;/strong&gt;: библиотека для работы с криптографическими алгоритмами, которая поддерживает множество стандартов шифрования.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-обучение"&gt;Практика и обучение
&lt;/h2&gt;&lt;p&gt;Лучший способ улучшить свои навыки в криптографии — это практика. Рекомендуется решать задачи на различных платформах для тренировки CTF:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://cryptohack.org/" target="_blank" rel="noopener"
&gt;Cryptohack&lt;/a&gt;: платформа, полностью посвящённая криптографическим задачам.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ctftime.org/" target="_blank" rel="noopener"
&gt;CTFtime&lt;/a&gt;: календарь CTF-событий и доступ к архивам задач.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hackthebox.com/" target="_blank" rel="noopener"
&gt;Hack The Box&lt;/a&gt;: площадка с задачами, которые помогают улучшить навыки в информационной безопасности и криптографии.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Криптография — это сложная, но невероятно интересная область, в которой важно как теоретическое понимание, так и практическое применение. В CTF-соревнованиях она играет одну из ключевых ролей, и хорошее знание криптосистем и алгоритмов даст вам большое преимущество в решении задач.&lt;/p&gt;
&lt;p&gt;Не забывайте тренироваться, использовать доступные инструменты и изучать новые подходы, чтобы быть готовыми ко всем вызовам, которые могут возникнуть на вашем пути.&lt;/p&gt;
&lt;p&gt;Удачи в ваших криптографических приключениях!&lt;/p&gt;</description></item><item><title>Криптографические атаки: методы и примеры</title><link>https://ctf.msk.ru/p/cryptographic-attacks-methods/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/cryptographic-attacks-methods/</guid><description>&lt;h1 id="криптографические-атаки-методы-и-примеры"&gt;Криптографические атаки: методы и примеры
&lt;/h1&gt;&lt;p&gt;Криптография — это ключевой элемент информационной безопасности, который используется для защиты данных от несанкционированного доступа. Однако даже самые сложные криптосистемы могут содержать уязвимости, которые злоумышленники могут использовать для проведения атак. В этой статье мы рассмотрим популярные криптографические атаки, используемые на CTF-соревнованиях, и разберём, как они работают.&lt;/p&gt;
&lt;h2 id="типы-криптографических-атак"&gt;Типы криптографических атак
&lt;/h2&gt;&lt;h3 id="1-атака-на-текст-с-известным-шифртекстом-ciphertext-only-attack"&gt;1. &lt;strong&gt;Атака на текст с известным шифртекстом (Ciphertext-Only Attack)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В атаке на текст с известным шифртекстом злоумышленник пытается взломать шифр, имея доступ только к зашифрованным данным, без знания исходного текста или ключа.&lt;/p&gt;
&lt;h4 id="пример-задачи"&gt;Пример задачи:
&lt;/h4&gt;&lt;p&gt;Участнику CTF предоставляется зашифрованное сообщение. Его задача — выяснить ключ шифрования или восстановить исходный текст на основе анализа шифртекста.&lt;/p&gt;
&lt;h4 id="способы-взлома"&gt;Способы взлома:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Частотный анализ&lt;/strong&gt;: Используется для взлома простых шифров, таких как шифр Цезаря или Виженера. Частотный анализ помогает выявить закономерности в шифртексте на основе частоты появления символов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Анализ шаблонов&lt;/strong&gt;: Некоторые шифры могут сохранять определённые закономерности и шаблоны, которые помогают определить метод шифрования и возможный ключ.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-атака-на-текст-с-известным-открытым-текстом-known-plaintext-attack"&gt;2. &lt;strong&gt;Атака на текст с известным открытым текстом (Known-Plaintext Attack)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;В этой атаке злоумышленник имеет доступ как к шифртексту, так и к соответствующему открытому тексту. Это упрощает анализ шифра и может помочь восстановить ключ.&lt;/p&gt;
&lt;h4 id="пример-задачи-1"&gt;Пример задачи:
&lt;/h4&gt;&lt;p&gt;Задача предоставляет зашифрованное сообщение и небольшой фрагмент исходного текста. Участник должен использовать известный открытый текст для взлома шифра и нахождения ключа.&lt;/p&gt;
&lt;h4 id="способы-взлома-1"&gt;Способы взлома:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Анализ XOR&lt;/strong&gt;: Если шифр использует XOR для шифрования, знание части исходного текста позволяет легко найти ключ.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Выравнивание текста&lt;/strong&gt;: Совмещение известных частей исходного текста с шифртекстом может помочь выявить шифрование блоками.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-атака-на-текст-с-выбранным-открытым-текстом-chosen-plaintext-attack"&gt;3. &lt;strong&gt;Атака на текст с выбранным открытым текстом (Chosen-Plaintext Attack)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Злоумышленник имеет возможность шифровать произвольные сообщения и использовать шифртексты для анализа криптографической системы. Эта атака особенно эффективна против блочных шифров, таких как AES.&lt;/p&gt;
&lt;h4 id="пример-задачи-2"&gt;Пример задачи:
&lt;/h4&gt;&lt;p&gt;Участник CTF может отправлять на сервер произвольные сообщения для их шифрования и использовать полученные шифртексты для нахождения уязвимостей.&lt;/p&gt;
&lt;h4 id="способы-взлома-2"&gt;Способы взлома:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Атаки на CBC-мод&lt;/strong&gt;: Используя выбранный открытый текст, злоумышленник может анализировать поведение шифра, работающего в режиме CBC (Cipher Block Chaining).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Padding Oracle&lt;/strong&gt;: Этот тип атаки используется для дешифровки данных в системах, которые используют шифрование с блочным шифром и padding (заполнение блоков).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-атака-по-времени-timing-attack"&gt;4. &lt;strong&gt;Атака по времени (Timing Attack)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Атака по времени основана на анализе времени выполнения криптографических операций. Злоумышленник измеряет, сколько времени система тратит на обработку данных, и использует эту информацию для восстановления ключа или других секретов.&lt;/p&gt;
&lt;h4 id="пример-задачи-3"&gt;Пример задачи:
&lt;/h4&gt;&lt;p&gt;На CTF участникам может быть предложено взаимодействовать с сервером, который выполняет операцию шифрования. Используя различные запросы и измеряя время их обработки, участники могут попытаться определить ключ шифрования.&lt;/p&gt;
&lt;h4 id="способы-взлома-3"&gt;Способы взлома:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Анализ различий в времени&lt;/strong&gt;: Даже небольшие задержки в обработке могут указывать на определённые действия, такие как проверка конкретных битов ключа.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Моделирование атак&lt;/strong&gt;: Используя измеренные временные интервалы, злоумышленник может построить модель поведения шифра и постепенно восстановить ключ.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-атака-с-использованием-коллизий-collision-attack"&gt;5. &lt;strong&gt;Атака с использованием коллизий (Collision Attack)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Эта атака направлена на нахождение двух различных входных данных, которые дают одинаковый выходной результат при хешировании. Коллизии могут использоваться для взлома систем, полагающихся на уникальность хешей, таких как цифровые подписи.&lt;/p&gt;
&lt;h4 id="пример-задачи-4"&gt;Пример задачи:
&lt;/h4&gt;&lt;p&gt;Участнику CTF даётся хеш и предлагается найти два разных сообщения, которые имеют одинаковый хеш.&lt;/p&gt;
&lt;h4 id="способы-взлома-4"&gt;Способы взлома:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Атака дня рождения&lt;/strong&gt;: Это метод поиска коллизий в хеш-функциях. Он основан на вероятностной модели, где вероятность коллизии возрастает с увеличением количества хешей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Анализ слабостей хеш-функций&lt;/strong&gt;: Некоторые хеш-функции, такие как MD5, имеют известные уязвимости, которые позволяют генерировать коллизии.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-брутфорс-brute-force-attack"&gt;6. &lt;strong&gt;Брутфорс (Brute-Force Attack)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Атака брутфорс — это метод, при котором злоумышленник систематически перебирает все возможные значения ключа до тех пор, пока не найдёт правильный. Хотя этот метод может занять много времени, он остаётся эффективным против слабых или коротких ключей.&lt;/p&gt;
&lt;h4 id="пример-задачи-5"&gt;Пример задачи:
&lt;/h4&gt;&lt;p&gt;Участнику CTF нужно расшифровать сообщение, зашифрованное с использованием шифра Цезаря, где ключ — это сдвиг на определённое количество символов.&lt;/p&gt;
&lt;h4 id="способы-взлома-5"&gt;Способы взлома:
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Автоматизация брутфорса&lt;/strong&gt;: Инструменты, такие как &lt;code&gt;John the Ripper&lt;/code&gt; или &lt;code&gt;hashcat&lt;/code&gt;, помогают автоматизировать процесс перебора ключей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Атаки с использованием радужных таблиц&lt;/strong&gt;: Радужные таблицы используют предварительно рассчитанные хеши для ускорения процесса брутфорса.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="популярные-инструменты-для-криптографических-атак"&gt;Популярные инструменты для криптографических атак
&lt;/h2&gt;&lt;p&gt;Вот несколько популярных инструментов, которые можно использовать для проведения криптографических атак на CTF-соревнованиях:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CyberChef&lt;/strong&gt;: Онлайн-инструмент для шифрования, дешифрования и анализа данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hashcat&lt;/strong&gt;: Программа для подбора паролей и хешей методом брутфорса.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;John the Ripper&lt;/strong&gt;: Мощный инструмент для восстановления паролей и расшифровки данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cryptohack&lt;/strong&gt;: Платформа с задачами по криптографическим атакам для практики.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Padbuster&lt;/strong&gt;: Инструмент для проведения Padding Oracle атак.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-обучение"&gt;Практика и обучение
&lt;/h2&gt;&lt;p&gt;Чтобы развить навыки в криптографических атаках, важно регулярно практиковаться на реальных задачах. Вот несколько ресурсов для тренировок:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://cryptohack.org/" target="_blank" rel="noopener"
&gt;Cryptohack&lt;/a&gt;: Платформа, полностью посвящённая криптографическим задачам и атакам.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.root-me.org/" target="_blank" rel="noopener"
&gt;Root Me&lt;/a&gt;: Учебные задания и практические задачи по криптографии и взлому.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ctftime.org/" target="_blank" rel="noopener"
&gt;CTFtime&lt;/a&gt;: Архив задач с различных CTF, включая криптографические атаки.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Криптографические атаки — это сложная, но очень увлекательная часть CTF-соревнований. Знание методов и инструментов для проведения таких атак может значительно повысить ваши шансы на успех. Практикуйтесь, изучайте различные виды атак, и вы сможете не только взламывать шифры, но и глубже понять, как работает современная криптография.&lt;/p&gt;</description></item><item><title>Основы веб-безопасности</title><link>https://ctf.msk.ru/p/web-security-basics/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/web-security-basics/</guid><description>&lt;h1 id="основы-веб-безопасности"&gt;Основы веб-безопасности
&lt;/h1&gt;&lt;p&gt;Веб-безопасность — это область информационной безопасности, сосредоточенная на защите веб-приложений от атак. На CTF-соревнованиях задачи по веб-безопасности часто касаются поиска уязвимостей в веб-сайтах и веб-приложениях, что делает знание этой области особенно важным.&lt;/p&gt;
&lt;h2 id="основные-уязвимости"&gt;Основные уязвимости
&lt;/h2&gt;&lt;h3 id="1-sql-инъекции-sqli"&gt;1. &lt;strong&gt;SQL-инъекции (SQLi)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;SQL-инъекция позволяет злоумышленнику вмешиваться в запросы к базе данных. Это достигается путём ввода вредоносного SQL-кода в формы или URL веб-приложения.&lt;/p&gt;
&lt;p&gt;Пример задачи: Ввод вредоносного SQL-запроса в форму входа для получения доступа к системе.&lt;/p&gt;
&lt;h3 id="2-межсайтовый-скриптинг-xss"&gt;2. &lt;strong&gt;Межсайтовый скриптинг (XSS)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;XSS-атака заключается во внедрении вредоносного скрипта в доверенный сайт. Она позволяет злоумышленнику выполнить произвольный код в браузере пользователя.&lt;/p&gt;
&lt;p&gt;Пример задачи: Найти уязвимость XSS на сайте и использовать её для получения сессионных данных пользователя.&lt;/p&gt;
&lt;h3 id="3-межсайтовая-подделка-запроса-csrf"&gt;3. &lt;strong&gt;Межсайтовая подделка запроса (CSRF)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;CSRF-атака заставляет пользователя выполнить несанкционированное действие на веб-приложении, на которое он авторизован, путём отправки поддельного запроса.&lt;/p&gt;
&lt;p&gt;Пример задачи: Найти уязвимость CSRF и заставить пользователя выполнить критическое действие (например, изменить пароль).&lt;/p&gt;
&lt;h2 id="инструменты-для-веб-тестирования"&gt;Инструменты для веб-тестирования
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Burp Suite&lt;/strong&gt;: Один из самых популярных инструментов для тестирования безопасности веб-приложений.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OWASP ZAP&lt;/strong&gt;: Открытая платформа для поиска уязвимостей веб-приложений.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sqlmap&lt;/strong&gt;: Утилита для автоматизации поиска и эксплуатации SQL-инъекций.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;XSSer&lt;/strong&gt;: Инструмент для автоматического поиска и эксплуатации уязвимостей XSS.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-обучение"&gt;Практика и обучение
&lt;/h2&gt;&lt;p&gt;Для улучшения навыков веб-безопасности важно тренироваться на реальных задачах и сценариях. Рекомендуемые ресурсы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://portswigger.net/web-security" target="_blank" rel="noopener"
&gt;PortSwigger Web Security Academy&lt;/a&gt;: Бесплатные учебные материалы и практические задачи по веб-безопасности.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hackthebox.com/" target="_blank" rel="noopener"
&gt;Hack The Box&lt;/a&gt;: Практические задачи по взлому веб-приложений.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://www.itsecgames.com/" target="_blank" rel="noopener"
&gt;bWAPP&lt;/a&gt;: Учебное приложение с намеренно оставленными уязвимостями для тренировки.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Знание веб-безопасности является ключевым для успешного решения задач на CTF. Многие уязвимости могут быть устранены при правильной конфигурации веб-приложений, но на соревнованиях они специально оставлены для изучения. Практикуйтесь, изучайте реальные примеры и используйте лучшие инструменты, чтобы подготовиться к задачам на CTF.&lt;/p&gt;</description></item><item><title>Основы реверс-инжиниринга</title><link>https://ctf.msk.ru/p/reverse-engineering-basics/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/reverse-engineering-basics/</guid><description>&lt;h1 id="основы-реверс-инжиниринга"&gt;Основы реверс-инжиниринга
&lt;/h1&gt;&lt;p&gt;Реверс-инжиниринг — это процесс анализа программы или системы для понимания её внутренней структуры и работы, без наличия исходного кода. В CTF задачи по реверс-инжинирингу часто требуют анализа бинарных файлов, определения их уязвимостей и нахождения скрытых данных.&lt;/p&gt;
&lt;h2 id="основные-понятия"&gt;Основные понятия
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Декомпиляция&lt;/strong&gt;: Преобразование бинарного кода в код, который легче читать и анализировать.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Отладка (дебаггинг)&lt;/strong&gt;: Процесс выполнения программы по шагам для анализа её поведения и выявления уязвимостей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Обфускация&lt;/strong&gt;: Специальное изменение кода, делающее его трудным для понимания и анализа.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="задачи-на-ctf"&gt;Задачи на CTF
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Простая декомпиляция&lt;/strong&gt;: Нужно разобрать небольшой бинарный файл и найти ключ или важную строку данных. Это может быть простая программа, которая принимает введённые данные, и требуется найти корректный ввод.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Обратная разработка алгоритмов&lt;/strong&gt;: Анализ программы для выявления алгоритмов её работы. Часто такие задачи требуют выяснения условий, при которых программа выдаёт нужный результат (например, правильный пароль).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Анализ эксплойтов&lt;/strong&gt;: Иногда программы содержат уязвимости, которые можно использовать для взлома. Задачи могут требовать найти эти уязвимости и эксплуатировать их для получения флага.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="инструменты-для-реверс-инжиниринга"&gt;Инструменты для реверс-инжиниринга
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ghidra&lt;/strong&gt;: Популярная платформа для анализа бинарных файлов и декомпиляции.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IDA Pro&lt;/strong&gt;: Профессиональный инструмент для реверс-инжиниринга с поддержкой множества архитектур.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Radare2&lt;/strong&gt;: Мощный инструмент с открытым исходным кодом для реверс-инжиниринга и анализа программ.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;x64dbg&lt;/strong&gt;: Отладчик для Windows-приложений, позволяющий шаг за шагом анализировать выполнение программ.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-обучение"&gt;Практика и обучение
&lt;/h2&gt;&lt;p&gt;Для того чтобы эффективно решать задачи по реверс-инжинирингу, важно регулярно практиковаться. Вот несколько платформ, которые помогут улучшить ваши навыки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://crackmes.one/" target="_blank" rel="noopener"
&gt;Crackmes&lt;/a&gt;: Платформа с задачами для реверс-инжиниринга.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ctftime.org/" target="_blank" rel="noopener"
&gt;CTFtime&lt;/a&gt;: Архив задач CTF с категориями по реверс-инжинирингу.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.hackthebox.com/" target="_blank" rel="noopener"
&gt;Hack The Box&lt;/a&gt;: Практические задачи по взлому программ и анализу их уязвимостей.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Реверс-инжиниринг требует терпения и внимательности, но знание его основ поможет вам успешно справляться с задачами на CTF-соревнованиях. Используйте доступные инструменты, практикуйтесь и анализируйте каждую задачу, чтобы быть готовыми ко всем вызовам.&lt;/p&gt;</description></item><item><title>Основы социальной инженерии</title><link>https://ctf.msk.ru/p/social-engineering-basics/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/social-engineering-basics/</guid><description>&lt;h1 id="основы-социальной-инженерии"&gt;Основы социальной инженерии
&lt;/h1&gt;&lt;p&gt;Социальная инженерия — это метод манипуляции людьми с целью получения конфиденциальной информации или доступа к системам. Это не технический взлом, а скорее психологическая игра, при которой злоумышленники используют человеческие слабости, чтобы достичь своих целей.&lt;/p&gt;
&lt;h2 id="основные-методы-социальной-инженерии"&gt;Основные методы социальной инженерии
&lt;/h2&gt;&lt;h3 id="1-фишинг-phishing"&gt;1. &lt;strong&gt;Фишинг (Phishing)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Фишинг — это один из самых распространённых методов социальной инженерии, при котором злоумышленники отправляют поддельные письма или сообщения с целью обманом заставить жертву раскрыть личные данные или загрузить вредоносное ПО.&lt;/p&gt;
&lt;p&gt;Пример задачи: анализ поддельного письма, чтобы выявить признаки фишинга и предотвратить утечку данных.&lt;/p&gt;
&lt;h3 id="2-вишинг-vishing"&gt;2. &lt;strong&gt;Вишинг (Vishing)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Вишинг — это разновидность социальной инженерии, когда злоумышленник использует телефонные звонки для обмана. Он может представляться сотрудником компании или службой безопасности, чтобы получить конфиденциальную информацию.&lt;/p&gt;
&lt;p&gt;Пример задачи: распознать ложный звонок и определить, какие данные пытается получить злоумышленник.&lt;/p&gt;
&lt;h3 id="3-смысл-smishing"&gt;3. &lt;strong&gt;Смысл (Smishing)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Смысл — это фишинг с использованием SMS-сообщений, когда жертве отправляются вредоносные ссылки или запросы на конфиденциальную информацию через текстовые сообщения.&lt;/p&gt;
&lt;p&gt;Пример задачи: анализ SMS, в котором содержится ссылка, ведущая на поддельный сайт, и выявление попытки кражи данных.&lt;/p&gt;
&lt;h3 id="4-манипуляция-доверием-pretexting"&gt;4. &lt;strong&gt;Манипуляция доверием (Pretexting)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Pretexting — это атака, при которой злоумышленник создаёт вымышленную ситуацию или легенду, чтобы вызвать доверие у жертвы и получить необходимые данные.&lt;/p&gt;
&lt;p&gt;Пример задачи: злоумышленник представляет себя коллегой, чтобы получить доступ к внутренним ресурсам компании.&lt;/p&gt;
&lt;h2 id="задачи-по-социальной-инженерии-на-ctf"&gt;Задачи по социальной инженерии на CTF
&lt;/h2&gt;&lt;p&gt;На некоторых CTF-соревнованиях можно встретить задачи, связанные с социальной инженерией. Хотя это не технические задачи, они требуют от участников умения анализировать поведение людей и распознавать попытки обмана.&lt;/p&gt;
&lt;h3 id="пример-задачи"&gt;Пример задачи
&lt;/h3&gt;&lt;p&gt;Вам отправлено подозрительное письмо от неизвестного отправителя, который утверждает, что представляет службу поддержки вашей компании. Необходимо проанализировать письмо и указать все признаки фишинга.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Проверка адреса отправителя&lt;/li&gt;
&lt;li&gt;Анализ ссылок в письме&lt;/li&gt;
&lt;li&gt;Проверка поддельных логотипов и брендинга&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="полезные-инструменты"&gt;Полезные инструменты
&lt;/h2&gt;&lt;p&gt;Для анализа и распознавания атак социальной инженерии можно использовать следующие инструменты:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PhishTank&lt;/strong&gt;: Онлайн-сервис, который позволяет проверять подозрительные ссылки на наличие фишинга.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email Header Analyzer&lt;/strong&gt;: Утилита для анализа заголовков email-сообщений с целью выявления подделок.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Have I Been Pwned?&lt;/strong&gt;: Сервис для проверки, не были ли ваши данные скомпрометированы.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-обучение"&gt;Практика и обучение
&lt;/h2&gt;&lt;p&gt;Социальная инженерия требует не только технических знаний, но и понимания человеческой психологии. Вот несколько ресурсов, которые помогут вам лучше понять социальную инженерию:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.trustedsec.com" target="_blank" rel="noopener"
&gt;Social-Engineer Toolkit (SET)&lt;/a&gt;: Набор инструментов для проведения тестов социальной инженерии.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://cofense.com" target="_blank" rel="noopener"
&gt;PhishMe&lt;/a&gt;: Платформа для тренировки сотрудников по защите от фишинга.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://example.com" target="_blank" rel="noopener"
&gt;Книги и статьи о социальной инженерии&lt;/a&gt;: Чтение материалов по психологии атак.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Социальная инженерия — это мощный инструмент в арсенале злоумышленников, и защита от неё требует как технических знаний, так и понимания человеческих слабостей. Задачи по социальной инженерии на CTF могут дать полезный опыт в распознавании подобных атак и научить вас анализировать поведение людей.&lt;/p&gt;
&lt;p&gt;Будьте бдительны, тренируйте навыки социальной инженерии и научитесь распознавать попытки манипуляций, чтобы быть готовыми ко всем вызовам на соревнованиях и в реальной жизни.&lt;/p&gt;</description></item><item><title>Основы форензики</title><link>https://ctf.msk.ru/p/forensics-basics/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/forensics-basics/</guid><description>&lt;h1 id="основы-форензики"&gt;Основы форензики
&lt;/h1&gt;&lt;p&gt;Форензика (forensics) — это направление информационной безопасности, связанное с анализом и восстановлением данных для расследования инцидентов. На CTF-соревнованиях форензические задачи требуют от участников умения находить скрытые данные в файлах, восстанавливать удалённые данные или анализировать сетевые дампы.&lt;/p&gt;
&lt;h2 id="основные-типы-задач-в-форензике"&gt;Основные типы задач в форензике
&lt;/h2&gt;&lt;h3 id="1-анализ-файловых-систем"&gt;1. &lt;strong&gt;Анализ файловых систем&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Файловая система может содержать скрытую информацию, такие как удалённые файлы или метаданные. Задачи могут включать восстановление удалённых данных или поиск скрытых файлов.&lt;/p&gt;
&lt;p&gt;Пример задачи: восстановление удалённого документа из файловой системы или анализ метаданных изображения для нахождения скрытой информации.&lt;/p&gt;
&lt;h3 id="2-анализ-сетевых-дампов-pcap"&gt;2. &lt;strong&gt;Анализ сетевых дампов (PCAP)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;CTF задачи по анализу сетевого трафика обычно связаны с изучением дампов (файлов PCAP), которые содержат данные о сетевых взаимодействиях. Это может включать восстановление переданных файлов, анализ пакетов или нахождение атак в сетевом трафике.&lt;/p&gt;
&lt;p&gt;Пример задачи: анализ сетевого дампа для нахождения скомпрометированных данных или утечек информации.&lt;/p&gt;
&lt;h3 id="3-обработка-и-анализ-изображений"&gt;3. &lt;strong&gt;Обработка и анализ изображений&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Часто скрытая информация может быть зашифрована или спрятана внутри изображений или других мультимедийных файлов. Использование техник стеганографии позволяет спрятать данные в файле так, что на первый взгляд они не заметны.&lt;/p&gt;
&lt;p&gt;Пример задачи: найти скрытые данные в изображении с использованием стеганографии.&lt;/p&gt;
&lt;h3 id="4-анализ-логов"&gt;4. &lt;strong&gt;Анализ логов&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Логи — это записи активности системы или приложения, которые могут содержать важную информацию для расследования. В CTF задачах может потребоваться анализ логов для нахождения аномальных действий или следов взлома.&lt;/p&gt;
&lt;p&gt;Пример задачи: анализировать журналы доступа к серверу, чтобы найти попытки несанкционированного доступа и вычислить нарушителя.&lt;/p&gt;
&lt;h2 id="инструменты-для-форензики"&gt;Инструменты для форензики
&lt;/h2&gt;&lt;p&gt;Для эффективного решения задач по форензике на CTF, рекомендуется освоить несколько инструментов, которые помогут в анализе данных:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Autopsy&lt;/strong&gt;: Мощный инструмент для анализа файловых систем и восстановления данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Wireshark&lt;/strong&gt;: Популярная утилита для анализа сетевых дампов и пакетов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Binwalk&lt;/strong&gt;: Инструмент для анализа и извлечения данных из бинарных файлов и изображений.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Steghide&lt;/strong&gt;: Инструмент для стеганографии, используемый для скрытия данных внутри файлов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;foremost&lt;/strong&gt;: Программа для восстановления удалённых файлов из образов дисков.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-обучение"&gt;Практика и обучение
&lt;/h2&gt;&lt;p&gt;Задачи по форензике могут показаться сложными, но с практикой и правильными инструментами их решение становится проще. Вот несколько ресурсов, которые помогут вам улучшить навыки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://overthewire.org/" target="_blank" rel="noopener"
&gt;Forensics Challenges на OverTheWire&lt;/a&gt;: Практические задачи по форензике для новичков.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.root-me.org/" target="_blank" rel="noopener"
&gt;Root Me&lt;/a&gt;: Платформа с форензическими задачами и тренировками.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ctftime.org/" target="_blank" rel="noopener"
&gt;CTFtime&lt;/a&gt;: Архив задач по форензике с различных CTF-соревнований.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="пример-задачи"&gt;Пример задачи
&lt;/h2&gt;&lt;p&gt;Вот пример классической задачи по форензике:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Задача:&lt;/strong&gt; Вам предоставлен сетевой дамп (PCAP-файл), в котором скрыты данные. Ваша задача — проанализировать трафик и восстановить файлы, которые были переданы по сети. Используйте Wireshark для анализа трафика и попробуйте восстановить переданные данные.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Решение:&lt;/strong&gt; Откройте дамп в Wireshark, используйте фильтры для нахождения интересных пакетов (например, HTTP-запросы) и экспортируйте файлы, переданные по сети.&lt;/p&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Форензика — это увлекательная и важная часть CTF-соревнований, которая требует внимания к деталям и умения работать с различными типами данных. Развивая навыки форензики, вы сможете решать задачи, которые на первый взгляд могут показаться сложными, но предоставляют интересные вызовы и возможности для профессионального роста.&lt;/p&gt;
&lt;p&gt;Не забывайте практиковаться, использовать правильные инструменты и подходы для анализа данных, чтобы стать экспертом в форензике.&lt;/p&gt;</description></item><item><title>Основы эксплуатации уязвимостей</title><link>https://ctf.msk.ru/p/exploit-development-basics/</link><pubDate>Sat, 12 Oct 2024 00:00:00 +0000</pubDate><guid>https://ctf.msk.ru/p/exploit-development-basics/</guid><description>&lt;h1 id="основы-эксплуатации-уязвимостей"&gt;Основы эксплуатации уязвимостей
&lt;/h1&gt;&lt;p&gt;Эксплуатация уязвимостей — это процесс нахождения и использования слабых мест в программном обеспечении с целью выполнения произвольного кода или получения несанкционированного доступа. На CTF-соревнованиях задачи на эксплуатацию уязвимостей часто требуют глубокого понимания низкоуровневого программирования и системы.&lt;/p&gt;
&lt;h2 id="основные-типы-уязвимостей"&gt;Основные типы уязвимостей
&lt;/h2&gt;&lt;h3 id="1-переполнение-буфера-buffer-overflow"&gt;1. &lt;strong&gt;Переполнение буфера (Buffer Overflow)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Переполнение буфера происходит, когда программа записывает больше данных, чем может вместить выделенный буфер, что позволяет злоумышленнику перезаписать соседние области памяти. Это может привести к выполнению произвольного кода.&lt;/p&gt;
&lt;p&gt;Пример задачи: найти уязвимость переполнения буфера в простом приложении и использовать её для выполнения shell-кода.&lt;/p&gt;
&lt;h3 id="2-use-after-free"&gt;2. &lt;strong&gt;Use-After-Free&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Уязвимость &lt;strong&gt;Use-After-Free&lt;/strong&gt; возникает, когда программа продолжает обращаться к уже освобождённому участку памяти, что может быть использовано для эксплуатации программы.&lt;/p&gt;
&lt;p&gt;Пример задачи: найти момент, когда программа обращается к освобождённой памяти, и использовать этот доступ для выполнения произвольного кода.&lt;/p&gt;
&lt;h3 id="3-форматные-строки-format-string-vulnerabilities"&gt;3. &lt;strong&gt;Форматные строки (Format String Vulnerabilities)&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Уязвимость форматной строки возникает, когда пользовательский ввод используется напрямую в функции форматирования, такой как &lt;code&gt;printf&lt;/code&gt;, без должной проверки. Это может позволить злоумышленнику читать или записывать данные в произвольные области памяти.&lt;/p&gt;
&lt;p&gt;Пример задачи: использовать уязвимость форматной строки, чтобы прочитать содержимое стека и найти пароль.&lt;/p&gt;
&lt;h3 id="4-double-free"&gt;4. &lt;strong&gt;Double Free&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Эта уязвимость возникает, когда один и тот же блок памяти освобождается дважды, что может привести к непредсказуемому поведению программы и возможной эксплуатации.&lt;/p&gt;
&lt;p&gt;Пример задачи: выявить и использовать уязвимость double-free для захвата управления памятью программы.&lt;/p&gt;
&lt;h2 id="этапы-разработки-эксплойтов"&gt;Этапы разработки эксплойтов
&lt;/h2&gt;&lt;h3 id="1-анализ-уязвимости"&gt;1. &lt;strong&gt;Анализ уязвимости&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Первый шаг в разработке эксплойта — это выявление уязвимости в программе. Для этого нужно внимательно изучить код или провести тестирование на наличие уязвимостей, используя такие инструменты, как отладчики и фуззеры.&lt;/p&gt;
&lt;h3 id="2-разработка-эксплойта"&gt;2. &lt;strong&gt;Разработка эксплойта&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;После того как уязвимость найдена, следующий шаг — это создание эксплойта, который может воспользоваться этой уязвимостью для выполнения произвольного кода или получения доступа к системе.&lt;/p&gt;
&lt;h3 id="3-использование-shellcode"&gt;3. &lt;strong&gt;Использование Shellcode&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Shellcode — это исполняемый код, который используется для выполнения вредоносных действий в скомпрометированной системе. Чаще всего это короткий фрагмент машинного кода, который выполняет базовые действия, например, открытие shell.&lt;/p&gt;
&lt;h3 id="4-отладка-и-тестирование"&gt;4. &lt;strong&gt;Отладка и тестирование&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;Отладка и тестирование эксплойта с помощью таких инструментов, как &lt;strong&gt;gdb&lt;/strong&gt;, &lt;strong&gt;pwntools&lt;/strong&gt; и других, чтобы убедиться, что он работает стабильно.&lt;/p&gt;
&lt;h2 id="полезные-инструменты"&gt;Полезные инструменты
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pwntools&lt;/strong&gt;: Python-библиотека, облегчающая процесс разработки эксплойтов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;gdb&lt;/strong&gt;: GNU отладчик для пошагового анализа программы и нахождения уязвимостей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;radare2&lt;/strong&gt;: Отладчик и инструмент для реверс-инжиниринга, полезный для анализа и эксплуатации уязвимостей.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ROPgadget&lt;/strong&gt;: Инструмент для поиска ROP-гаджетов в бинарных файлах, что упрощает создание ROP-цепочек для эксплуатации переполнений буфера.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="практика-и-обучение"&gt;Практика и обучение
&lt;/h2&gt;&lt;p&gt;Чтобы стать специалистом в области эксплуатации уязвимостей, важно регулярно практиковаться и участвовать в CTF-соревнованиях. Вот несколько ресурсов для тренировки:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://pwnable.tw/" target="_blank" rel="noopener"
&gt;pwnable.tw&lt;/a&gt;: Задачи по эксплуатации уязвимостей и разработке эксплойтов.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://exploit-exercises.com/" target="_blank" rel="noopener"
&gt;Exploit Exercises&lt;/a&gt;: Учебные материалы и задания по взлому программ.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://ctftime.org/" target="_blank" rel="noopener"
&gt;CTFtime&lt;/a&gt;: Архив задач по эксплуатации уязвимостей с различных CTF-соревнований.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="заключение"&gt;Заключение
&lt;/h2&gt;&lt;p&gt;Эксплуатация уязвимостей — это увлекательная и сложная область информационной безопасности, которая требует глубокого понимания работы систем и программного обеспечения. Регулярная практика, изучение новых техник и использование правильных инструментов помогут вам стать успешным в решении задач на CTF и в реальной жизни.&lt;/p&gt;</description></item></channel></rss>