<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>r0 Crew</title>
		<link>http://forum.reverse4you.org/</link>
		<description>r0 Crew - объединяет определенный круг людей, заинтересованных в: поиске, изучении уязвимостей и ошибок в программном коде; исследовании навесных защит; исследовании вирусов; системном программировании (kernel-mode, user-mode).</description>
		<language>ru</language>
		<lastBuildDate>Sun, 20 May 2012 09:13:30 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>1440</ttl>
		<image>
			<url>http://forum.reverse4you.org/images/misc/rss.png</url>
			<title>r0 Crew</title>
			<link>http://forum.reverse4you.org/</link>
		</image>
		<item>
			<title>Вот такое предложение администрации и всем всем</title>
			<link>http://forum.reverse4you.org/showthread.php?t=1266&amp;goto=newpost</link>
			<pubDate>Sat, 19 May 2012 22:50:56 GMT</pubDate>
			<description>Доброй ночи!Вот я предлогаю вам обучить меня реверсингу,хотябы на простеньком уровне,а я очень буду рад да и еще к тому же нарисую вам дизайн под...</description>
			<content:encoded><![CDATA[<div>Доброй ночи!Вот я предлогаю вам обучить меня реверсингу,хотябы на простеньком уровне,а я очень буду рад да и еще к тому же нарисую вам дизайн под wordpress например,ну и сюда шапочку постараюсь,да и вообще при любом запросе у вас на графике - выполню :)</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=84">Общение</category>
			<dc:creator>InDuStRieS</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1266</guid>
		</item>
		<item>
			<title>Запрос на реверсинг GWSkype (NAG)</title>
			<link>http://forum.reverse4you.org/showthread.php?t=1265&amp;goto=newpost</link>
			<pubDate>Fri, 11 May 2012 08:26:46 GMT</pubDate>
			<description>Друзья, есть специальный скайп для Незрячих Он называеться GWSkype есть Платная и Бесплатная версии. Платная стоит что-то около 40$, а Бесплатная...</description>
			<content:encoded><![CDATA[<div>Друзья, есть специальный скайп для Незрячих Он называеться GWSkype есть Платная и Бесплатная версии. Платная стоит что-то около 40$, а Бесплатная версия выводит каждый час рекламу. Вы можете помочь глянуть возможно ли с этим что-то сделать что бы не мучала эта реклама?<br />
<br />
Размер: 14,35 Мб<br />
<a href="http://zalivalka.ru/15911" target="_blank" rel="nofollow">http://zalivalka.ru/15911</a><br />
<br />
NAG Screen при запуске программы:<br />
<img src="http://www.isok.ru/img/full/3eb6c1ae607ad6132e42494c94ee268f.jpg" border="0" alt="" /><br />
<br />
Файл: GWConnect.exe представляет из себя какойто непонятный контейнер, пейд говорит что там UPX который нельзя распаковать. При запуске файл распаковывает в %TEMP% либы редиста и ещё какие-то непонятные файлы, <br />
<img src="http://www.isok.ru/img/full/df0d43e78bfa141a435f7cf2851bcf8d.jpg" border="0" alt="" /><br />
<br />
Ребята я очень ценю вашу помощь, пожалуйста сделайте все возможное, заранее благодарен... *blind*</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=202">Обычный</category>
			<dc:creator>V3T</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1265</guid>
		</item>
		<item>
			<title><![CDATA[Написание Updater'a]]></title>
			<link>http://forum.reverse4you.org/showthread.php?t=1264&amp;goto=newpost</link>
			<pubDate>Thu, 10 May 2012 16:50:50 GMT</pubDate>
			<description>Привет всем. 
 
Интересует вопрос написания апдейтера. Собственно, кто в курсе посоветуйте какие-то толковые материалы, я поискав нечего по сути не...</description>
			<content:encoded><![CDATA[<div>Привет всем.<br />
<br />
Интересует вопрос написания апдейтера. Собственно, кто в курсе посоветуйте какие-то толковые материалы, я поискав нечего по сути не нашел.<br />
<br />
Пока я себе представляю так:<br />
На сервере я ложу новую версию моей программы, далее я пишу 2 след. модуля. Первый модуль (часть программы, к-ую нужно обновить) - это часть, к-ая отвечает за закачку на телефон новой версии программы,  и передаю управление ей, новая программа берет и удаляет старую. <br />
Второй модуль - находится на сервере и соотвесвенно принимает запросы на проверку наличия новой версии программы, и если она имеется отправляет ее, напр., по протоколу НТТР.<br />
<br />
Собвственно, какие схемы обновления вы можете предложить или то как я себе представляю так делают все? И еще какие советы можете дать, к-ые надо учесть для возможно какого-то дальнейшего развития, безопастности и тд...<br />
<br />
Если это сильно важно, то данный апдейтер я хотел бы встроить как функционал апликухи, к-ая будет находится на телефоне под ОС Android, в будущем планируется портировать на iOS.<br />
<br />
Спасибо за внимание!<br />
Буду рад любой вашей помощи.<br />
<br />
С уважением, <br />
 coldfire</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=53">Вопрос - Ответ</category>
			<dc:creator>coldfire</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1264</guid>
		</item>
		<item>
			<title>Нужны системные программисты, для работы над проектами AMD.(Киев)</title>
			<link>http://forum.reverse4you.org/showthread.php?t=1263&amp;goto=newpost</link>
			<pubDate>Thu, 03 May 2012 11:54:50 GMT</pubDate>
			<description><![CDATA[На днях мне пришло письмо с такой вакансией: 
 
"Мы рады сообщить, что всемирно известная компания AMD (Advanced Micro Devices, www.amd.com) ...]]></description>
			<content:encoded><![CDATA[<div>На днях мне пришло письмо с такой вакансией:<br />
<br />
&quot;Мы рады сообщить, что всемирно известная компания AMD (Advanced Micro Devices, <a href="http://www.amd.com" target="_blank" rel="nofollow">www.amd.com</a>)  расширяет свое сотрудничество с Люксофт, стартуя несколько новых проектов в Украине (Киев) в апреле 2012 года.<br />
Мы активно набираем команду, открыты позиции уровня Junior, Middle, Senior, Lead, PM… Хорошие условия труда.<br />
 <br />
Надеюсь, Вас это заинтересует и мы продолжим диалог.<br />
 <br />
Advanced Micro Devices, Inc. (AMD) — американский производитель интегральной электроники. Второй по величине производитель x86 и x64-совместимых процессоров, а также крупнейший поставщик графических процессоров (после приобретения ATI Technologies в 2006 году), чипсетов для материнских плат и флеш-памяти.<br />
 <br />
Информация для ознакомления: <a href="http://www.luxoft.com" target="_blank" rel="nofollow">www.luxoft.com</a><br />
 Люксофт обеспечивает своим сотрудникам, помимо интересной работы и хорошей оплаты труда, социальный пакет, в который входит:<br />
- медицинская страховка на 180 000 грн в год (включая бесплатные лекарства, оплату услуг стоматолога, посещение 8 раз в месяц тренажерного зала или бассейна) или пакет &lt;Люкс-Спорт&gt;;<br />
- профессиональные тренинги и курсы английского языка (в рабочее время и за счет Компании);<br />
- 24 дня оплачиваемого отпуска;<br />
- оплату больничного<br />
 <br />
Мы оплачиваем переезд в Киев, на две недели бесплатно предоставляем корпоративную квартиру, помогаем найти квартиру для съема и компенсируем услуги риэлтерского агентства.<br />
Такая практика довольно распространена и многие кандидаты из других городов/стран переехали и работают в Люксофт Киев.&quot;<br />
<br />
Ребят кому интересно пишите в личку, просили поспрашивать знакомых, по ходу набор будет серьезный.</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=82">Работа</category>
			<dc:creator>ximera</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1263</guid>
		</item>
		<item>
			<title><![CDATA[ушел из жизни "Great" ...]]></title>
			<link>http://forum.reverse4you.org/showthread.php?t=1262&amp;goto=newpost</link>
			<pubDate>Wed, 02 May 2012 13:16:54 GMT</pubDate>
			<description>*Человек с неординарным мышлением, использовал оригинальные приемы в программировании, охотно помогал людям бесплатно, решал сложнейшие задачи... 
...</description>
			<content:encoded><![CDATA[<div><b>Человек с неординарным мышлением, использовал оригинальные приемы в программировании, охотно помогал людям бесплатно, решал сложнейшие задачи...<br />
<br />
Один из немногих на WASM'е который действительно был гуру...</b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Цитата:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			Илюха aka Great умер от сердечного приступа, когда возвращался из магазина электроники на этих выходных...
			
		<hr />
	</div>
</div> <a href="http://wasm.ru/forum/viewtopic.php?id=44753&amp;p=1" target="_blank" rel="nofollow">http://wasm.ru/forum/viewtopic.php?id=44753&amp;p=1</a></div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=52">Новости</category>
			<dc:creator>V3T</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1262</guid>
		</item>
		<item>
			<title>QT4 не запускается дебаггер</title>
			<link>http://forum.reverse4you.org/showthread.php?t=1261&amp;goto=newpost</link>
			<pubDate>Tue, 01 May 2012 11:22:54 GMT</pubDate>
			<description>Linux version 2.6.32-40-generic (buildd@yellow) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #87-Ubuntu SMP Tue Mar 6 00:56:56 UTC 2012 
  
The...</description>
			<content:encoded><![CDATA[<div>Linux version 2.6.32-40-generic (buildd@yellow) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #87-Ubuntu SMP Tue Mar 6 00:56:56 UTC 2012<br />
 <br />
The debugger could not load the debugging helper library.<br />
<br />
The debugging helper is used to nicely format the values of some Qt and Standard Library data types. It must be compiled for each used Qt version separately. This can be done in the Qt preferences page by selecting a Qt installation and clicking on 'Rebuild' in the 'Debugging Helper' row.<br />
<br />
Не запускается дебаггер, установил с репозитария.<br />
<br />
Нашел тред с похожей проблемой, но там про питон а не C++<br />
<a href="http://qt-project.org/forums/viewthread/518" target="_blank" rel="nofollow">http://qt-project.org/forums/viewthread/518</a><br />
<br />
Вопрос: &quot;Что делать с дебаггером в QTCreator'е&quot;<br />
<br />
Результат тестовой компиляции при помощи комманды qmake<br />
abrakadabra@abrakadabra:~/Desktop/listings$ qmake 1file.cpp/home/abrakadabra/Desktop/listings/1file.cpp:3: Unknown test function: int main<br />
/home/abrakadabra/Desktop/listings/1file.cpp:5: Unknown test function: QApplication app<br />
/home/abrakadabra/Desktop/listings/1file.cpp:5: Parse Error ('QApplication app(argc, argv);')<br />
/home/abrakadabra/Desktop/listings/1file.cpp:5: Unterminated conditional block at end of file<br />
Error processing project file: 1file.cpp<br />
<br />
Пройдясь в ручную(и щелкая по всем малолмальски пригодным для моих целей галочкам) нашел некий файл под названием libqt4-dbg.</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=53">Вопрос - Ответ</category>
			<dc:creator>whiteshuk</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1261</guid>
		</item>
		<item>
			<title>Gray Hat Python: Глава 8 - Fuzzing (Перевод: Prosper-H)</title>
			<link>http://forum.reverse4you.org/showthread.php?t=1260&amp;goto=newpost</link>
			<pubDate>Mon, 30 Apr 2012 20:49:46 GMT</pubDate>
			<description>*Перейти к содержанию (http://forum.reverse4you.org/showthread.php?t=1186)* 
 
*Intro* 
 
Fuzzing – был горячей темой в течении некоторого времени,...</description>
			<content:encoded><![CDATA[<div><b><font size="3"><a href="http://forum.reverse4you.org/showthread.php?t=1186" target="_blank">Перейти к содержанию</a></font></b><br />
<br />
<b><font size="3">Intro</font></b><br />
<br />
Fuzzing – был горячей темой в течении некоторого времени, главным образом, потому что это один из самых эффективных методов поиска ошибок в программном обеспечении. Fuzzing - является ничем иным, как создание некорректных или полу-корректных данных для отправки приложению, в попытке вызвать в нем неисправность. В этой главе, мы обсудим различные типы фаззеров, а так же классы ошибок, предоставляющие собой неисправности, которые мы ищем; затем мы создадим файловый фаззер для собственного использования. В последующих главах, мы рассмотрим фрейворк Sulley, а так же фазер ioctlizer, который был разработан для тестирования драйверов Windows.<br />
<br />
Приступая к теме фаззинга нужно знать, что существует два типа фаззеров: генерирующие (generation) и мутирующие (mutation). Генерирующие фаззеры создают данные, посылаемые тестируемой программе; мутирующие фазеры берут части уже существующих данных и изменяют их. Примером генерирующего фаззера могло бы быть что-то, что создает набор неправильных HTTP-запросов и отправляет их тестируемому веб-серверу. Мутирующим фаззером могло бы быть что-то, что перехватывает и изменяет пакеты HTTP-запросов перед их отправкой веб-серверу. <br />
<br />
Для того, чтобы понять, как создавать эффективные фаззеры, нужно вначале рассмотреть общие классы ошибок, которые они способны выявлять <b>[1]</b>. Ниже представлена подборка наиболее общих ошибок, существующих в приложениях сегодня. Далее мы покажем вам, как их можно спровоцировать с помощью вашего собственно фаззера. <br />
<br />
<br />
<b>8.1 Bug Classes</b><br />
<br />
При анализе программного обеспечения на ошибки, хакер или реверс-инженер ищет определенные баги, которые позволят ему взять под свой контроль выполнением кода в приложении. Фаззеры могут предоставить автоматизированный способ поиска багов, которые помогают хакеру: получать контроль над системой, повышать привилегии в системе или воровать информацию, к которой у тестируемого приложения есть доступ. Мы сосредоточимся на багах, которые обычно обнаруживаются в программном обеспечении, которое работает в качестве независимого процесса. Обнаружение ошибок в таких программах, с наибольшей вероятностью, может привести к компрометации всей системы. <br />
<br />
<b><i>8.1.1 Buffer Overflows</i></b><br />
<br />
Переполнение буфера является наиболее распространенным типом ошибок в программном обеспечении. Все виды безобидных функций управления памятью, манипулирования строками и даже внутренняя функциональность, являющаяся частью языка программирования, как раз и есть тем, что служит появлению ошибок переполнения буфера в программном обеспечении.<br />
<br />
Короче говоря, переполнение буфера происходит тогда, когда данные сохраняются в области памяти, которая слишком мала, чтобы хранить их. Для объяснения этого понятия будем думать о буфере, как о ведре, которое может содержать 10 литров воды. Ничего не случится, если мы нальем в ведро две чашки воды, или заполним его наполовину, или даже до краев. Но все мы знаем, что случится, если попытаться налить 15 литров воды – вода выльется на пол… По сути тоже самое происходит и в программном обеспечении; когда имеется слишком много воды (данных), она выливается из ведра (буфер) и разливается по полу (память). Когда атакующий может управлять способом перезаписи памяти, он находит на пути к получению возможности полного выполнения кода и, в конечном счете, компрометации системы в той или иной форме. Есть два основных типа переполнения буфера: переполнение стека и переполнение кучи. Эти типы ведут себя совершенно по разному, но приводят к одному и тому же результату – атакующий контролирует выполнение кода.<br />
<br />
Переполнение стека является характерным переполнением буфера, которое впоследствии перезаписывает данные в стеке, что может быть использовано в качестве средства контроля над выполнением программы. Выполнение кода, может быть осуществлено из-за переполнения стека атакующим, что позволит: перезаписать адрес возврата из функции, заменить указатель на функции, заменить значения переменных или изменить цепочку выполнения обработчиков исключения в нутрии приложения. <br />
<br />
Переполнение кучи происходит  в пределах сегмента кучи, процесса выполнения, где приложение динамически выделяет память во время выполнения. Куча состоит из блоков, которые связаны между собой метадынными. Когда происходит переполнение кучи, атакующий имеет возможность перезаписать метаданные в блоке, расположенном рядом с той областью, которая переполнилась. Когда это происходит, он может управлять записью в произвольные места памяти, которые могут включать: переменные, указатели на функции, маркеры безопасности (security tokens) или любое количество других важных структур данных, которые могут храниться в куче во время переполнения. Отследить переполнение кучи на начальной стадии может быть довольно сложной задачей, поскольку блоки, которые были повреждены, могут использоваться через некоторый промежуток времени. Эта задержка, до срабатывания нарушения прав доступа, может создать некоторые проблемы, когда вы будете пытаться отследить сбой, во время выполнения фаззинга.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Цитата:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			<b>MICROSOFT GLOBAL FLAGS</b><br />
<br />
Microsoft had the application developer (and exploit writer) in mind when it created the Windows operating system. Global flags (Gflags) представляет собой набор диагностики и параметров отладки, которые позволяют отслеживать, логировать (log) и отлаживать программное обеспечение с очень высокою степенью детализации. Эти параметры могут быть использованы в Microsoft Windows 2000, XP Professional и Server 2003.<br />
<br />
Функцией, в которой мы больше всего заинтересованы, является верификатор кучи страниц (the page heap verifier). Когда она включается для процесса, верификатор отслеживает динамические операции с памятью, включая все выделения и освобождения. Но в действительности хорошим аспектом является то, что она вызывает остановку отладчика в момент повреждения кучи, что позволяет остановиться на инструкции, которая вызвала повреждение. Это багхантеру отслеживать ошибки связанные с кучей. <br />
<br />
Для включения верификатора кучи нужно отредактировать Gflags. Сделать это можно с помощью удобной утилиты gflags.exe, которую Microsoft предоставляет бесплатно. Вы можете загрузить ее по следующему адресу:<br />
<br />
<a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=49AE8576-9BB9-4126-9761-BA8011FABF38&amp;displaylang=en" target="_blank" rel="nofollow">http://www.microsoft.com/downloads/d...displaylang=en</a>.<br />
<br />
Immunity также создал библиотеку Gflags и связал ее с PyCommand, чтобы можно было производить изменения «флагов» из по отладчика. Сама библиотека поставляется вместе с отладчиком, который можно загрузить по следующему адресу: <a href="http://debugger.immunityinc.com/" target="_blank" rel="nofollow">http://debugger.immunityinc.com/</a>
			
		<hr />
	</div>
</div> С точки зрения фаззинга, для того чтобы выявить переполнение буфера, нужно просто попытаться передать очень большое количество данных в тестируемое приложение, в надежде, что это вызовет переполнение. <br />
<br />
Далее мы рассмотрим целочисленные переполнения, являющиеся еще одним распространенным классом ошибок, которые содержатся в программном обеспечении.<br />
<br />
<b><i>8.1.2 Integer Overflows</i></b><br />
<br />
Целочисленное переполнение является интересным классом ошибок. Оно основано на используемом размере целых чисел, и том, как процессор обрабатывает арифметические операции над этими числами. Целое число (со знаком), размер которого равен 2 байтам, может содержать значения от -32767 до 32767. Целочисленное переполнение происходит при попытке сохранить значение вне этого диапазона (т.е. число больше 32767 или меньше -32767, или другими словами оно не умещается в 2 байта). В этом случае процессор отбрасывает биты старшего разряда, чтобы успешно сохранить значение. На первый взгляд это не похоже на большую проблему, но давайте посмотрим пример, в котором показано, как целочисленное переполнение может привести к выделению слишком маленького места и возможно, в результате, в будущем приведет к переполнению буфера.<br />
 <br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">MOV EAX, [ESP + 0x8]<br />
LEA EDI, [EAX + 0x24]<br />
PUSH EDI<br />
CALL msvcrt.malloc</code><hr />
</div> Первая инструкция берет параметр из стека [ESP + 0x8] и загружает его в EAX. Следующая инструкция складывает 0x24 c EAX и сохраняет результат в EDI. Затем мы передаем результат этого сложения в функции выделения памяти malloc, в качестве единственного параметра, который является размером запрашиваемой области памяти для выделения. Все выглядит довольно безобидно, правда? Если предположить что в EAX содержится очень большое число, которое находится рядом с максимально возможным значением, то в случае добавления, например, 0x24 произойдет его переполнение, и в конечном итоге – EAX будет содержать маленькое число. Посмотрите на Листинг 8-1. На нем можно видеть то, что происходило бы, если бы параметр стека находился под нашим контролем, в момент, когда мы передали бы в нем (параметре) большое значение 0xFFFFFFF5.<br />
<br />
<b>Listing 8-1</b>: Arithmetic operation on a signed integer under our control<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">Stack Parameter =&gt; 0xFFFFFFF5<br />
Arithmetic Operation =&gt; 0xFFFFFFF5 + 0x24<br />
Arithmetic Result =&gt; 0x100000019 (larger than 32 bits)<br />
Processor Truncates =&gt; 0x00000019</code><hr />
</div> Если это произойдет, то malloc выделит только 0x19 байт, которые могли бы быть намного меньшей частью памяти, чем та, какую разработчик рассчитывал выделить. Если в этот небольшой буфер предполагается сохранить большую порцию данных, то произойдет переполнение буфера. Для переполнения целого числа с помощью фаззера, мы должны убедиться, что передаем как высокие положительные числа, так и низкие отрицательные в попытке достигнуть целочисленного переполнения, которое могло бы привести к нежелательному поведению тестируемого приложения или даже полного переполнения буфера.<br />
<br />
Далее мы перейдем к атакам на форматную строку, которые являются еще одним распространенным классом ошибок, в современном программном обеспечении.<br />
<br />
<b><i>8.1.3 Format String Attacks</i></b><br />
<br />
Атаки на форматную строку, включают возможность ввода данных (атакующим), которые обрабатываются как спецификаторы  в определенных функциях обработки строк, таких как, например, функция printf языка С.  Давайте сначала рассмотрим прототип функции printf:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">int printf( const char * format, ... );</code><hr />
</div> Первым параметром является строка форматирования, которую мы будем объединять с любым числом дополнительных параметров, которые представляют собой определенные значения и описываются с помощью конкретных спецификаторов. Примером этого может быть:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">int test = 10000;<br />
printf(&quot;We have written %d lines of code so far.&quot;, test);</code><hr />
</div> <div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">Output:<br />
<br />
We have written 10000 lines of code so far.</code><hr />
</div> Парметр %d является спецификатором. Если криворукий программист, забудет положить, какое-либо значение в спецификатор, перед вызовом функции, то вы увидите что-то вроде этого:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">char* test = &quot;%x&quot;;<br />
printf(test);</code><hr />
</div> <div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">Output:<br />
<br />
5a88c3188</code><hr />
</div> Это сильно отличается от того, что мы видели ранее. Если в строке передаваемой функции printf, присутствует спецификатор, который не связан с каким-либо аргументом функции, то в качестве недостающего аргумента функция printf используются значения из стека! В нашем случае число 0x5a88c3188, которое вы видите, является либо частью каких-то данных сохраненных в стеке, либо указателем на данные в памяти. Есть два наиболее интересных спецификатора %s и %n. Спецификатор %s говорит строковой функции сканировать память на наличие строки до тех пор, пока она не встретит NULL-байт, указывающий на конец строки. Это удобно либо для чтения больших объемов данных, либо для того, чтобы узнать, что храниться по определенному адресу, либо для вызова сбоя в приложении, обратившись к памяти, запрещенной для чтения. Спецификатор %n уникален в том, что позволяет вам писать данные в память, вместо их чтения. Это позволяет атакующему перезаписать адрес возврата или указатель на функцию, что в любом случае приведет к произвольному выполнению кода. С точки зрения фаззинга, нам нужно просто убедиться, что that the test cases we are generating pass in some of these format specifiers in an attempt to exercise a misused string function that accepts our format specifier.<br />
<br />
Теперь, когда мы рассмотрели наиболее распространенные классы ошибок, пришло время приступить к созданию нашего первого фаззера. Это будет простой генерирующий файловый фаззер, который сможет мутировать в любой файловый формат. Мы также задействуем PyDbg для контроля и отслеживания сбоев в тестируемом программном обеспечении. Вперед!<br />
<br />
<br />
<b>8.2 File Fuzzer</b><br />
<br />
Уязвимости формата файла быстро становятся вектором для атак с клиентской стороны, поэтому, естественно, что мы должны быть заинтересованы в поиске ошибок в парсерах формата файлов. К тому же, нам нужно иметь возможность работать со всеми различными видами форматов, чтобы получить наибольшую выгоду, причем не важно, тестируем ли мы антивирусные продукты или программы для чтения текста. Мы также должны убедиться в том, что у нас подключена некоторая отладочная функциональность, с помощью которой мы сможем поймать информацию о краше (crash), который, в свою очередь, позволит определить – нашли ли мы эксплуатируемую уязвимость или нет. Под конец, мы добавим некоторые возможности электронной почты, чтобы уведомлять и посылать вам информацию о сбоях (crash) всякий раз, как они будут происходить. Это может быть полезно, если у вас есть несколько фаззеров, работающих с множеством целей, и вам нужно знать, когда можно приступить к исследованию сбоя. Первым шагом должно быть создание скелета класса, с функциональностью простого выбора файлов (случайным образом), которая будет заботиться об открытии случайных файлов для мутации.  Откройте новый Python файл, назовите его file_fuzzer.py и введите следующий код.<br />
<br />
<b>file_fuzzer.py</b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">from pydbg import *<br />
from pydbg.defines import *<br />
<br />
import utils<br />
import random<br />
import sys<br />
import struct<br />
import threading<br />
import os<br />
import shutil<br />
import time<br />
import getopt<br />
<br />
class file_fuzzer:<br />
<br />
&nbsp; &nbsp; def __init__(self, exe_path, ext, notify):<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.exe_path = exe_path<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.ext = ext<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.notify_crash = notify<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.orig_file = None<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.mutated_file = None<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.iteration = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.exe_path = exe_path<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.orig_file = None<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.mutated_file = None<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.iteration = 0<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.crash = None<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.send_notify = False<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.pid = None<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.in_accessv_handler = False<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.dbg = None<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.running = False<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.ready = False<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; # Optional<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.smtpserver = 'mail.nostarch.com'<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.recipients = ['jms@bughunter.ca',]<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.sender = 'jms@bughunter.ca'<br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; self.test_cases = [ &quot;%s%n%s%n%s%n&quot;, &quot;\xff&quot;, &quot;\x00&quot;, &quot;A&quot; ]<br />
<br />
&nbsp; &nbsp; def file_picker( self ):<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; file_list = os.listdir(&quot;examples/&quot;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; list_length = len(file_list)<br />
&nbsp; &nbsp; &nbsp; &nbsp; file = file_list[random.randint(0, list_length-1)]<br />
&nbsp; &nbsp; &nbsp; &nbsp; shutil.copy(&quot;examples\\%s&quot; % file,&quot;test.%s&quot; % self.ext)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; return file</code><hr />
</div> Скелет класса, нашего файлового фаззера, определяет глобальные переменные для отслеживания основной информации. Функция file_picker просто использует встроенные функции из Python для того, чтобы получить список файлов в каталоге и случайным образом выбрать один из имеющихся для мутации. Теперь нам нужно сделать некоторую работу: загрузить тестируемое программное обеспечение; отследить его сбои (crashers) и завершить его, когда разбор (parsing) документа будет закончен. На первом этапе нужно загрузить тестируемое ПО в поток (thread) отладчика и установить обработчик нарушения доступа (access violation handler). Затем нужно породить второй поток, чтобы контролировать первый. Это позволит второму потоку, по прошествии определенного количества времени, убить первый. Также будет добавлена функция уведомления по email. Давайте добавим эти функции в наш класс.<br />
<br />
<b>file_fuzzer.py</b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">...<br />
<br />
&nbsp; &nbsp; def fuzz( self ):<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; while 1:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (#1): if not self.running:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # We first snag a file for mutation<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.test_file = self.file_picker()<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (#2): self.mutate_file()<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Start up the debugger thread<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (#3): pydbg_thread = threading.Thread(target=self.start_debugger)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pydbg_thread.setDaemon(0)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pydbg_thread.start()<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while self.pid == None:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.sleep(1)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # Start up the monitoring thread<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (#4): monitor_thread = threading.Thread(target=self.monitor_debugger)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; monitor_thread.setDaemon(0)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; monitor_thread.start()<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.iteration += 1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.sleep(1)<br />
<br />
&nbsp; &nbsp; # Our primary debugger thread that the application<br />
&nbsp; &nbsp; # runs under<br />
&nbsp; &nbsp; def start_debugger(self):<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;[*] Starting debugger for iteration: %d&quot; % self.iteration<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.running = True<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.dbg = pydbg()<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.dbg.set_callback(EXCEPTION_ACCESS_VIOLATION,self.check_accessv)<br />
&nbsp; &nbsp; &nbsp; &nbsp; pid = self.dbg.load(self.exe_path,&quot;test.%s&quot; % self.ext)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.pid = self.dbg.pid<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.dbg.run()<br />
<br />
&nbsp; &nbsp; # Our access violation handler that traps the crash<br />
&nbsp; &nbsp; # information and stores it<br />
&nbsp; &nbsp; def check_accessv(self,dbg):<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; if dbg.dbg.u.Exception.dwFirstChance:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return DBG_CONTINUE<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;[*] Woot! Handling an access violation!&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.in_accessv_handler = True<br />
&nbsp; &nbsp; &nbsp; &nbsp; crash_bin = utils.crash_binning.crash_binning()<br />
&nbsp; &nbsp; &nbsp; &nbsp; crash_bin.record_crash(dbg)<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.crash = crash_bin.crash_synopsis()<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; # Write out the crash informations<br />
&nbsp; &nbsp; &nbsp; &nbsp; crash_fd = open(&quot;crashes\\crash-%d&quot; % self.iteration,&quot;w&quot;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; crash_fd.write(self.crash)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; # Now back up the files<br />
&nbsp; &nbsp; &nbsp; &nbsp; shutil.copy(&quot;test.%s&quot; % self.ext,&quot;crashes\\%d.%s&quot; % (self.iteration,self.ext))<br />
&nbsp; &nbsp; &nbsp; &nbsp; shutil.copy(&quot;examples\\%s&quot; % self.test_file,&quot;crashes\\%d_orig.%s&quot; % (self.iteration,self.ext))<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.dbg.terminate_process()<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.in_accessv_handler = False<br />
&nbsp; &nbsp; &nbsp; &nbsp; self.running = False<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; return DBG_EXCEPTION_NOT_HANDLED<br />
<br />
&nbsp; &nbsp; # This is our monitoring function that allows the application<br />
&nbsp; &nbsp; # to run for a few seconds and then it terminates it<br />
&nbsp; &nbsp; def monitor_debugger(self):<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; counter = 0<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;[*] Monitor thread for pid: %d waiting.&quot; % self.pid,<br />
&nbsp; &nbsp; &nbsp; &nbsp; while counter &lt; 3:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.sleep(1)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print counter,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; counter += 1<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; if self.in_accessv_handler != True:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.sleep(1)<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.dbg.terminate_process()<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.pid = None<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.running = False<br />
&nbsp; &nbsp; &nbsp; &nbsp; else:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; print &quot;[*] The access violation handler is doing its business. Waiting.&quot;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; while self.running:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.sleep(1)<br />
<br />
&nbsp; &nbsp; # Our emailing routine to ship out crash information<br />
&nbsp; &nbsp; def notify(self):<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; crash_message = &quot;From:%s\r\n\r\nTo:\r\n\r\nIteration: %d\n\nOutput:\n\n %s&quot; % (self.sender, self.iteration, self.crash)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; session = smtplib.SMTP(smtpserver)<br />
&nbsp; &nbsp; &nbsp; &nbsp; session.sendmail(sender, recipients, crash_message)<br />
&nbsp; &nbsp; &nbsp; &nbsp; session.quit()<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; return</code><hr />
</div> Теперь у нас есть основная логика, позволяющая управлять приложением во время фаззинга, поэтому давайте кратко рассмотрим ее функции. На первом шаге <b>(#1)</b>  нужно убедиться, что фаззинг еще не запущен. Флаг self.running также будет установлен, если обработчик нарушения прав доступа (access violation handler) будет занят составлением отчета о сбое (crash). После того как был выбран файл для мутации, он передается в простую функцию мутации <b>(#2)</b>, которую мы в скорее напишем.<br />
<br />
После того как функция мутатора отработала, мы запускаем наш отладочный поток <b>(#3)</b>, который просто запускает приложение и передает покалеченный (mutated) файл в качестве аргумента командной строки. Затем мы ожидаем в цикле пока отладочный поток зарегистрирует PID тестируемого приложения. Как только мы получили PID – запускаем контролирующий поток <b>(#4)</b>, чья работа заключается в уничтожении (kill) приложения по прошествии определенного количества времени. После того как контролирующий поток был запущен, мы увеличиваем счетчик (count) и повторно входим в наш основной цикл до тех пор, пока не придет время выбрать новый файл и начать фаззинг снова. Теперь давайте добавим простую функцию мутации.<br />
<br />
<b>file_fuzzer.py</b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">...<br />
&nbsp; &nbsp; def mutate_file( self ):<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; # Pull the contents of the file into a buffer<br />
&nbsp; &nbsp; &nbsp; &nbsp; fd = open(&quot;test.%s&quot; % self.ext, &quot;rb&quot;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; stream = fd.read()<br />
&nbsp; &nbsp; &nbsp; &nbsp; fd.close()<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; # The fuzzing meat and potatoes, really simple<br />
&nbsp; &nbsp; &nbsp; &nbsp; # Take a random test case and apply it to a random position<br />
&nbsp; &nbsp; &nbsp; &nbsp; # in the file<br />
&nbsp; &nbsp; &nbsp; &nbsp; (#1): test_case = self.test_cases[random.randint(0,len(self.test_cases)-1)]<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; (#2): stream_length = len(stream)<br />
&nbsp; &nbsp; &nbsp; &nbsp; rand_offset = random.randint(0, stream_length - 1 )<br />
&nbsp; &nbsp; &nbsp; &nbsp; rand_len = random.randint(1, 1000)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; # Now take the test case and repeat it<br />
&nbsp; &nbsp; &nbsp; &nbsp; test_case = test_case * rand_len<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; # Apply it to the buffer, we are just<br />
&nbsp; &nbsp; &nbsp; &nbsp; # splicing in our fuzz data<br />
&nbsp; &nbsp; &nbsp; &nbsp; (#3): fuzz_file = stream[0:rand_offset]<br />
&nbsp; &nbsp; &nbsp; &nbsp; fuzz_file += str(test_case)<br />
&nbsp; &nbsp; &nbsp; &nbsp; fuzz_file += stream[rand_offset:]<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; # Write out the file<br />
&nbsp; &nbsp; &nbsp; &nbsp; fd = open(&quot;test.%s&quot; % self.ext, &quot;wb&quot;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; fd.write( fuzz_file )<br />
&nbsp; &nbsp; &nbsp; &nbsp; fd.close()<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; return</code><hr />
</div> Это элементарный мутатор. Мы случайным образом выбираем текст из глобального списка <b>(#1)</b>; затем выбираем случайно смешение и длину новых данных, которые будут записаны в файл <b>(#2)</b>. Затем мы разрезаем файл <b>(#3)</b>, используя смещение и длину, чтобы внести в него изменения. Когда мы закончим и запишем файл, отладочный поток сразу же использует его для тестирования приложения. Теперь давайте добавим код управления нашим фаззером.<br />
<br />
<b>file_fuzzer.py</b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">...<br />
&nbsp; &nbsp; def print_usage():<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;[*]&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;[*] file_fuzzer.py -e &lt;Executable Path&gt; -x &lt;File Extension&gt;&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; print &quot;[*]&quot;<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; sys.exit(0)<br />
<br />
if __name__ == &quot;__main__&quot;:<br />
<br />
&nbsp; &nbsp; print &quot;[*] Generic File Fuzzer.&quot;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; # This is the path to the document parser<br />
&nbsp; &nbsp; # and the filename extension to use<br />
&nbsp; &nbsp; try:<br />
&nbsp; &nbsp; &nbsp; &nbsp; opts, argo = getopt.getopt(sys.argv[1:],&quot;e:x:n&quot;)<br />
&nbsp; &nbsp; except getopt.GetoptError:<br />
&nbsp; &nbsp; &nbsp; &nbsp; print_usage()<br />
<br />
&nbsp; &nbsp; exe_path = None<br />
&nbsp; &nbsp; ext = None<br />
&nbsp; &nbsp; notify = False<br />
<br />
&nbsp; &nbsp; for o,a in opts:<br />
&nbsp; &nbsp; &nbsp; &nbsp; if o == &quot;-e&quot;:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exe_path = a<br />
&nbsp; &nbsp; &nbsp; &nbsp; elif o == &quot;-x&quot;:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ext = a<br />
&nbsp; &nbsp; &nbsp; &nbsp; elif o == &quot;-n&quot;:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notify = True<br />
<br />
&nbsp; &nbsp; if exe_path is not None and ext is not None:<br />
&nbsp; &nbsp; &nbsp; &nbsp; fuzzer = file_fuzzer( exe_path, ext, notify )<br />
&nbsp; &nbsp; &nbsp; &nbsp; fuzzer.fuzz()<br />
&nbsp; &nbsp; else:<br />
&nbsp; &nbsp; &nbsp; &nbsp; print_usage()</code><hr />
</div> Тут мы добавили возможность обработки параметров командной строки. Параметр <b>-e</b> это путь к тестируемой программе. Параметр <b>-x</b> является расширением файла, которое относится к тестируемому приложения (например, &quot;.txt&quot;, &quot;.pdf&quot;, etc). Необязательный параметр <b>-n</b> говорит фаззеру, хотим ли мы получать уведомления или нет. Теперь давайте протестируем скрипт.<br />
<br />
Лучший способ, который мне пришел в голову, чтобы протестировать на работоспособность файловый фаззер – это испытать его на целевом приложении, наблюдая за результатами мутации в действии. Не существует лучшего способа протестировать фаззинг текстовых файлов, чем использование Windows Notepad в качестве тестового приложения. Используя этот способ можно видеть изменения текста на каждой итерации, вместо того чтобы использовать для этих целей hex-редактор или утилиту двоичного сравнения (binary diffing tool). Прежде чем начать, создайте папку examples и папку crashes, в той же директории из которой вы будете запускать скрипт file_fuzzer.py. После создания каталогов, создайте и разместите несколько фиктивных тестовых файлов в папке examples. Для запуска фаззера, используйте следующую командную строку:<br />
 <br />
<div class="bbcode_container">
	<div class="bbcode_description">Код:</div>
	<hr /><code class="bbcode_code">python file_fuzzer.py -e C:\\WINDOWS\\system32\\notepad.exe -x .txt</code><hr />
</div> После чего начнет запускаться Notepad, и вы сможете видеть, как ваши тестовые файлы изменяются. Убедившись, что файлы изменяются соответствующим образом, можно взять файловый фаззер и протестировать его на любом другом целевом приложении. Позвольте закончить главу некоторыми соображениями касаемыми будущего развития для этого фаззера.<br />
<br />
<br />
<b>8.3 Соображения</b><br />
<br />
Хотя мы создали фаззер, который может найти некоторые багги, при наличии достаточного времени, есть ряд возможных улучшений, которые вы могли бы реализовать (по желанию). Думайте об этом как о возможном домашнем задании.<br />
<br />
<b><i>8.3.1 Code Coverage</i></b><br />
<br />
Покрытие кода (code coverage) – это метрика, которая измеряет, сколько выполнилось кода целевой программы во время ее тестирования. Эксперт по фаззингу Чарли Миллер (Charlie Miller) опытным путем доказал, что увеличение покрытия кода приведет к увеличению числа найденных ошибок <b>[2]</b>. Мы не можем не согласиться с капитанской логикой! Простой способ, который вы можете использовать для измерения покрытия кода, заключается в том, чтобы использовать любой из выше упомянутых отладчиков и установить программные брейкпойнты (soft breakpoints) на все функции в нутрии тестируемого приложения. Простое сохранение счетчика того, сколько функций попало в каждый тест – даст вам представление о том, насколько эффективен ваш фаззер в рамках тестируемого приложения. Есть и более сложные примеры, реализации покрытия кода, которые вы вправе применять к вашему фаззеру.<br />
<br />
<b><i>8.3.2 Automated Static Analysis</i></b><br />
<br />
Автоматизированный статический анализ двоичных файлов для нахождения горячих точек в целевом коде может быть чрезвычайно полезным для багхантера. Что-то столь же простое, как отслеживание всех вызовов функций, которые обычно не правильно используются (например, strcpy) и мониторинг за их вызовами, может дать положительные результаты. Более продвинутый статический анализ мог бы помочь в поиске других интересных участков. Чем больше ваш фаззер знает о тестируемой программе, тем больше у него шансов найти ошибки.<br />
<br />
Все выше – это только некоторые из улучшений, которые можно применить к созданному файловому фаззеру или любому другому фаззеру, который вы создадите в будущем. Когда будете создавать собственный фаззер, очень важно создать его достаточно расширяемым, чтобы можно было добавлять новую функциональность в будущем. Вы удивитесь, как часто вы будете доставать все тот же фаззер, в течении долгого времени, и вы будете благодарить себя за небольшую работу, проделанную над дизайном фронтэнда, благодаря которому можно легко вносить изменения в будущем. Теперь, когда мы самостоятельно создали простой файловый фаззер, пришло время перейти к использованию Sulley, Python-ориентированного фреймворка для фаззинга, созданного Педрамом Амини (Pedram Amini) и Араном Портным (Aaron Portnoy) из TippingPoint. После этого мы перейдем к фаззеру ioctlizer, написанному мной, который предназначен для нахождения ошибок в подпрограммах управления вводом-выводом (I/O Control Routines), которые используются во множестве драйверах Windows.<br />
<br />
<br />
© Translated by <b>Prosper-H</b> from <b>r0 Crew</b><br />
<br />
<br />
<b>[1]</b> An excellent reference book, and one you should definitely add to your bookshelf, is Mark Dowd, John McDonald, and Justin Schuh’s The Art of Software Security Assessment: Identifying and Preventing Software Vulnerabilities (Addison-Wesley Professional, 2006).<br />
<br />
<b>[2]</b> Charlie gave an excellent presentation at CanSecWest 2008 that illustrates the importance of code coverage when bughunting. See <a href="http://cansecwest.com/csw08/csw08-miller.pdf" target="_blank" rel="nofollow">http://cansecwest.com/csw08/csw08-miller.pdf</a>. This paper was part of a larger body of work Charlie co-authored. See Ari Takanen, Jared DeMott, and Charlie Miller, Fuzzing for Software Security Testing and Quality Assurance (Artech House Publishers, 2008).</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=152">Training</category>
			<dc:creator>Prosper-H</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1260</guid>
		</item>
		<item>
			<title>Написание дров linux</title>
			<link>http://forum.reverse4you.org/showthread.php?t=1259&amp;goto=newpost</link>
			<pubDate>Sun, 29 Apr 2012 17:26:40 GMT</pubDate>
			<description>У меня есть fire wire аудио карта m audio solo, хочу запустить её в перспективе под linux. Что начать читать чтобы потихонечку двигаться к цели.</description>
			<content:encoded><![CDATA[<div>У меня есть fire wire аудио карта m audio solo, хочу запустить её в перспективе под linux. Что начать читать чтобы потихонечку двигаться к цели.</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=53">Вопрос - Ответ</category>
			<dc:creator>whiteshuk</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1259</guid>
		</item>
		<item>
			<title>Проблема с установкой emacs23</title>
			<link>http://forum.reverse4you.org/showthread.php?t=1258&amp;goto=newpost</link>
			<pubDate>Sun, 29 Apr 2012 06:13:00 GMT</pubDate>
			<description>Linux version 2.6.32-40-generic (buildd@yellow) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #87-Ubuntu SMP Tue Mar 6 00:56:56 UTC 2012 
 
 
...</description>
			<content:encoded><![CDATA[<div>Linux version 2.6.32-40-generic (buildd@yellow) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) ) #87-Ubuntu SMP Tue Mar 6 00:56:56 UTC 2012<br />
<br />
<br />
<br />
abrakadabra@abrakadabra:~$ sudo apt-get install emacs23<br />
Reading package lists... Done<br />
Building dependency tree       <br />
Reading state information... Done<br />
You might want to run `apt-get -f install' to correct these:<br />
The following packages have unmet dependencies:<br />
  emacs23: Depends: emacs23-bin-common (= 23.1+1-4ubuntu7.2) but it is not going to be installed<br />
  sun-java6-jre: Depends: sun-java6-bin (&gt;= 6.21dlj-0ubuntu1~lucid1~ppa1) but it is not going to be installed or<br />
                          ia32-sun-java6-bin (&gt;= 6.21dlj-0ubuntu1~lucid1~ppa1) but it is not going to be installed<br />
                 Recommends: gsfonts-x11 but it is not going to be installed<br />
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).<br />
<br />
хотел установить emacs, пробовал изменить комманду на sudo apt-get -f install emacs (естественно не помогло)<br />
<br />
При этом в цеху у меня стоит linux mint 12 и на нем все заработало как часы с комманды sudo apt-get install emacs23<br />
<br />
Что я не так делаю, заранее спасибо!</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=53">Вопрос - Ответ</category>
			<dc:creator>whiteshuk</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1258</guid>
		</item>
		<item>
			<title>Ищем системного программиста (разработка драйверов под Windows), Москва, от 130 000</title>
			<link>http://forum.reverse4you.org/showthread.php?t=1256&amp;goto=newpost</link>
			<pubDate>Mon, 23 Apr 2012 13:42:39 GMT</pubDate>
			<description>Доброго всем дня, коллеги, 
 
Заранее извиняюсь, если не в ту тему, сложно угадать. Буду признателен, если вежливо подправите. 
 
Приглашаем опытного...</description>
			<content:encoded><![CDATA[<div>Доброго всем дня, коллеги,<br />
<br />
Заранее извиняюсь, если не в ту тему, сложно угадать. Буду признателен, если вежливо подправите.<br />
<br />
Приглашаем опытного программиста на разработку драйверов под Windows.<br />
<br />
Требования:<br />
<br />
Хорошие навыки программирования на С/ С++ / Assembler <br />
Хорошее знание отладчика windbg <br />
Знание ядра Windows <br />
Знание MS Visual Studio, WDK <br />
<br />
опыт разработки FSD - Как плюс<br />
<br />
По финансам от 130 000 гросс и выше,в зависимости от опыт специалиста + отличный соцпакет. Рассматриваются кандидаты из России и Беларуси, помощь в переезде. <br />
<br />
Буду рад ответить на вопросы, <br />
Юрий <br />
<br />
Присылайте Ваши резюме<br />
<br />
j.timirshin (тяв тяв) sqteam.ru</div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=82">Работа</category>
			<dc:creator>jtimirshin</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1256</guid>
		</item>
		<item>
			<title><![CDATA[[Вопрос] Чем упакован utorrent 3.1.3 ?]]></title>
			<link>http://forum.reverse4you.org/showthread.php?t=1255&amp;goto=newpost</link>
			<pubDate>Sun, 22 Apr 2012 02:48:10 GMT</pubDate>
			<description>Собственно сабж, 
Последнюю версию 3.1.3.27096 upx не видит что им запакован 
но вирус тотал говорил что это upx_LZMA...</description>
			<content:encoded><![CDATA[<div>Собственно сабж,<br />
Последнюю версию 3.1.3.27096 upx не видит что им запакован<br />
но вирус тотал говорил что это upx_LZMA<br />
<a href="https://www.virustotal.com/file/feb6ede30fd9e6cd664380ba5f31f78e58025b30644e309508533fe71faf3677/analysis/" target="_blank" rel="nofollow">https://www.virustotal.com/file/feb6...3677/analysis/</a><br />
<br />
<img src="http://www.isok.ru/img/full/321e7d41b1b2bba48f5bd1ad777ca626.jpg" border="0" alt="" /></div>

 ]]></content:encoded>
			<category domain="http://forum.reverse4you.org/forumdisplay.php?f=11">Reverse engineering</category>
			<dc:creator>V3T</dc:creator>
			<guid isPermaLink="true">http://forum.reverse4you.org/showthread.php?t=1255</guid>
		</item>
	</channel>
</rss>

