Секреты покорения эльфов



         

Имплантация чужеродного кода в ELF-файл - часть 2


А вот разработчики Линуха переложили подсчет контрольной суммы на устройства ввода/вывода, которые ее действительно считают. Конечно, это не страхует от искажений. В частности, жесткие диски контролируют только физические дефекты, но не обращают внимания на логические искажения (типа вируса). Тем не менее, особого смысла в контрольной сумме, хранящейся непосредственно в самой файле, все равно нет. Если вирус может модифицировать файл, он модифицирует и контрольную сумму. По науке, контрольные суммы нужно хранить в отдельном "защищенном хранилище" и их подсчетом должна заниматься файловая система или антивирусные ревизоры. Ни того, ни другого в мире Линуха не наблюдается. То есть, они как бы есть, но ни у кого реально не установлены.

Единственную проблему представляют протекторы и упаковщики исполняемых файлов, контролирующее собственную целостность. С каждым годом их становится все больше и больше. UPX, протектор от shiv'ы… В них на первых порах лучше не внедряться!

Рисунок 7 модификация исполняемого файла в редакторе hte, измененные байты выделяются красным цветом

Но мы отвлеклись. Выходим из hex-редактора, нажав <F10> (где мой привычный выход по Escape?!), и запускаем пропатченный файл. Он запускается, подтверждая свою работоспособность. Значит, модификация прошла успешно! (Ну еще бы! Под моим чутким руководством!)

Рисунок 8 результат работы модифицированного файла после перестановки пары команд местами — полет нормальный

А теперь займется более серьезными вещами, попытавшись внедрить в программу реальный код, который делает что-то полезное. Сразу возникает вопрос: куда мы будет внедряться? Между сегментами свободного места нет, между секциями тоже. Можно (теоретически) расширить последний сегмент и внедрится сюда, но во-первых, это будет слишком заметно, а во-вторых, слишком муторно и утомительно.

Но все не так плохо, как кажется! По умолчанию gcc выравнивает стартовые адреса функций по границе 10h, а это, значит, что даже наш демонстрационный файл содержит просто кучу свободного пространства. В среднем 10h/2h = 8h байт на каждую функцию, включая служебные. Сюда и мамонта упрятать можно, если, конечно, его предварительно расчленить. Вот, смотрите, сами:




Содержание  Назад  Вперед