Чем занимается «белый хакер»? 10 вопросов о специалистах по поиску уязвимостей
Содержание:
INTERCAL
В фильме «Говорящие с ветром» с Николосом Кейджем американские морские пехотинцы используют переводчиков с языка навахо для передачи секретных сообщений, потому что на этом языке можно только говорить – у него нет письменной формы. То же и с INTERCAL – правда, с точностью до наоборот.
Этот комичный язык – сплошная мистика. Он создавался как насмешка над небезызвестными FORTRAN и COBOL (да, язык достаточно древний). Руководство к языку содержало в себе раздел «Миндалина». Как пояснялось в ссылке к разделу, все мануалы содержат раздел «Приложения» (по-английски «аппендикс»), поэтому создатели приняли решение включить в свою документацию какую-нибудь другую удаляемую часть человеческого тела – скажем, миндалины.
В языке используются модификаторы типа «ПОЖАЛУЙСТА». Если в программе он используется не достаточно часто, она не принимается компилятором как «недостаточно вежливая». Если же наоборот он появляется слишком часто, компилятор отвергает её как «чересчур вежливую». Но самое печальное в этой истории то, что, несмотря на наличие оценки вежливости, эта особенность не была нигде документирована.
INTERCAL, в соответствии с критерием Тьюринга, достаточен для того, чтобы быть практически используемым языком программирования. Это значит, что, в принципе, язык работает, но если вам когда-нибудь придет в голову что-нибудь на нем написать, советую сразу обратиться к психиатру. Если окажется, что с рассудком у вас всё в порядке, приготовьтесь потратить на программирование кучу времени. Знаменитое решето Эратосфена, часто используемое в качестве «контрольной» задачи, было запущено на рабочей станции SPARCStation-1 фирмы SUN. Выполненная на языке C, эта программа завершилась менее чем за полсекунды. У программы на INTERCAL на получение результата ушло 17 часов.
Копии виртуальных таблиц
Окей, для успешной работы, понятное дело, вполне достаточно и одной виртуальной таблицы, однако на практике приходится сталкиваться с тем, что исследуемый файл прямо-таки кишит копиями этих виртуальных таблиц. Что же это за напасть такая, откуда она берется и как с ней бороться?
Если программа состоит из нескольких файлов, компилируемых в самостоятельные obj-модули (а такой подход используется практически во всех мало-мальски серьезных проектах), компилятор, очевидно, должен поместить в каждый obj свою собственную виртуальную таблицу для каждого используемого модулем класса. В самом деле, откуда компилятору знать о существовании других obj и наличии в них виртуальных таблиц?
Вот так и возникают никому не нужные дубли, отъедающие память и затрудняющие анализ. Правда, на этапе компоновки линкер может обнаружить копии и удалить их, да и сами компиляторы используют различные эвристические приемы для повышения эффективности генерируемого кода. Наибольшую популярность завоевал следующий алгоритм: виртуальная таблица помещается в тот модуль, в котором содержится реализация первой невстроенной невиртуальной функции класса.
Обычно каждый класс реализуется в одном модуле, и в большинстве случаев такая эвристика срабатывает. Хуже, если класс состоит из одних виртуальных или встраиваемых функций. В этом случае компилятор «ложится» и начинает запихивать виртуальные таблицы во все модули, где этот класс используется. Последняя надежда на удаление «мусорных» копий — линкер, но и он не панацея. Собственно, эти проблемы должны больше заботить разработчиков программы (если их волнует, сколько памяти занимает программа), для анализа лишние копии всего лишь досадная помеха, но отнюдь не непреодолимое препятствие!
Описание
Hack свободно взаимодействует с PHP, что очень удобно для веб-разработки и вставок в HTML: большинство (хоть и не все) обычных скриптов PHP будут работать и в Hack.
Hack расширяет контроль типов (type hinting), представленный в PHP 5, с помощью статистических типов, добавления возможности использования контроля типов с иными типами (например, с int и string).
Также были внедрены следующие фичи из современных языков программирования: асинхронное программирование, обобщенное программирование, псевдонимы типов, обнуляемые типы и ограничения на параметры типов, коллекции, лямбда-выражения, а также проверка возвращаемых типов и типов параметров во время выполнения.
Типы проверяются специальным сервером (сервисом, демоном), который следит за изменением файлов исходного кода на диске.
Проверщик типов
В Hack встроенный автоматический проверщик типов (typechecker). Он статически анализирует программу и выдает возможные ошибки, при которых бы скрипт не сработал бы при запуске. Typechecker не является компилятором: он только анализирует код в реальном режиме и дает отзывы о нем.
Например, без typechecker’а следующий код бы провалился при запуске:
<?php namespace Hack\UserDocumentation\TypeChecker\Intro\Examples\RuntimeFail; class A { public function foo() { return 2; } } function failing($x) { $a = new A(); if ($x === 4) { $a = null; } // $a being null would only be caught at runtime // Fatal error: Uncaught exception 'BadMethodCallException' with message // 'Call to a member function foo() on a non-object (NULL)' $a->foo(); } failing(4);
Вывод:
Fatal error: Uncaught exception 'BadMethodCallException' with message 'Call to a member function foo() on a non-object (null)' in /data/users/joelm/user-documentation/guides/hack/25-typechecker/01-introduction-examples/runtime-fail.php:17 Stack trace: #0 /data/users/joelm/user-documentation/guides/hack/25-typechecker/01-introduction-examples/runtime-fail.php(20): Hack\UserDocumentation \TypeChecker\Intro\Examples\RuntimeFail\failing() #1 {main}
Следующий же код отловит ошибку еще до запуска, сохраняя пользователю время и работу над фатальными ошибками:
<?hh namespace Hack\UserDocumentation\TypeChecker\Intro\Examples\TypecheckerCatch; class A { public function foo() { return 2; } } function failing($x) { $a = new A(); if ($x === 4) { $a = null; } // $a being null would only be caught BEFORE runtime // typechecker-catch.php:21:7,9: You are trying to access the member foo // but this object can be null. (Typing) // typechecker-catch.php:12:10,13: This is what makes me believe it can be // null // $a->foo(); } failing(4);
Вывод:
Fatal error: Uncaught exception 'BadMethodCallException' with message 'Call to a member function foo() on a non-object (null)' in /data/users/joelm/user-documentation/guides/hack/25-typechecker/01-introduction-examples/typechecker-catch.php.type-errors:20 Stack trace: #0 /data/users/joelm/user-documentation/guides/hack/25-typechecker/01-introduction-examples/typechecker-catch.php.type-errors(23): Hack\UserDocumentation\TypeChecker\Intro\Examples\TypecheckerCatch\failing() #1 {main}
Why should you learn how to program?
- Hackers are the problem solver and tool builders, learning how to program will help you implement solutions to problems. It also differentiates you from script kiddies.
- Writing programs as a hacker will help you to automate many tasks which would usually take lots of time to complete.
- Writing programs can also help you identify and exploit programming errors in applications that you will be targeting.
- You don’t have to reinvent the wheel all the time, and there are a number of open source programs that are readily usable. You can customize the already existing applications and add your methods to suit your needs.
Кто такие «white hat» и «black hat»?
Белых хакеров часто называют white hats (белые шляпы), а хакеров-злоумышленников — black hats (чёрные шляпы). Такие наименования появились из-за вестернов, где хорошие ребята носили белые шляпы, а плохие — чёрные.
Основная мотивация белых шляп — развитие своих навыков и использование их во благо компаний, на которые они работают. Основная мотивация чёрных шляп — получение выгоды несмотря ни на что.
Кроме белых и чёрных, часто встречаются gray hats — серые шляпы. Такие хакеры обычно не имеют преступных намерений при взломе, но могут взламывать продукты компаний, которые не публиковали запрос на проверку, а если им в руки попадутся данные, которые можно продать, могут воспользоваться этой возможностью.
3
VRML: Virtual Reality Modeling Language
Дословно переводится как «язык моделирования виртуальной реальности» (читается «вермал»). Разработанный SGI, VRML был призван принести в Интернет через телефонную линию невиданную ранее трехмерную среду – графический эквивалент Nintendo 64. Обещание было столь революционным, что NASA одобрила и приняла этот язык. В связи с этим он и не ушел в широкие массы. Вообще, если задуматься, это была хорошая идея – не дать VRML подняться. Кто знает, пережили ли бы мы еще одну ловушку для армии ламеров, активизирующих миллионы халявных компакт-дисков, которые в 1997 году были выкачаны через Интернет.
В отличие от некоторых языков из нашего списка, VMRL привлек достаточно большую аудиторию и по сей день имеет потенциал для ее расширения. На пике своей популярности в 1997 году VMRL использовался в домашних страничках и на некоторых 3D-сайтах вроде «CyberTown». Что убило VRML, так это тот факт, что SGI реструктурировал подразделение, занимавшееся этими разработками, и продал его компании Computer Associates, которая не стала им заниматься.
В настоящее время VRML используется в образовательном процессе, исследованиях и прочих областях, где особенно ценится высокая детализация. Но в целом, VRML – это еще один пример отличной продукции, которую на пике популярности не продвинули и не распространили должным образом.
#1 Web Hacking
When the hacker has the intention to hack websites and applications, he/she learns the web coding like HTML, CSS, and Javascript as the majority of websites are built by using these languages. It allows a hacker to get a firm hold on the coding of the website or application.
HTML
HTML
It is a markup language used widely for describing web pages. HTML stands for Hypertext Markup Language. By learning HTML, a hacker is able to understand web actions, response etc.
Javascript
Javascript
It is the programming language of HTML and the Web. It is used widely in websites for a preferable interface and quick response. By learning Javascript, a hacker can understand the client-side mechanism which is necessary for finding client-side flaws.
PHP
PHP
It is a server-side scripting language used in web development and is also used as a general-purpose programming language. It manages web apps and database. It almost controls everything on site and server.
SQL
SQL
SQL stands for Structured Query Language is a special-purpose programming language used for managing data held in a relational database management system . It is behind for managing sensitive information like user credentials, bank details, user details etc. To steal the sensitive details, hackers eyes to attack SQL of a website.
Идентификация чисто виртуальных функций
Если функция объявляется в базовом, а реализуется в производном классе, она называется чисто виртуальной функцией, а класс, содержащий хотя бы одну такую функцию, — абстрактным классом. Язык C++ запрещает создание экземпляров абстрактного класса, да и как они могут создаваться, если по крайней мере одна из функций класса не определена?
В стародавние времена компилятор в виртуальной таблице замещал вызов чисто виртуальной функции указателем на библиотечную функцию purecall, потому что на стадии компиляции программы он не мог гарантированно отловить все попытки вызова чисто виртуальных функций. И если такой вызов происходил, управление получала заранее подставленная сюда purecall, которая «ругалась» на запрет вызова чисто виртуальных функций и завершала работу приложения.
Однако в современных реалиях дело обстоит иначе. Компилятор отлавливает вызовы чисто виртуальных функций и банит их во время компиляции. Таким образом, он даже не создает таблицы виртуальных методов для абстрактных классов.
Реализация вызова виртуальных функций
В этом нам поможет убедиться следующий пример (листинг примера PureCall):
Результат его компиляции в общем случае должен выглядеть так:
Чтобы узнать, какой метод вызывается инструкцией , надо сначала перейти в таблицу виртуальных методов класса (нажав Enter):
а отсюда уже в сам метод:
В дизассемблерном листинге для x86 IDA сразу подставляет правильное имя вызываемого метода:
Это мы выяснили. И никакого намека на purecall.
Хочу также обратить твое внимание на следующую деталь. Старые компиляторы вставляли код проверки и обработки ошибок выделения памяти непосредственно после операции выделения памяти, тогда как современные компиляторы перенесли эту заботу внутрь оператора :. После пролога функции командой выполняется безусловный переход на код для выделения памяти:
Проверяем результат операции:. Если выделение памяти провалилось, переходим на метку , где еще раз пытаемся зарезервировать память:
После пролога функции командой выполняется безусловный переход на код для выделения памяти: . Проверяем результат операции: . Если выделение памяти провалилось, переходим на метку , где еще раз пытаемся зарезервировать память:
Если эта попытка тоже проваливается, нам ничего не остается, как перейти по метке , обработать ошибки и вывести соответствующее ругательство.