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

Суперкомпьютер своими руками: Сложные вычисления с баснословной производительностью

Андрей Комаров / komarov@itdefence.ru /




Некоторое время назад Сеть начала просто кишеть заметками о параллельных вычислениях на видеокарте. Своего рода сенсация: вычислительных мощностей современных видеокарт, которые приобретает каждый любитель поиграть, оказывается вполне достаточно, чтобы организовать сложнейшие вычисления, рендеринг изображений, реализовать навороченные технологии вроде Ray Tracing и даже взломать алгоритмы шифрования.

Февраль научил меня жить, январь научил меня ждать!

Еще в начале февраля 2007 года на всеобщее обозрение был представлен первый готовый комплект инструментов для доступа к инструкциям графического ускорителя. CUDA Toolkit/CUDA SDK (тогда еще в бета-исполнении) позволяла реализовать на языке программирования Си алгоритмы, выполняющиеся на графических процессорах ускорителей GeForce восьмого поколения и старше. В качестве API используются транслированные на C выражения, которые без проблем стало возможным задействовать в любых приложениях.

Отныне программисту было нужно лишь обзавестись соответствующим SDK, а также скачать с официального сайта NVIDIA драйвер CUDA, который связывается с DirectX, OpenGL и С-компилятором для GPU. Замечу, что именно NVIDIA является разработчиком и обладателем патента на эту технологию, хотя она и поддерживается другими производителями, например, ATI. Для работы теоретически подойдут модели X1600, X1800, и X1900, однако я настоятельно рекомендую Х1900. В отличие от X1800, X1900 применяет не процессор R520/R530, а R580. Он дает большой прирост производительности со своими 48 шейдерными конвейерами, используемыми для вычислений. Важное требование — видеокарта должна обладать, как минимум, 512 Мб памяти — в противном случае GPU-клиент сильно загрузит машину (бывают и исключения: например, X1950Pro PCI-E с 256 МБ памяти показывает вполне неплохую производительность). Для удобства кодинга можно найти специальную среду разработки CUDA Toolkit (не путать с CUDA SDK). Она включает в себя:

  • nvcc (специальный «нативный» компилятор C);
  • библиотеку BLAS для работы с линейной алгеброй (например, в приведенных там примерах есть аналоги теста LIMPACK, используемого
    по сей день для выявления вычислительных мощностей суперкомпьютеров; по назначению является «узким» клоном Intel Math Kernel Library);
  • FFT-библиотеку (отвечает за операции фильтрации цифровых изображений с использованием результатов преобразований Фурье);
  • профайлер;
  • и пока еще сыроватый отладчик.

Готовые разработки на CUDA , или расправа над MD 5

О том, что технология работает и работает классно, можно судить уже сейчас. На основе CUDA были разработаны десятки утилит. Приведем наиболее интересные для нас, а именно — годные для взлома хэшей MD5:

На данный момент на nVidia 9600GT/C2D 3 ГГц CUDA-версия проверяет 350 миллионов ключей в секунду, а SSE2 — 108 миллионов. Для работы крайне желательно использовать 64-битную операционку, хотя 32-битная версия утилиты также доступна. Синтаксис для запуска следующий: BarsWF_SSE2_x64.exe -h 21685d282d79098b89bdf5 a916b66c90 -X "030405313233" -min_len 12 Где -X добавляет дополнительные значения для перебора, — min_len вносит максимальную длину пароля.

А эта утилита заточена для исполнения на GF9800. Неуди вительно, потому как мультипроцессоров в GF8800GTX — аж 16 штук! Причем, в каждом мультипроцессоре 8 про цессоров; итого получаем 128. Каждый процессор NVidia выполняет инструкцию за четыре такта (GF9800 2400 МГц), но восемь процессоров в 32-х потоках выполняют одинаковую инструкцию тоже за четыре такта; то есть, (128*4) 512 потока на GF8800ULTRA будут выполняться с той же скоростью, как на 128-ядерном Pentium 1500 МГц. Чуешь разницу? nvCuda md5 распространяется в исход ных кодах, что очень любопытно и полезно для остальных разработчиков.

Синтаксис запуска:

nvCUDA_md5.exe c=loweralpha-numeric f=md5pas.
txt s=1 e=9 b=70 o=find.txt

Где c — набор символов из charset.txt, f — файл, откуда берем хэши, s — начальная длина пароля, e — конечная длина пароля (15 max), b — (( количество процессоров ) / 8) *5 или экспериментируем, o — файл, куда будут записываться найденные пароли.

Давай подумаем, а для каких еще задач нам вообще могут понадобиться такие вычислительные возможности? К примеру, многие системные администраторы применяют на своих беспроводных точках доступа не штатную защиту, а усиленную (RSN/RSNA) с использованием WPA и WPA2. И почему бы не попробовать ее взломать?

Прощаемся с WPA 2: беспроводные сети опять уязвимы Совсем недавно компания Elcomsoft, знаменитая своими релизами для взлома всевозможных паролей, подала заявку на патент с описанием новой технологии подбора паролей в беспроводных сетях, использующих стандарты безопасности WPA и WPA2. По заявлениям разработчиков, методика обеспечивает в десятки раз более высокую скорость подбора пароля по сравнению со стандартными средствами. Проведенные испытания показали, что правильный ключ Wi-Fi подбирается в 10-15 раз быстрее, если запустить брутфорс от Elcomsoft на ноутбуке, укомплектованном видеокартой NVIDIA GeForce 8800M или 9800M. А использование того же самого ПО на настольном ПК, оснащенном двумя или несколькими картами NVIDIA GTX 280, повышает производительность приложения более чем в 100 раз. Наряду с этим существует open-source проект pyrit (http://code.google.com/p/pyrit), нацеленный на взлом WPA PSK, на котором мы и остановимся. Рассмотрим, почему WPA-PSK (1/2) реально взломать. Ниже приведена схема подключения клиента к точке доступа. Стало быть, пользователь находит сеть и начинает коннект. Он вводит пароль, который вместе с названием сети (SSID) формирует парный ключ (Pairwise Master KeyPMK). Затем клиент объясняет точке доступа, что он хочет авторизироваться. В ответ точка доступа генерит произвольное число. Тогда клиент вырабатывает свое число, состоящее из белиберды, полученного случайного числа точки доступа и PMK — все это называется Pairwise Transient Key.

Клиент посылает хотспоту только белиберду (свое рандомное число), подписанную ключом PTK (оно не зашифровано, а просто значится со статусом SIGNED). Хотспот получает это число, — точка доступа, естественно, знает пароль клиентa и PMK, поэтому может запросто посчитать PTK, — и проверяет код целостности из подписанной белиберды. Если с ним все в порядке и используется действительный PTK-ключ, то клиенту высылают одобрение на дальнейший диалог, заверив его, в свою очередь, PTK. Клиент также проверяет код целостности и то, что PTK подлинный, — после чего продолжает работу уже в защищенном канале связи. Немаловажным является стойкость самого пароля и коегде — распространенность SSID для формирования PMK. Подобрав PMK, есть возможность вторгнуться в сеть, потому что один из его параметров может быть угадан простым перебором из-за часто используемого SSID. Списки наиболее используемых SSID можно найти по адресу http://www.wigle.net/gps/gps/main/ssidstats. Пароль вполне реально угадать словарной атакой. Разберем случай, когда название сети (SSID:KREMLIN) нам известно. Pyrit сгенерит множество PMK-ключей в единую таблицу (не секрет, что любое вычисление может быть представлено в виде таблицы), которую в дальнейшем можно скормить уже существующему софту для взлома WPA (coWPAtty). Кстати говоря, таблицы размером 40 Гб я как-то выкладывал на одном из популярных блогов по информационной безопасности. Итак:

pyrit.py -e KREMLIN

create_essid pyrit.py -f dict.txt

import_passwords (импортируем словарь паролей)

pyrit.py batchprocess (процесс генерации пошел)

Полученные результаты можно смело экспортировать:

pyrit.py -e KREMLIN -f output.cow export_

cowpatty

GPU позволяет нам сгенерировать за гораздо меньший срок огромное число PMK. С их помощью процесс взлома WPAPSK заметно уменьшается по времени.

Современные консоли, или «Oh! It is CrackStation!»

Однажды я застал одного своего знакомого за серьезным умственным процессом: тот пытался решить, что же ему купить: PlayStation 3 или Xbox. Сошлись, в итоге, что выбирать надо по критерию вышедших игр, а никак не по техническим харак теристикам. А ведь вычислительные мощности современных приставок заслуживают внимания! Окинем пристальным взо ром характеристики процессора PlayStation 3 — Cell. В своем арсенале Cell имеет нативный процессор (PPU) с наличием 8 ядер (SPU); в приставках нового поколения бренда Sony их планируется увеличить до 12. Каждый такой процессор, по словам создателей, способен совершать 32 млрд. операций с плавающей точкой (GigaFlops) в секунду, а четыре целочис ленных блока вместе — 32 млрд. операций (GOPS) в секунду. Над проектом такого многоядерного процессора трудились три компании — Sony, Toshiba и IBM.

Причем, принципы, зало женные в архитектуру нового чипа, были разработаны еще в начале 2000 года инженерами IBM. Идея массового паралле лизма, на которой базируется Cell, работает в так называемой «клеточной архитектуре» («cellular architecture»). В ней для со здания суперкомпьютеров используется множество однотип ных процессоров (от 10 тыс. до 1 миллиона), каждый из которых оснащен собственным контроллером RAM и определенным объемом самой оперативной памяти. Наступает трогательный момент — а возможно ли написать нам свои приложения под такой камень, после чего создать бюджетный ипподром для взлома самых разнообразных хэшей? Для этого сначала об ратимся к офсайту одного из пап Cell — IBM (alphaworks.ibm.com/tech/cellsw).

Пакет разработчика (IBM Cell Broadband Engine Software Development Kit) распространяется в виде ISO-образа. Вообще, Cell поддерживает две вариации GCC: ppu-gcc и spu-gcc. Методика работы с этими двумя пакетами проста: с помощью spu-gcc мы пишем модули для исполнения на отдельном ядре, а с помощью ppu-gcc выполняем их цент рализовано на процессоре. Естественно, рекомендуется рас пределять отдельные вычисления на отдельное ядро, а потом писать для PPU исполняемую обертку, которая бы подключала модули для выполнения на каждом из SPU. Общий подход продемонстрирован на примере:

Touch hello_spe.c

#include <stdio.h>
#include <spu_intrinsics.h>
int main(unsigned long long id)
{
printf("Hello from SPU: 0x%11xn", id);
return 0;
}

После компиляции с флагом — o, обзовем нашу программу под 1 ядро, как spu_hello. Далее пишем обертку под центральный процессор:

Touch ppe_hello.c




#include <libspe.h>
#include <stdlib.h>
{Подключаем нашу программу spu_hello}
extern spe_program_handle_t spu_hello;
int main()
{
/* Создаем поток и записываем его ID */
speid_t spe_id = spe_create_thread(
0, &test_handle, NULL, NULL, — 1, 0);
int status;
/* Проверяем ошибки */
if(spe_id == 0) {
perror("Unable to create SPE thread");
exit(1);

}
/* Ждем завершения */
spe_wait(spe_id, &status, 0);
return 0;
}
spu-gcc spe_hello.c -o spe_hello
ppu-embedspu spu_program_handle spe_hello spe_hello_
csf.o
ppu-gcc ppe_hello.c spe_example_csf.o -lspe -o ppe_hello

Раз уж ведем речь об использовании многопоточности, то корректным будет немного поговорить о библиотеке LibSPE. Эта либа позволяет программисту обращаться к отдельному SPE-процессу. Внесу ясность: то, что исполняется на одном SPU, носит название SPE (Synergistic Processor Element). Она содержит пользовательские инструкции для управления SPE на отдельной операционной системе, а именно: приостанавливать его, задавать определенный приоритет на исполнение и т.п. В свою очередь, то, что будет подключать воедино и исполнять все SPE на центральном процессоре (PPUPhysics Proccesing Unit), называется PPE (Physics Processing Element). С недавнего времени LibSPE обзавелась второй версией, и в текущем CellSDK распространяется уже обновленная библиотека (с рядом критичных для программиста новаций). LibSPE2 задает абсолютно новые способы создания отдельного потока. Пример подобного кода ты найдешь на нашем диске.

Linux на Playstation3 — наш верный друг!

В качестве операционной системы для организации вычислений используется портированная версия Linux’a. Самая популярная и целенаправленно заточенная для запуска на консоли: Yellow Dog Linux. Впрочем, с не меньшим успехом ты можешь установить любые дистрибутивы пингвина в ppc-версиях: взять хотя бы Fedora Linux или Suse. В них уже предустановлен CellSDK, правда, еще старой версии, без поддержки libspe2, но ты можешь скачать ее отдельно в .rpm-пакете и установить привычной командой:

# wget http://www.bsc.es/projects/deepcomputing/
linuxoncell/cellsimulator/sdk2.0/libspe2-2.0.1-1.src.rpm
# rpm -i libspe2-2.0.1-1.src.rpm

Почему именно Linux и процессор Cell? Дело в том, что ядро Linux содержит инструкции для взаимодействия с псевдо-файловой системой spufs. Подразумевается, что один из SPU будет выделен для размещения виртуальной файловой системы, поэтому размещенным там приложениям ничего не стоит взаимодействовать с ним. Естественно, во всем этом задействован низкий уровень, к которому простому пользователю или даже программисту вручную не подойти, поэтому в качестве интерфейса для выполнения вычислений на отдельном ядре используется читабельная по API и понятная для C-программиста библиотека LibSPE. Теперь немного о том, как одна из самых популярных Open-Source платформ оказывается на борту игровой приставки. Процесс установки достаточно прост: для начала тебе требуется подготовить базовый дистрибутив с ОС, записать его на болванку и вставить в привод консоли. Далее следует операция: выбираем System Settings (под Settings в стартовом меню), жмем Install another OS — начнется процедура поиска инсталлятора. Соответственно, если он найден не будет, то дистрибутив не удовлетворяет запуску на PS3, и его надо сменить на что-нибудь другое. Если же все прошло гладко, то появится путь найденного инсталлятора и потребуется немного подождать. Приглашение командной строки указывает на возможности установки: Installtext — текстовая, Install — графическая. Следуй всем шагам, как на обычном ПК. Чтобы запустить только что установленную систему выполни: «(Settings) - (System Settings) (Default System) - Other OS».

Зачем нам такие мощности?

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

Ссылки

Содержание
ttfb: 1106.4970493317 ms