Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #91, ИЮЛЬ 2006 г.

Мастерская бравого хакера

Крис Касперски

Хакер, номер #091, стр. 091-116-3


Исключение составляют листинги, содержащие в себе строку «This file is part of the Metasploit Framework» и являющиеся модулями Framework'а, без которого они, естественно, не запускаются. Присутствие такой строки необязательно, но сама структура модуля настолько характерна, что, увидев такую штуку один-единственный раз, будешь распознавать ее всегда. Например: milw0rm.com/exploits/1788.

С диалектами Си/Си++ все намного сложнее. Компиляторов просто море, а разногласиями в понимании Стандарта можно было бы утопить целый океан, поэтому очень часто случается так, что программу, написанную под один компилятор, не удается (без переделок) откомпилировать ничем другим. Последняя версия компилятора далеко не всегда оказывается самой лучшей. В особенности это касается gcc, в ядро которого вносится большое количество изменений, зачастую не без ущерба для скорости и обратной совместимости.

Первым делом необходимо определить: приплюснутый это Си или классический? Вот характерные черты приплюснутого:

* объявление переменных по месту использования, а не в начале функции

* наличие таких ключевых слов, как «класс» и двух двоеточий «::»

* использование new для выделения памяти или явное преобразование типа перед malloc()

* отсутствует printf, а весь ввод/вывод осуществляется операторами «<<» и «>>»

Если хоть одно из этих условий выполняется, то программа явно написана на приплюснутом Си, в противном случае используется классический. Кстати говоря, Си/Си++ отличается от perl/python своими директивами «#include» и еще тем, что символ «#» в нем никогда не используется для оформления комментариев.

В отличие от интерпретируемых языков, библиотеки которых более или менее стандартизированы, Си-компиляторы включают в себя большое количество системно-зависимых библиотек, в результате чего программа может вызывать функции, отсутствующие в нашем трансляторе или использовать специфические особенности конкретной версии языка. В первую очередь, это касается сырых сокетов (по-разному реализованных в Linux и *BSD) и прочих системно-зависимых фич. Некоторые exploit'ы пишутся в расчете на Windows и вместо «общепринятых» функций типа fopen()/fclose() используют громоздкие API-вызовы CreateFile/CloseHandle. Откомпилировать такой exploit можно и под *nix'ом, но для этого придется заменять API-вызовы на соответствующие им Си-функции или syscall'ы. Самое неприятное состоит в том, что у Microsoft имеется свой собственный, особый взгляд на интерфейс сокетов, и для переноса Windows-кода, работающего с сокетами, под *nix приходится искать альтернативный *nix-exploit. Формальным признаком форточной природы кода является наличие функции WSAStartup, которая в *nix-подобных системах и не ночевала. Но классический Си — это только цветочки. Самое страшное, как всегда, впереди.

Назад на стр. 091-116-2  Содержание  Вперед на стр. 091-116-4