Оглавление

Оглавление

Глава 1

Программное обеспечение — источник всех проблем 23

Глава 2

Шаблоны атак 47

Глава 3

Восстановление исходного кода и структуры программы 77

Глава 4

Взлом серверных приложений 137

Глава 5

Взлом клиентских программ 181

Глава 6

Подготовка вредоносных данных 209

Глава 7

Переполнение буфера 247

Глава 8

Наборы средств для взлома 325

 

 

Содержание

Предисловие 14

Введение 16

О чем эта книга 16

Как пользоваться этой книгой 18

Не слишком ли опасна эта информация? 18

Благодарности 20

Благодарности Грега 20

Благодарности Гари 20

Глава 1. Программное обеспечение — источник всех проблем 23

Краткая история программного обеспечения 24

Ошибки в программах есть всегда 31

Три основные проблемы 34

Что такое безопасность программного обеспечения? 43

Резюме 44

Глава 2. Шаблоны атак 47

Классификация терминов 48

Оценка открытости системы 51

Ознакомление с технологией взлома 57

Схемы атак, или планы злоумышленника 63

Пример атаки: взломанный компилятор C++ от компании Microsoft 65

Обозначения шаблонов атак 75

Резюме 76

Глава 3. Восстановление исходного кода и структуры программы 77

Внутри программы 78

Средства для восстановления исходного кода 82

Методы для восстановления исходного кода 83

Методы исследования 88

Создание дополнительных модулей для IDA 94

Декомпиляция и дизассемблирование программного обеспечения 103

Декомпиляция на практике: восстановление исходного кода helpctr.exe 104

Автоматизированный глобальный аудит для выявления уязвимых мест 110

Создание собственных средств взлома 117

Создание базового средства для охвата кода 131

Резюме 135

Глава 4. Взлом серверных приложений 137

Доверие к входным данным 138

Расширение привилегий 140

Доверие на уровне привилегий процесса 141

Кому нужны права администратора? 141

Привилегированные процессы, которые выполняют чтение данных из

непроверенных источников 142

Процессы, использующие привилегированные компоненты 143

Поиск точек входа 143

Поиск файлов для входных данных 144

Трассировка входных данных 145 Использование GDB и IDA-Pro по отношению к двоичному файлу

SOLARIS/Sparc-программы 145

Подключение к запущенному процессу 146

Использование программы Truss для моделирования исследуемого

процесса на платформе Solaris 148

Использование доверительных отношений, созданных при настройке

среды исполнения 149

Поиск непосредственно исполняемых файлов 150

Сведения о текущем рабочем каталоге 150

Что делать, если Web-сервер не выполняет CGI-программы? 151

А как насчет неисполняемых файлов? 152

Использование правил политики 153

Конкретные методы атак на серверные приложения 154

Внедрение команд для командного интерпретатора 154

Использование хакером каналов, портов и прав доступа 166

Использование свойств файловой системы 168

Использование переменных среды 172

Использование внешних переменных 173

Использование недостатков при аутентификации сеанса 175

Подбор идентификаторов сеанса 176

Альтернативные варианты аутентификации 179

Вызов ошибки для проверки надежности кода обработки ошибки 180

Резюме 180

Глава 5. Взлом клиентских программ 181

Клиентские программы в качестве цели атаки 181

Сервер управляет клиентом 182

Ловушка для хакера 183

Служебные сигналы 184

Старая (но актуальная) история 184

Основные способы использования служебных символов 186

Управление принтерами 187

Управляющий код для систем Linux 188

Проблема возврата 189

Использование переносимых сценариев 190

Использование атаки с возвратом для доверенных сайтов 191

Клиентские сценарии и вредоносный код 195

Поиск уязвимых локальных вызовов 196

Web-браузеры и технология ActiveX 200

Внесение данных в сообщения электронной почты 202

Атаки с помощью вредоносного содержимого 204

Контратака: переполнение буфера на стороне клиента 206

Резюме 207

Глава 6. Подготовка вредоносных данных 209

Дилемма защитника 211

Фильтры 212

Взаимодействующие системы 212

Обнаружение вторжений 213

Различные типы систем обнаружения взлома 213

Внесение обновлений для систем обнаружения вторжений 215

Эффект альтернативного кодирования для систем IDS 215

Исследование по частям 217

Вернемся к Windows-программе APISPY 218

Поиск ключевых мест в коде 219

Трассировка 219

Обратная трассировка из уязвимого места 220

Тупиковые пути 222

Трассировка во время выполнения программы 223

Быстрые остановы 225

Отслеживание данных в буфере 226

"Ход конем" 227

Точки останова для страниц памяти 227

Поиск по шаблону 228

Восстановление кода анализатора 228

Преобразование символов 229

Байтовые операции 229

Операции для работы с указателями 230

Символы завершения строки NULL 231

Восстановление исходного кода сервера I-Planet 6.0 232

Ошибки при классификации 236

Создание эквивалентных запросов 237

Исследование на уровне функций API 237

Посторонние символы 238

Эквивалентные метасимволы 240

Управляющие метасимволы 240

Преобразование символов 242

Скомбинированные атаки 244

Искажение данных в файлах журналов 245

Резюме 245

Глава 7. Переполнение буфера 247

Переполнение буфера 247

Переполнение буфера в стеке для забавы и с пользой 249

Искажение данных в памяти 249

Вектор вторжения 250

Где заканчивается вектор вторжения и начинается полезная нагрузка? 252

Выбор нужного адреса 252

"Верхние" и "нижние" адреса памяти 252

Прямой и обратный порядок байтов 253

Использование регистров 254

Использование существующего кода или блоков данных в памяти 255

Переполнение буфера и встроенные системы 255

Встроенные системы, используемые в военной и коммерческой сферах 256

Переполнения буфера в системах управления базами данных 258

Хранимые процедуры 258

Программы с интерфейсом командной строки 259

Клиентские программы базы данных 259

Переполнение буфера и Java 259

Совместное использование Java и С/С++ 260

Хранимые процедуры и библиотеки DLL 261

Переполнения буфера в результате обработки содержимого файлов 261

Атаки на переполнение буфера с помощью механизмов фильтрации

и аудита транзакций 264

Переполнение буфера с помощью переменных среды 264

Проблема множественных операций 266

Поиск возможностей для осуществления переполнения буфера 266

Сокрытие ошибки при обработке исключений 267

Использование дизассемблера 267

Переполнение буфера в стеке 268

Буферы фиксированного размера 268

Функции, для которых не требуется наличие завершающего символа NULL 270

Проблема завершающего символа NULL 271

Перезапись фреймов обработчика исключений 274

Арифметические ошибки при управлении памятью 275

Отрицательные числа как большие положительные числа 275

Несоответствие между знаковыми и беззнаковыми значениями 277

Значения со знаком и управление памятью 280

Уязвимые места, связанные со строкой форматирования 283

Вывод данных из любой области памяти 284

Спецификатор формата %п 285

Спецификатор формата %00и 286

Выявление проблемы в коде 287

Переполнение буфера в куче 288

Функция malloc и куча 290

Переполнения буфера и программы на С++ 291

Таблицы vtable 291

Вредоносные данные 292

Сведения о размещении в памяти 293

Размер полезной нагрузки 294

Использование жестко закодированных вызовов функций 294

Использование динамических таблиц переходов 295

Определение раздела данных 296

Защита с помощью XOR 296

Использование контрольных сумм 297

Полезная нагрузка для архитектуры RISC 298

Отложенная передача управления 298

Полезная нагрузка для архитектуры MIPS 298

MIPS-команды 298

Определение положения в памяти 299

Как избежать нулевых байтов в машинном коде MIPS 300

Системные вызовы на платформе MIPS 301

Структура полезной нагрузки для платформы SPARC 301

Окно регистров для платформы SPARC 301

Использование стека на платформе SPARC 303

Поиск вызовов функций на платформе SPARC 305

Структура полезной нагрузки на платформе PA-RISC 305

Использование стека на компьютерах PA-RISC 306

Переполнение буфера на платформе HP/UX PA-RISC 308

Операции ветвления на платформе PA-RISC 308

"Трамплины" между областями памяти 309

Информация о положении в памяти 310

Саморасшифровывающаяся полезная нагрузка для платформы HP/UX 312

Структура полезной нагрузки для платформы AIX/PowerPC 313

Определение положения в памяти 314

Защита для кода командного интерпретатора PowerPC 314

Удаление символов NULL 315

Полезная нагрузка для нескольких платформ 316

Кроссплатформенные команды пор 317

Код пролога и эпилога для защиты функций 318

Устранение защиты с помощью сигнальных значений 318

Успешная атака на неисполняемые стеки 321

Резюме 322

Глава 8. Наборы средств для взлома 325

Вредоносные программы 326

Что такое набор средств для взлома 326

Что такое набор средств для взлома на уровне ядра 326

Набор средств для взлома на уровне ядра и область надежного кода 327

Простой набор средств для взлома на уровне ядра Windows XP 327

Создание набора средств для взлома 327

Контролируемая среда разработки 328

Исходные файлы набора средств для взлома 328

Инструменты разработки 328

Драйверы с доступом на уровне ядра 328

Основная структура драйвера 329

Когда программы используют драйвер 330

Возможность выгрузки драйвера 330

Регистрация драйвера 332

Использование функции SystemLoadAndCallImage 333

Перехват вызовов 335

Сокрытие процесса 336

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

Схема перехвата вызова 337

Удаление записи о процессе 337

Альтернативное внедрение процесса 340

Перенаправление данных с помощью "троянских" программ 340

Перенаправление и недостатки Tripwire 340

Драйвер для перенаправления 341

Сокрытие файлов и каталогов 344

Исправление двоичного кода 346

"Замочная скважина" в программе 347 Установка заплат в ядро Windows NT для блокировки всей системы защиты 348

Аппаратный вирус 357

Операции чтения и записи для энергонезависимой памяти 358

Операции чтения и записи для памяти, встроенной в важнейшие устройства 359

Вирус CIH 364

Память EEPROM и синхронизация 366

Память EEPROM на сетевых адаптерах Ethernet 367

Последовательная или параллельная память EEPROM 369

Как сгорают аппаратные средства 370

Производители 370

Обнаружение устройств с помощью спецификации CFI 371

Определение устройств с помощью режима ID или JEDEC ID 372

Низкоуровневый доступ к диску 373

Операции чтения/записи для главной загрузочной записи (MBR) 373

Искажение данных в образах компакт-дисков 374

Добавление к драйверу возможности доступа по сети 374

Использование библиотеки NDIS 374

Перевод интерфейса в неразборчивый режим 376

Обнаружение нужного сетевого адаптера 377

Использование тегов boron для обеспечения безопасности хакера 380

Добавление интерактивного командного интерпретатора 380

Прерывания 381

Архитектура запросов на прерывание 381

Перехват прерываний 383

Загадка программируемого контроллера прерываний 383

Регистрация нажатий клавиш 384

Программа регистрации нажатий клавиш в Linux-системе 385

Программа регистрации нажатий клавиш для Windows NT/2000/XP 385

Контроллер клавиатуры 386

Усовершенствованные возможности наборов средств для взлома 386

Использование набора средств для взлома в качестве отладчика 386

Отключение защиты системных файлов Windows 387

Непосредственная запись данных в физическую память 387

Переполнение буфера в ядре 387

"Заражение" образа ядра 388

Перенаправление исполнения 388

Обнаружение наборов средств для взлома 388

Резюме 388

Предметный указатель 390

Грег Хогланд, Гари Мак-Гроу "Взлом программного обеспечения (анализ и использование кода)" 2005 г.