ПИШЕМ БАЖНУЮ CGI`ШКУ НА C

Спецвыпуск Xakep, номер #022, стр. 022-026-1


типичные дырки сиевых cgi

DarkSergeant (DarkSergeant@inbox.ru)

Тебе, наверное, интересно, почему всякие там кул хацкеры используют C/С++, вместо того чтобы выучить и заюзать рульный скрипт - Perl, Bash, PHP, VBS (нужное подчеркнуть). Отвечаю:

1. Скорость. В отличие от скриптов, язык C/C++ - компилируемый, поэтому код получается быстрее, также язык C/C++ более низкоуровневый, поэтому на нем проще избежать накладных расходов.

2. Надежность. Даже если хакер получит доступ на чтение к папкам, на которых лежат исполняемые CGI-файлы, то его постигнет разочарования, т.к. он не найдет исходного кода твоей CGI-шки, т.к. C-шных исходник ты хранишь в банке под надежным замком, а на сервере лежит только скомпилированная программа. И хакер будет долго разбираться в дизассемблере, чтобы понять, есть в твоей программе баги или нет. Также C, а особенно C++, является строго типизированным языком, поэтому о многих ошибках тебе компилятор скажет еще на этапе компиляции.

3. Мощность. Для С/C++ намного проще найти или написать нестандартные вещи, начиная от генерации картинок и музыки при заходе пользователя до управления свистком чайника. Также современные компиляторы C++ намного опережают по богатству возможностей обычные скрипты.

4. Время/опыт. Лучше потратить время на углубление своих знаний и повышения опыта по использованию C/C++, чем потратить свое время на изучение очередного скрипта. Так знание C/C++ поможет тебе написать сниффер, keygen, троян, вирус (список можно продолжать до бесконечности), а зная только скрипты, ты будешь привязан к узкому кругу задач.

C++ РУЛИТ

Скажу тебе по секрету, что все продвинутые хакеры уже давно вместо С используют C++ из-за его мощности и удобства.

В C++ очень легко избежать или свести к минимуму все вышеприведенные ошибки.

Так вместо страшно неудобных и очень бажных строк char *, а значит, соответственно, и использования функций strcat, strcpy, можно использовать класс строк - std::string. Вместо опасного printf/scanf/gets можно использовать std::stream и operator >>/<<. А обычные C`шные массивы можно заменит на std::vector, std::list, std::map.

Также не секрет, что многие ошибки в программах связаны с тем, что программеру было просто лень писать более сложный код и он ограничивается самым простым (но и, к сожалению, самым бажным) вариантом.

Но и здесь C++ облегчает жизнь программисту, т.к. в язык уже включена большая и безопасная библиотека STL, с помощью которой многие сложные вещи, занимающие на C несколько экранов, пишутся на C++ в несколько строчек. Также использование С++ упрощает повторное использование кода, что позволяет один раз написать свою небольшую библиотечку, а потом ее использовать во всех своих программах.

Если тебя еще не убедили вышеприведенные аргументы, то вот тебе еще один. Плюсы поддерживают конструкцию try/catch, при ее аккуратном применении можно забыть о таких сообщениях, как "core dumped", "access violation", "division by zero" и т.д.

А сейчас давай посмотрим, какие ошибки можно поиметь при написании CGI-шек на C/C++ (мы ведь с тобой кул хацкеры и не пишем CGI-шки на всяких там скриптах). Сразу тебя обрадую, на C (в дальнейшем, говоря C, я подразумеваю C/C++) нет этих дурацких ошибок с нулевым символом, а также с выполнением программ во время простейшего открытия файла. Но в C нас с тобой поджидают не менее опасные ошибки: переполнение буфера, ошибка форматной строки и др. Ошибки я буду показывать на примере обычных консольных программ (это программы, которые работают в текстовом режиме), т.к. CGI-шка как раз и является обычной консольной программой.

Содержание  Вперед на стр. 022-026-2