12.09.2011

Исправление уязвимостей

image

В данной статье автор объясняет, как исправить уязвимости программного обеспечения.

Автор: Celil ÜNÜVER
celilunuver[n0sp4m]gmail.com
http://tcc.hellcode.net/musashi

Вступление

Уязвимости, которые публикуются ежедневно в Bugtraq, иногда могут оказаться в программном обеспечении, которым мы ежедневно пользуемся. Даже самое известное программное обеспечение подвержено уязвимостям. Просматривая Bugtraq, вы можете встретить рекомендации по безопасности даже для продуктов крупных поставщиков.

В последнее время были широко распространены веб-уязвимости, однако, программные уязвимости, такие как переполнение буфера, по-прежнему остаются самыми опасными. Кроме того, они становятся причиной профессиональных атак. По сути, эти опасные ошибки программирования появляются в результате халатности самих программистов.

В этой статье я объясню, как исправить уязвимости программного обеспечения.

Исправление

Данная технология также известна как "HotPatching" или "runtime patching ". Исправление является методом модификации двоичного кода программного обеспечения с помощью дизассемблера, отладчика, HEX-редактора и т.д.

Это очень распространенный прием для обратной разработки. Его можно использовать для перехвата API, взлома, вставки кода и т.д. Но в моей статье, я объясню, как использовать эту технику, чтобы закрыть дыры в безопасности.

Инструментарий

Для нашей работы пригодится программное обеспечение, которое хорошо известно и используется всеми реверсивными проектировщиками (отладчиками, дизассемблерами и т.д.). Но задачу может упростить дизассемблер /отладчик, который имеет встроенные функции для редактирования ассемблера и бинарного кода, такой как IDA Pro, Ollydbg.

К сожалению, встроенные функции для редактирования ассемблера и бинарного кода в IDA или Ollydbg доступны только для "x86" исполняемых модулей. Например, если вы хотите исправить исполняемый код ARM или Xbox, вы должны посмотреть на код операции (инструкция кодирования) в информации о процессоре.

Практика

Выполним ''hotpatching'' для программы, которую я расположил ниже. Как видите, она имеет уязвимость переполнения буфера. А теперь скомпилируем ее и забудем исходный код, теперь это наше программное обеспечение с закрытым исходным кодом…

#include
int main()
{
char buf[16];
printf("\nString giriniz:");
scanf("%s", &buf);
return 0;
}

Как видите в исходном коде и коде сборки, scanf не проверяет размер строки. (% s)

Очевидно вы знаете, что проверить размер строк могут такие функции, как scanf и sprintf. Просто нам нужно поставить целые числа перед форматируемым значением. (e.g% 15s или %0,15 s)

Попробуем решить эту проблему. Для исправления я предпочитаю использовать Ollydbg. Он удобен для этого. IDA я использую только для анализа.

Откроем уязвимую программу через OllyDbg;

Как вы видите в дизассемблере, оно вызывает "00403011" смещение для перемещения строки в буфер.

Через CTRL + G комбинацию попадем на "00403011" адрес.

Думаю, из картинок вам все стало ясно:] Так что теперь мы будем модифицировать следующую строку --> "AND EAX, 694D0073".

Записываем "and eax, 733531" вместо кода "and eax, 694D0073" (а вы знаете, что коды 313573 являются шестнадцатеричными типами кодов "% 15s"и мы записали его, согласно принципу Last In First Out!)

Ну, вот и все! Мы с легкостью исправили уязвимую часть нашего программного обеспечения. Для сохранения исправлений, щелкните правой кнопкой на исправленной строке и выберите "Копировать в исполняемый модуль>Выбор ". Откроется новое окно, а при закрытии будет предложено сохранить изменения или не сохранять их. После сохранения вы можете попытаться переполнить ее :)

Давайте посмотрим на нашу исправленную программу через IDA PRO;

Заключение

Я надеюсь, что данная статья будет полезна для понимания принципа исправления. О другом трюке с исправлениями я планирую написать в моей следующей статье.

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

Я хотел бы поблагодарить моего брата, мою девушку, мою семью и моих друзей [murderkey, AhmetBSD ака L4M3R, Боб ((ulaş), kurti ]

Ссылки:

  • http://tcc.hellcode.net
  • http://hellcoderesearch.wordpress.com
comments powered by Disqus