Rust, Хакинг на Rust

Курс — Хакинг на Rust. #14 Низкоуровневое программирование. FFI и интеграция с C-библиотеками

Здравствуйте, дорогие друзья!

Rust славится своей безопасностью, но в хакерских сценариях часто требуется взаимодействие с низкоуровневыми системами или существующими C-библиотеками. Для этого язык предоставляет Foreign Function Interface (FFI) — механизм вызова функций из других языков, особенно C. Этот раздел научит вас интегрировать C-код в Rust-проекты, обрабатывать указатели, строки и структуры, а также избегать типичных ошибок.

4.1. Основы FFI: вызов функций из C

FFI в Rust реализуется через ключевое слово extern. Для вызова функции из C-библиотеки:

  1. Объявите функцию в блоке extern "C" с сигнатурой, соответствующей C-коду.
  2. Укажите имя библиотеки через атрибут #[link].

Пример: вызов функции getpid из libc

  • #[link(name = "c")] подключает стандартную C-библиотеку.
  • unsafe обязателен: компилятор Rust не может гарантировать безопасность внешнего кода.

4.2. Работа с типами данных

C и Rust используют разные представления типов. Для корректной интеграции:

  • Используйте типы из модуля std::os::raw (например, c_int, c_char).
  • Для структур применяйте #[repr(C)], чтобы выравнивание совпадало с C.

Пример: работа с struct timeval

4.3. Строки и буферы

В C строки представлены как *const c_char. Для конвертации используйте CString и CStr:

4.4. Обработка ошибок

C-функции часто возвращают коды ошибок. Оберните их в Result для удобства:

4.5. Использование bindgen для автоматизации

Утилита bindgen генерирует Rust-обертки на основе C-заголовков. Пример build.rs:

В wrapper.h укажите заголовки C-библиотеки. Сгенерированный код будет содержать все функции и структуры.

4.6. Опасности FFI

  • Утечки памяти : Если C-функция выделяет память, её нужно освобождать через соответствующий вызов (например, libc::free).
  • Несовместимость типов : Ошибка в определении структуры может привести к неопределенному поведению.
  • Гонки данных : При многопоточном доступе к C-коду Rust не гарантирует безопасность.

Пример уязвимости :

4.7. Практический пример: интеграция с OpenSSL

Создадим обертку для хэширования через OpenSSL:

Здесь используется безопасная обертка openssl-sys, но под капотом она вызывает C-функции через FFI.

Итоги раздела

FFI позволяет использовать мощь C-библиотек в Rust, но требует осторожности. Помните:

  • Всегда проверяйте размеры буферов и корректность типов.
  • Освобождайте ресурсы, выделенные в C.
  • Используйте bindgen для автоматизации, но проверяйте сгенерированный код.

В следующих главах мы применим эти знания для создания сетевых снифферов и эксплойтов, интегрируя низкоуровневые функции в безопасный код Rust.

Хакинг на языке программирования Rust

На этом все. Всем хорошего дня!

Цикл статей по курсу — «Хакинг на Rust».