Оглавление
Глава 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 г.