<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Артем Благодаренко</title>
	<atom:link href="https://artem.ufoctf.ru/feed" rel="self" type="application/rss+xml" />
	<link>https://artem.ufoctf.ru</link>
	<description>блог исследователя и разработчика</description>
	<lastBuildDate>Thu, 29 Nov 2018 13:07:46 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.3.20</generator>
	<item>
		<title>Как (не) нужно делать интерфейсы</title>
		<link>https://artem.ufoctf.ru/archives/709</link>
				<comments>https://artem.ufoctf.ru/archives/709#respond</comments>
				<pubDate>Thu, 29 Nov 2018 13:07:46 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">https://artem.ufoctf.ru/?p=709</guid>
				<description><![CDATA[И вот я послал в Уxt4 Dev List настолько плохой патч, что мне посоветовали прочитать это Rusty Rusell&#8217;s writeup, &#171;How Do I Make This Hard to Misuse&#171;: And the flip side, his &#171;What If I Don&#8217;t Actually Like My Users?&#171; Спешу поделиться с теми, кто не хочет повторять моих ошибок.]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>И вот я послал в Уxt4 Dev List настолько плохой патч, что мне посоветовали прочитать это</p>
<div>Rusty Rusell&#8217;s writeup, &#171;<a href="https://ozlabs.org/~rusty/index.cgi/tech/2008-03-30.html">How Do I Make This Hard to Misuse</a>&#171;:</div>
<div>And the flip side, his &#171;<a href="https://ozlabs.org/~rusty/index.cgi/tech/2008-04-01.html">What If I Don&#8217;t Actually Like My Users?</a>&#171;</div>
<div></div>
<div>Спешу поделиться с теми, кто не хочет повторять моих ошибок.</div>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/709/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Определяем является ли число степенью двойки</title>
		<link>https://artem.ufoctf.ru/archives/705</link>
				<comments>https://artem.ufoctf.ru/archives/705#respond</comments>
				<pubDate>Tue, 27 Nov 2018 13:02:10 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Разработка ПО]]></category>

		<guid isPermaLink="false">https://artem.ufoctf.ru/?p=705</guid>
				<description><![CDATA[Просто кусок кода, который определяет является ли число степенью двойки. if ((blocksize &#38; (blocksize - 1)) != 0) { fprintf(stderr, "%s: blocksize %lu not a power-of-two value\n", progname, blocksize); return EINVAL; } &#160;]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>Просто кусок кода, который определяет является ли число степенью двойки.</p>
<p><code><br />
if ((blocksize &amp; (blocksize - 1)) != 0) {<br />
fprintf(stderr,<br />
"%s: blocksize %lu not a power-of-two value\n",<br />
progname, blocksize);<br />
return EINVAL;<br />
}<br />
</code></p>
<p>&nbsp;</p>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/705/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Ufologists попали в финал IFSF CTF</title>
		<link>https://artem.ufoctf.ru/archives/590</link>
				<comments>https://artem.ufoctf.ru/archives/590#comments</comments>
				<pubDate>Thu, 16 Feb 2012 10:00:48 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[События]]></category>
		<category><![CDATA[IFSF CTF]]></category>
		<category><![CDATA[Ufologists]]></category>

		<guid isPermaLink="false">http://artem.ufoctf.ru/?p=590</guid>
				<description><![CDATA[Несмотря на то, что я отдалился от дел команды "Ufologists", я остаюсь ее большим болельщиком, и потому безмерно рад новости, которой хочу поделиться. В самом событии участия я не принимал (даже как наблюдатель), потому процитирую официальные новости университета.]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>Несмотря на то, что я отдалился от дел команды &#171;Ufologists&#187;, я остаюсь ее большим болельщиком, и потому безмерно рад новости, которой хочу поделиться. В самом событии участия я не принимал (даже как наблюдатель), потому процитирую официальные новости университета.</p>
<p><span style="font-size: 26px; font-weight: bold;"><em>Команда ТТИ ЮФУ «UFOlogists» заняла 5 место из 80возможных в отборочных соревнованиях IFSF CTF!</em></span></p>
<p><em>В  преддверии  Дня  компьютерщика были  проведены отборочные <a href="http://ctf.forbiddenbits.net/?scoreboard">соревнования по  информационной  безопасности IFSF CTF</a>. </em></p>
<p><em>На  протяжении  36-ти часов в  режиме онлайн  команда  Таганрогского технологического института Южного федерального университета «UFOlogists» решала задания по криптографическому анализу, администрированию сетей, реверс-иженерингу исполняемых файлов и поиску  уязвимостей веб-приложений. В упорной  борьбе  с  более  чем   80-ю  командами из  разных  уголков света  <strong>наша  команда заняла 5-е  место</strong>, тем самым  обеспечив себе  приглашение  в Тунис  для проведения финальной  части  соревнований.</em></p>
<p><em>Так же в финал попали ещё три команды  из России («More Smoked Leet Chicken» СпбГУ ИТМО, «MiT» Челябинского Государственного Университет в г.Миасс и «rdot.org» ),  две  команды  из  Франции («Big-Daddy», «Zenk-Security»), Нидерландов («Eindbazen»)   и  столь  известная  в  CTF-ных кругах команда из  США «PPP» Carnegie Mellon University.</em></p>
<p><em>Стоит  отметить, что IFSF CTF — это  первые заграничные соревнования по   информационной    безопасности столь крупного масштаба, в  которых команда «UFOlogists» была  приглашена  на  очную  часть в  финал.</em></p>
<p>От себя скажу, что это самое значимое достижения движения CTF в ТТИ ЮФУ. Поздравляю ребят от всей души. Желаю победы в финале!</p>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/590/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
							</item>
		<item>
		<title>Защита кандидатской диссертации</title>
		<link>https://artem.ufoctf.ru/archives/578</link>
				<comments>https://artem.ufoctf.ru/archives/578#comments</comments>
				<pubDate>Thu, 10 Nov 2011 12:22:45 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[Исследования]]></category>
		<category><![CDATA[События]]></category>
		<category><![CDATA[автореферат]]></category>
		<category><![CDATA[диссертация]]></category>
		<category><![CDATA[защита]]></category>

		<guid isPermaLink="false">http://artem.ufoctf.ru/?p=578</guid>
				<description><![CDATA[1 декабря в 14:20 в Таганроге в ТТИ ЮФУ]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>Уважаемые коллеги,</p>
<p>1 декабря я буду защищать свой труд на тему &#171;Разработка метода, алгоритмов и программ для автоматического поиска уязвимостей в ПО без исходного кода&#187;. Многое из того, о чем я писал в этом блоге, вошло в диссертацию. Идеи, задумки, алгоритмы и код, обросли обзорами, выводами и прочими формально нужными вещами и получилась диссертация.</p>
<p>У меня есть просьба к всем тем, кто работает в той же области знаний, что и я, либо в областях смежных. Если до 1 декабря (но чем раньше, тем лучше) у вас есть пол часа свободного времени и желание ознакомиться с моей работой (или желание помочь мне), то прочтите мой автореферат, который находится <a href="http://artem.ufoctf.ru/wp-content/uploads/BlagodarenkoPHD.pdf">здесь</a> и напишите свое мнение о нем. Мнения, помогут мне, если они будут в одной из следующих форм:</p>
<ol>
<li>Тезисно. Плюсы, минусы и замечания (много времени не займет, думаю).</li>
<li>В виде отзыва на реферат. Около 1 страницы. Шаблоны есть в сети (если надо, могу выслать). Если при этом есть возможность выслать отзыв в бумажном виде, и поставить на нем гербовую печать, то буду благодарен (адрес указан в автореферате). Если нет &#8212; то на электронную почту или иными способами.</li>
</ol>
<p>Ну и разумеется буду рад услышать любое мнение о моей работе (так же через любой из доступных видов связи).</p>
<p>Мой адрес: <strong><em>artem.blagodarenko(c)gmail.com</em></strong></p>
<p>С уважением, Артем Васильевич Благодаренко</p>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/578/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
							</item>
		<item>
		<title>Фазили, фазили … и наконец нафазили. А дальше что?</title>
		<link>https://artem.ufoctf.ru/archives/545</link>
				<comments>https://artem.ufoctf.ru/archives/545#comments</comments>
				<pubDate>Mon, 02 May 2011 15:31:13 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[Уязвимости]]></category>
		<category><![CDATA[fuzzing]]></category>
		<category><![CDATA[уязвимости]]></category>

		<guid isPermaLink="false">http://artem.ufoctf.ru/?p=545</guid>
				<description><![CDATA[Так уж получилось, что я по большей части «фаззю для того что бы фаззить». Спортивный интерес. Однако, для того что бы отделить обычные сбои от сбоев, которые могут привести к уязвимости безопасности, полезно представлять текущее положение в деле выявления возможных уязвимостей. Поэтому я написал небольшой обзор. На полноту он не претендует, но для «погружения в ...]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>Так уж получилось, что я по большей части «фаззю для того что бы фаззить». Спортивный интерес. Однако, для того что бы отделить обычные сбои от сбоев, которые могут привести к уязвимости безопасности, полезно представлять текущее положение в деле выявления возможных уязвимостей. Поэтому я написал небольшой обзор. На полноту он не претендует, но для «погружения в тему», думаю, сойдет.</p>
<p><span id="more-545"></span>Сбой в работе тестируемой программы не всегда является уязвимостью безопасности. В общем случае программный сбой относится к качеству ПО. Сбой становится уязвимостью, когда он дает одну из следующих возможностей:</p>
<ul style="margin-left: 71pt;">
<li> удаленно выполнить код;</li>
<li> инициировать отказ обслуживания;</li>
<li> обойти заданную политику безопасности (например, повысить привилегии).</li>
</ul>
<p>Вопрос автоматической классификации сбоев по рискам безопасности интересует многих исследователей [1,2,3]. Главный вопрос, который приходится решать при подобной автоматической классификации: могут ли данные, приведшие к сбою, быть изменены посредством пользовательского ввода. К примеру, предположим, что сбой произошел на следующей инструкции: <em>call [eax]</em>. Исключение 0xc0000005 &#8212; STATUS_ACCESS_VIOLATION. Произошла попытка обращения к неверному участку памяти. В случае если значение регистра eax равно NULL и логика программы не дает возможность изменить содержимое данного регистра, максимальное последствие к которому может привести сбой – отказ обслуживания. Другое дело, если значение регистра можно изменить (например, в результате переполнения). В этом случае это уже потенциальная возможность передачи управления на заданный адрес.</p>
<p>Наиболее распространенный вид сбоев – необработанное программное или аппаратное исключение. В таблице ниже приведены виды исключений и риски безопасности при данном виде сбоя[2]    .</p>
<div>
<table style="border-collapse: collapse;" border="0">
<colgroup>
<col style="width: 213px;"></col>
<col style="width: 125px;"></col>
<col style="width: 300px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border: solid 0.5pt;">Исключение</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Возможна ли эксплуатация</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: solid 0.5pt; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Комментарий</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Нарушение прав доступа для операции записи</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Практически всегда</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Попытка записи в область памяти не разрешенную для записи</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Нарушение прав доступа для операции чтения на указателе команды (нарушение прав доступа на EIP)</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Практически всегда</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Есть возможность установить EIP на заданный участок памяти</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Нарушение прав доступа для операции чтения</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Возможна</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">В случае если исключение происходит при копировании с префиксом rep при большом ecx или, если читаемое значение позже используется как счетчик</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;"></td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Не возможна</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">При чтении по нулевому адресу или по неизменяемому адресу</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Деление на нуль</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Не возможна</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Если обработчик не подменен</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: solid 0.5pt; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Исключение C++</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Не возможна</td>
<td style="padding-left: 7px; padding-right: 7px; border-top: none; border-left: none; border-bottom: solid 0.5pt; border-right: solid 0.5pt;">Если обработчик не подменен</td>
</tr>
</tbody>
</table>
</div>
<p>Таким образом, при анализе сбоя на предмет возможности эксплуатации можно пользоваться схемой, изображенной на рисунке 1.</p>
<p style="text-align: center;"><img src="http://artem.ufoctf.ru/wp-content/uploads/2011/05/050211_1530_11.png" alt="" /><span style="font-size: 14pt;"><br />
</span></p>
<p>Рисунок 1 – Схема анализа сбоя на возможность эксплуатации[2]</p>
<p style="text-align: center;">&nbsp;</p>
<p>Задача автоматического определения возможности влияния пользовательскими данными на данные, приводящие к сбою, успешно решается с помощью taint-анализа[3].  Суть метода заключается в анализе параметров инструкций и оценке их влияния друг на друга. В качестве параметров инструкции могут выступать следующие контейнеры:</p>
<ul style="margin-left: 71pt;">
<li> регистры процессора общего назначения;</li>
<li> специальные регистры, такие как EFLAGS;</li>
<li> ячейки памяти;</li>
</ul>
<p>Параметры, явные и неявные, разделяются на входные и выходные. Значение контейнеров входных параметров получается либо на предыдущих шагах программы, либо являются константами. Любые данные получаемые от пользователя (через поля ввода, из фалов, из сети) считаются не доверительными, контейнеры в которые они располагаются, помечаются. Далее, если помеченные контейнеры участвуют в операции и влияют на результат, то контейнер результата так же получает метку. Метка может быть отменена, если в контейнер будут помещены данные из непомеченного контейнера. Рассмотрим пример:</p>
<p><code><br />
mov ebx, eax<br />
add ecx, ebx<br />
xor eax, eax<br />
mov [ecx],9090h<br />
</code><br />
Будем считать, что регистр eax получил свое значение из пользовательского ввода (например, через параметр функции), а значит он автоматически помечается. Оператор <em>mov ebx, eax</em> копирует значение регистра <em>eax</em> в <em>ebx.</em> После этой  операции <em>ebx</em> так же следует пометить. Оператор <em>xor eax, eax </em>действует так же как mov eax, 0. В eax помещается значение, на которое априори не может повлиять пользовательский ввод. С этого момента регистр eax теряет метку. Однако <em>ecx</em> все еще отмечен и по этой причине команда <em>mov [ecx], 9090h</em> является уязвимым местом, она позволяет записать 9090h (две операции nop) в область памяти, которую можно задать через пользовательский ввод.</p>
<p>Taint-анализ используется во многих утилитах[1, 3, 5]. Для анализа дампов сбоев такой анализ используется в модуле !exploitable[ 1 ] для отладчика WinDbg компании Microsoft. Модуль позволяет выполнить следующие основные функции:</p>
<ul style="margin-left: 71pt;">
<li> из наборов дампов для сбоев выделить уникальные;</li>
<li> оценить риск  безопасности для сбоя по шкале: может быть использован, вероятно может быть использован, вероятно не может быть использован, не может быть использован.</li>
</ul>
<p>Другой модуль для того же отладчика vdt_trace[3] позволяет отследить поток данный и предоставляет данные необходимые для подготовки эксплоита.</p>
<ol style="margin-left: 75pt;">
<li>
<div style="text-align: justify;">Страница проекта Microsoft !exploitable. <a href="http://msecdbg.codeplex.com">http://msecdbg.codeplex.com</a>.</div>
</li>
<li>
<div style="text-align: justify;">Abouchaev, Adel; Hasse, Damian; Lambert, Scott; Wroblewski, Greg. Analyze crashes to find security vulnerabilities in your apps. http://msdn.microsoft.com/en-us/magazine/cc163311.aspx</div>
</li>
<li>
<div style="text-align: justify;">Rodrigo Rubira Branco. Dynamic Program Analysis and Software Exploitation. 2010.</div>
</li>
<li>
<div style="text-align: justify;">Страница проекта WinAppDbg. sourceforge.net/projects/winappdbg/.</div>
</li>
</ol>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/545/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
							</item>
		<item>
		<title>&#171;Выбор точки внедрения при фаззинге в памяти&#187; на РусКрипто 2011</title>
		<link>https://artem.ufoctf.ru/archives/532</link>
				<comments>https://artem.ufoctf.ru/archives/532#comments</comments>
				<pubDate>Sun, 03 Apr 2011 16:35:32 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[События]]></category>

		<guid isPermaLink="false">http://artem.ufoctf.ru/?p=532</guid>
				<description><![CDATA[Я вернулся с РусКрипто 2011. Ощущений море. Напишу здесь коротко именно о докладе. В целом &#8212; очень понравилось. Понравилось, что были люди, с которыми можно было поговорить по теме. Это счастливая случайность, наверное, потому что конференция в большей степени криптографическая. По сравнению с предыдущими секциями, где фирмы и организации порой &#171;кусали&#187; друг друга, секция &#171;Реверсинг. ...]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>Я вернулся с РусКрипто 2011. Ощущений море. Напишу здесь коротко именно о докладе. В целом &#8212; очень понравилось. Понравилось, что были люди, с которыми можно было поговорить по теме. Это счастливая случайность, наверное, потому что конференция в большей степени криптографическая.</p>
<p>По сравнению с предыдущими секциями, где фирмы и организации порой &#171;кусали&#187; друг друга, секция &#171;Реверсинг. Анализ исполняемого кода и технологии защиты&#187; выглядела как дружеская беседа. Доклад слушали, задавали вопросы. Было интересно. Потом была возможность пообщаться подробнее с остальными докладчиками секции Алексеем Чиликовым и Маньковом Евгением.</p>
<p>Выкладываю сюда <a href="http://artem.ufoctf.ru/wp-content/uploads/RusCryptoInMemoryFuzzing.ppt">презентацию с доклада</a>. Позже она появиться и на <a href="http://www.ruscrypto.org">сайте конференции</a>, но думаю это произойдет не сразу. Снимали и видео. Не знаю, может и оно появится на сайте. Все что было на слайдах упоминалось так или иначе в этом блоге. Если нужно что-то пояснить, то отвечу на любые вопросы. Проверить правдивость сказанного в презентации можно на последней версии dataflow.</p>
<p>Спасибо кафедре <a href="http://bit.tsure.ru">БИТ ТТИ ЮФУ</a> за возможность участвовать в конференции, организаторам РусКрипто 2011 за интересное событие, докладчикам секции за интересные доклады, посетившим секции за интерес и мнения.</p>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/532/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
							</item>
		<item>
		<title>Ufologists в финале РусКрипто CTF 2011!</title>
		<link>https://artem.ufoctf.ru/archives/522</link>
				<comments>https://artem.ufoctf.ru/archives/522#comments</comments>
				<pubDate>Fri, 18 Mar 2011 14:12:15 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[Ufologists]]></category>
		<category><![CDATA[РусКрипто]]></category>

		<guid isPermaLink="false">http://artem.ufoctf.ru/?p=522</guid>
				<description><![CDATA[Буквально только что закончились отборочные РусКрипто CTF 2011 и я не могу не похвастаться 😉 Ufologists едут на финал! Ребята уступили лишь HackerDom ( им уступить не стыдно 😉 ) в стратегической борьбе &#171;пости ответы меньше будешь выше&#187;. О правиле узнали лишь после того, как оказались на второй позиции, иначе бы не упустили своей позиции. ...]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>Буквально только что закончились отборочные РусКрипто CTF 2011 и я не могу не похвастаться <img src="https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ufologists едут на финал! Ребята уступили лишь HackerDom ( им уступить не стыдно <img src="https://s.w.org/images/core/emoji/12.0.0-1/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ) в стратегической борьбе &#171;пости ответы меньше будешь выше&#187;. О правиле узнали лишь после того, как оказались на второй позиции, иначе бы не упустили своей позиции.</p>
<p>В финале оказались:</p>
<p>1) HackerDom (Уральский государственный университет им. А.М. Горького, г. Екатеринбург)</p>
<p>2) Ufologists (Технологический Институт Южного Федерального Университета в г. Таганроге, г. Таганрог)</p>
<p>3) [Censored] (Балтийский федеральный университет имени И. Канта, г.  Калининград)</p>
<p>4) SiBears (Томский государственный университет, г.  Томск)</p>
<p>5) Bushwhackers (Московский государственный университет имени М.В. Ломоносова,  г.  Москва)</p>
<p>Поздравляю команды и до встречи в финале!</p>
<p>Описание задания T4 <a href="http://antoxar.blogspot.com/2011/03/ruscryptoctf-t4-task.html">в блоге Антона Речкова</a>.</p>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/522/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
							</item>
		<item>
		<title>РусКрипто&#8217;2011</title>
		<link>https://artem.ufoctf.ru/archives/509</link>
				<comments>https://artem.ufoctf.ru/archives/509#comments</comments>
				<pubDate>Wed, 16 Mar 2011 21:11:39 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[События]]></category>
		<category><![CDATA[доклады]]></category>
		<category><![CDATA[Конференции]]></category>
		<category><![CDATA[РусКрипто]]></category>

		<guid isPermaLink="false">http://artem.ufoctf.ru/?p=509</guid>
				<description><![CDATA[Конференция РусКрипто&#8217;2011 пройдет с 30 марта по 2 апреля в Московской области в гостиничном комплексе «Солнечный Park Hotel &#38; SPA 4*». Конференция посвящена компьютерной безопасности. Есть секции по общим вопросам, по криптографии, по безопасности интренета, по учебе, по академическим проектам и по реверсивной инженерии. В последней секции с докладом буду выступать я. Тема моего доклада: ...]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>Конференция <a href="http://www.ruscrypto.org/conference/">РусКрипто&#8217;2011 </a>пройдет с 30 марта по 2 апреля в Московской области в гостиничном комплексе «Солнечный Park Hotel &amp; SPA 4*». Конференция посвящена компьютерной безопасности. Есть секции по общим вопросам, <a href="http://www.ruscrypto.org/conference/program/theory-and-practice/">по криптографии</a>, <a href="Интернет и информационная безопасность">по безопасности интренета</a>, <a href="http://www.ruscrypto.org/conference/program/teaching/">по учебе</a>, по <a href="http://www.ruscrypto.org/conference/program/academy/">академическим проектам </a>и по<a href="http://www.ruscrypto.org/conference/program/reversing/"> реверсивной инженерии</a>.</p>
<p>В последней секции с докладом буду выступать я. Тема моего доклада: &#171;Выбор точки внедрения для фаззинга в памяти&#187;. Официальная аннотация:</p>
<blockquote><p>В данной работе предлагается алгоритм выбора точки программы для тестирования методом черного ящика. На основе статического и динамического анализа собираются данные о связях функций. Анализ связей позволяет построить рейтинг потенциального покрытия кода при тестировании методом черного ящика, начиная с заданной точки.</p></blockquote>
<p>Доклад планирую немного расширить относительно заданной темы. Расскажу о фаззинге в памяти, о том какие проблемы возникают. Расскажу о том, что я сделал, чтобы фаззить в памяти стало легче, ну и о выборе точки внедрения. Примеры.</p>
<p>В программе конференций насторожило количество докладов в моей секции ( всего 3! ). Возможно, остальные участвуют в конкурсе докладов и появятся позже? Знаю так же, что точно намечается<a href="http://andrepetukhov.wordpress.com/2011/03/16/доклад-на-рускрипто2011/?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+wordpress%2Fandrewpetukhov+%28%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C+%D0%B2%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9%3A+%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE+%D0%BE+%D1%81%D0%BB%D0%BE%D0%B6%D0%BD%D0%BE%D0%BC%29"> интересный анализ сканеров SQL-инъекций от Андрея Петухова</a>.</p>
<p>Так же в рамках конференции будут соревнования CTF. Кто будет участвовать в финале пока не известно, так как отборочные  18 марта в пятницу. В отборочных примут участие две команды с нашего университета:<a href="http://ufoctf.ru"> Ufologists</a> и <a href="http://biton-team.ru/">BitOn</a>. Удачных флагов!</p>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/509/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
							</item>
		<item>
		<title>Как разрешить регистры MSR в Virtual Box</title>
		<link>https://artem.ufoctf.ru/archives/502</link>
				<comments>https://artem.ufoctf.ru/archives/502#respond</comments>
				<pubDate>Sun, 13 Mar 2011 23:30:10 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[Разработка ПО]]></category>
		<category><![CDATA[MSR]]></category>
		<category><![CDATA[Virtual Box]]></category>

		<guid isPermaLink="false">http://artem.ufoctf.ru/?p=502</guid>
				<description><![CDATA[MSR ( model specific register ) &#8212; регистры процессора специфичные для данного типа процессора. Virtual Box &#8212; программное обеспечение для виртуализации. Virtual Box 4.0.4 и более ранние версии игнорируют большинство регистров MSR. Хотя мог бы разрешать доступ к регистрам хостовой системы. Однако, процессоров много и каждый имеет свой собственный набор регистров MSR и потому проще ...]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p>MSR ( model specific register ) &#8212; регистры процессора специфичные для данного типа процессора.</p>
<p>Virtual Box &#8212; программное обеспечение для виртуализации.</p>
<p>Virtual Box 4.0.4 и более ранние версии игнорируют большинство регистров MSR. Хотя мог бы разрешать доступ к регистрам хостовой системы. Однако, процессоров много и каждый имеет свой собственный набор регистров MSR и потому проще запретить все, что не относится к стандартному набору, так безопаснее.</p>
<p>Иногда  хочется запустить в виртуальной машине и отладить <a href="http://artem.ufoctf.ru/?p=485">что-нибудь, что работает с MSR</a>. При этом, например, известно какие регистры нужно использовать и насколько безопасно их использовать из виртуальной машины. Если бы нужно было бы использовать VMWare, то с мыслю этой пришлось бы попрощаться( если конечно не мил подход реверсить-патчить-реверсить-патчить). Но, к счастью, Virtual Box предоставляется с исходниками. Правда только Virtual Box OSE. Не беда, будем использовать его. А именно две версии: 3.2.8 ( стандартный для Ununtu 10.10 ) и 4.0.4 ( последняя версия на момент написание текста ).<span id="more-502"></span> Сразу же предупрежу: НЕ ПЫТАЙТЕСЬ СОБРАТЬ VIRTUAL BOX НА WINDOWS. Я потратил на это неблагодарное дело 4 дня и не добился результатов. Попробовал в Linux &#8212; сразу же все получилось. На Windows пытался качать, устанавливать миллион зависимостей, пока не наткнулся на ветку форума, где в итоге было сказано  &#171;мы используем свои внутренние тулзы для сборки дистрибутивов для Windows. Мило &#8230;</p>
<p>Так вот, под Linux <a href="http://www.virtualbox.org/wiki/Linux%20build%20instructions">все просто</a>. Делаем все по инструкции. Пробовал для i386 и x64. Продукт собирается и запускается.</p>
<p>Перейдем теперь непосредственно к тому, что патчить. Путем простых умозаключений стало понятно, что если что-то править то в файле src/VBox/VMM/VMMR0/HWVMXR0.cpp. Путь у него и имя говорящие. Номера регистров для вашего процессора можно найти в мануле от  &#171;<a href="http://www.intel.com/Assets/PDF/manual/253669.pdf">Intel® 64 and IA-32 Architectures Software Developer&#8217;s Manual Volume 3B: System Programming Guide, Part 2</a>&#171;. Для моего i3 я получил значения, общие для всего семейства i7</p>
<pre class="brush:cpp">#define MSR_LASTBRANCH_TOS 0x1c9
#define MSR_LASTBRANCH_0_FROM_IP 0x680
#define MSR_LASTBRANCH_1_FROM_IP 0x681
#define MSR_LASTBRANCH_2_FROM_IP 0x682
#define MSR_LASTBRANCH_3_FROM_IP 0x683
#define MSR_LASTBRANCH_4_FROM_IP 0x684
#define MSR_LASTBRANCH_5_FROM_IP 0x685
#define MSR_LASTBRANCH_6_FROM_IP 0x686
#define MSR_LASTBRANCH_7_FROM_IP 0x687
#define MSR_LASTBRANCH_8_FROM_IP 0x688
#define MSR_LASTBRANCH_9_FROM_IP 0x689
#define MSR_LASTBRANCH_10_FROM_IP 0x68a
#define MSR_LASTBRANCH_11_FROM_IP 0x68b
#define MSR_LASTBRANCH_12_FROM_IP 0x68c
#define MSR_LASTBRANCH_13_FROM_IP 0x68d
#define MSR_LASTBRANCH_14_FROM_IP 0x68e
#define MSR_LASTBRANCH_15_FROM_IP 0x68f

#define MSR_LASTBRANCH_0_TO_IP 0x6c0
#define MSR_LASTBRANCH_1_TO_IP 0x6c1
#define MSR_LASTBRANCH_2_TO_IP 0x6c2
#define MSR_LASTBRANCH_3_TO_IP 0x6c3
#define MSR_LASTBRANCH_4_TO_IP 0x6c4
#define MSR_LASTBRANCH_5_TO_IP 0x6c5
#define MSR_LASTBRANCH_6_TO_IP 0x6c6
#define MSR_LASTBRANCH_7_TO_IP 0x6c7
#define MSR_LASTBRANCH_8_TO_IP 0x6c8
#define MSR_LASTBRANCH_9_TO_IP 0x6c9
#define MSR_LASTBRANCH_10_TO_IP 0x6ca
#define MSR_LASTBRANCH_11_TO_IP 0x6cb
#define MSR_LASTBRANCH_12_TO_IP 0x6cc
#define MSR_LASTBRANCH_13_TO_IP 0x6cd
#define MSR_LASTBRANCH_14_TO_IP 0x6ce
#define MSR_LASTBRANCH_15_TO_IP 0x6cf</pre>
<p>Вставить дефайны можно где-нибудь в обозначенном файле. Номера регистров есть. Теперь нужно дать указание Virtual Box &#171;прокидывать&#187; их в хост.</p>
<p>&nbsp;</p>
<pre class="brush:cpp">/* Nehalem family DEBUG MSRs */
vmxR0SetMSRPermission(pVCpu, MSR_IA32_DEBUGCTL, true, true);

vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_TOS, true, false);

vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_0_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_1_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_2_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_3_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_4_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_5_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_6_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_7_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_8_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_9_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_10_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_11_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_12_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_13_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_14_FROM_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_15_FROM_IP, true, false);

vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_0_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_1_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_2_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_3_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_4_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_5_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_6_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_7_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_8_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_9_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_10_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_11_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_12_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_13_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_14_TO_IP, true, false);
vmxR0SetMSRPermission(pVCpu, MSR_LASTBRANCH_15_TO_IP, true, false);</pre>
<p>Параметры &#171;true, false&#187; означают доступ для чтения, если нужна запись, то добавляем &#171;true, true&#187;. Вставляем их в группу подобных вызовов.<br />
Теперь можно пересобрать, перезагрузить драйвера и все должно работать.</p>
<p>Что бы упросить задачу выкладываю патчи для <a href="http://artem.ufoctf.ru/wp-content/uploads/VirtualBox-4.0.4_OSE-enable-MSR-i7.diff.bz2">virtual box 3.2.8</a> и <a href="http://artem.ufoctf.ru/wp-content/uploads/virtualbox-ose_3.2.8-dfsg-enable-MSR-i7.diff.bz2">virtual box 4.0.4</a>. Качаем их в папку с исходниками и выполняем: <em>patch -p1 &lt; virtualbox-ose_3.2.8-dfsg-enable-MSR-i7.diff</em> или <em>patch -p1 &lt; VirtualBox-4.0.4_OSE-enable-MSR-i7.diff</em>.</p>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/502/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>IKWYD: Он знает о каждом шаге программы</title>
		<link>https://artem.ufoctf.ru/archives/485</link>
				<comments>https://artem.ufoctf.ru/archives/485#comments</comments>
				<pubDate>Sun, 13 Mar 2011 21:07:06 +0000</pubDate>
		<dc:creator><![CDATA[artem]]></dc:creator>
				<category><![CDATA[Исследования]]></category>
		<category><![CDATA[int 1]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[IOCTL]]></category>
		<category><![CDATA[MSR]]></category>
		<category><![CDATA[отладко]]></category>
		<category><![CDATA[оценка покрытия]]></category>

		<guid isPermaLink="false">http://artem.ufoctf.ru/?p=485</guid>
				<description><![CDATA[Цель: создание инструмента для изменения покрытия кода программы. Ограничение: имеется только исполняемый код, исходных кодов нет. Требования: простота, скорость, точность. Что нам может предложить процессор Процессоры Intel предоставляют специальные возможности для отладки и измерения эффективности приложений[Intel® 64 and IA-32 Architectures Software Developer&#8217;s Manual Volume 3A: System Programming Guide, Part 1 ]. Доступ к ним осуществляется ...]]></description>
								<content:encoded><![CDATA[<div class="entry">
<p><strong>Цель:</strong> создание инструмента для изменения покрытия кода программы.</p>
<p><strong>Ограничение:</strong> имеется только исполняемый код, исходных кодов нет.</p>
<p><strong>Требования:</strong> простота, скорость, точность.<span id="more-485"></span></p>
<p><strong>Что нам может предложить процессор</strong></p>
<p>Процессоры Intel предоставляют специальные возможности для отладки и измерения эффективности приложений[<a href="http://www.intel.com/Assets/PDF/manual/253668.pdf">Intel® 64 and IA-32 Architectures Software Developer&#8217;s Manual Volume 3A: System Programming Guide, Part 1 </a>]. Доступ к ним осуществляется через регистры DB0-DB7, а так же через ряд специфичных для модели процессора регистров (MSR). Следующие основные возможности предоставляются:</p>
<ul>
<li>исключение отладки (#DB) — передает управление программы на процедуру отладчика в момент возникновения отладочного события;</li>
<li>исключение точки отладки (#BP) — см. описание инструкции точки останова (int 3) ниже;</li>
<li>регистры адресов точек остановки (DR0 &#8212; DR3) — определяют адреса до 4 точек остановки;</li>
<li>регистр статуса отладки (DR6) — отображает условия возникновения исключения отладки или точки остановка. Бит BS (бит 14) регистра указывает на то, что исключение было сгенерировано после возведения флага TF;</li>
<li>регистр управления отладкой (DR7) — задает области памяти или порты ввода-вывода, для которых генерируется отладочные события;</li>
<li>флаг T (trap) в TSS — генерировать отладочное событие (#DB) когда происходит попытка переключиться в поток с установленным флагом T в TSS;</li>
<li>Флаг RF (resume) в регистре EFLAGS — предотвращает повторную генерацию исключения на одной и той же инструкции;</li>
<li>флаг TF (trap) в регистре EFLAGS — генерирует отладочное исключение(#DB) после исполнения каждой инструкции;</li>
<li>инструкция точки останова (int 3) — генерирует исключение точки останова (#BP), которое передает управление процедуре или задаче отладчика. Инструкция используется, когда регистров точек останова не достаточно. На основе данной инструкции был реализован метод динамического анализа, описанный в предыдущих главах;</li>
<li>сохранение информации о последних исполненных ветвях, прерываниях или исключениях в стеке регистров MSR LBR ( last branch record ). Запись в LBR состоит из адреса «откуда был совершен переход» и адреса «куда был совершен переход».  Данная информация так же может быть доставлена с помощью сообщений BTM;</li>
</ul>
<p>Исключение отладки (#DB) обрабатывает вектор прерывания int 1. Здесь отладчики уровня ядра размещают свой код, реализующий логику отладки. Для определения причины исключения используется регистр статуса отладки (DR6). Процессор генерирует исключение отладки во время исполнения инструкции при условии, что взведен флаг TF в регистре EFLAGS. Данное исключение является «исключением-ловушкой»(trap), потому что генерируется после того, как инструкция была исполнена. Процессор не генерирует исключение после инструкций, которые устанавливают флаг TF. К примеру, исключение не произойдет после инструкции POPF. Процессор очищает флаг TF перед тем, как вызывать обработчик int 1. В случае, если одновременно вызываются два прерывания (int 3 и int 1), то прерывание int 1 будет обрабатываться первым.</p>
<p>Особый интерес представляют специальные возможности процессора для отслеживания последних ветвей исполнения.  На рисунке ниже дан пример дизассемблированного кода, представленного в виде линейных блоков ( ветвей ) и связей между ними.</p>
<p><a href="http://artem.ufoctf.ru/wp-content/uploads/2011/03/Pic1.jpg"><img class="aligncenter wp-image-486 size-medium" src="http://artem.ufoctf.ru/wp-content/uploads/2011/03/Pic1-300x192.jpg" alt="Pic1" width="300" height="192" srcset="https://artem.ufoctf.ru/wp-content/uploads/2011/03/Pic1-300x192.jpg 300w, https://artem.ufoctf.ru/wp-content/uploads/2011/03/Pic1-150x96.jpg 150w, https://artem.ufoctf.ru/wp-content/uploads/2011/03/Pic1.jpg 569w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p>Впервые возможность устанавливать точки останова на заданные ветви, прерывания, исключения, а так же при переходе от одной ветви к другой была введена в процессоры семейства P6. Данная возможность была улучшена в следующих процессорах: Pentium 4, Intel Xeon, Pentium M, Intel® CoreTM Solo, Intel® CoreTM Duo, Intel® CoreTM2 Duo, Intel® CoreTM i7, а так же Intel® AtomTM. Данные процессоры имеют схожий набор функционала по отслеживанию ветвей. Различаться могут размер стека для хранения данных о последних ветвях LBR, а так же набор аппаратно специфичных регистров, используемых для управления возможностями. Далее в тексте, будет дано общее описание возможностей процессоров вышеперечисленных семейств. Специфичные возможности и параметры будут представлены на примере процессора Intel Core i7.</p>
<p>MSR-регистр IA32_DEBUGCTL предоставляет собой битовое поле для управления расширенными возможностями отладки. Регистр имеет номер 01D9h и содержит следующие важные биты (для всех поддерживаемых процессоров):</p>
<ul>
<li>флаг LBR (последняя ветвь, прерывание, исключение) (bit 0). Если данный бит установлен, то процессор записывает информацию о последних ветвях, прерываниях и исключениях. Формат стека LBR специфичен для процессора и описан ниже;</li>
<li>флаг BTF (трассировка по ветвям) (bit 1). Если данный флаг установлен, то процессор воспринимает флаг TF из регистра EFLAGS как «трассировку по ветвям» вместо «трассировки по инструкциям». Данный механизм позволит значительно сократить накладные расходы при трассировке, когда нет необходимости трассировать каждую инструкцию;</li>
<li>флаг TR (включение сообщений трассировки) (bit 6). Если данный флаг установлен, задействован механизм сообщений трассировки. На каждую ветвь, прерывание или исключение процессор шлет сообщение через системную шину в формате BTM;</li>
<li>флаг BTS (хранилище трассировки ветвей) (bit 7). Если данный флаг установлен, то процессор сохраняет BTM в специальный буфер в памяти BTS;</li>
<li>флаг BTINT (исключение трассировки ветвей)  (bit 8). Если данный флаг установлен, то процессор генерирует исключение при заполнении буфера BTS.</li>
</ul>
<p>В случае, если флаг LBR (bit 0) из регистра IA32_DEBUGCTL MSR установлен, процессор начинает автоматически записывать данные об исполненных ветвях, прерываниях и исключениях  в стеке регистров MSR LBR. Когда процессор генерирует исключение отладки (#DB), он автоматически очищает флаг LBR до запуска обработчика исключения. Стек MSR-регистров при этом не очищается, что позволяет проводить анализ сохраненных значений. Если LBR сброшен, а TR установлен, то процессор продолжает заполнять LBR, потому что данный стек используется при генерации BTM. Прерывание #DB не очищает данный флаг автоматически.</p>
<p>Процессоры семейства i7 (ядро Nehalem) предоставляют 16 пар регистров MSR[<a href="http://www.intel.com/Assets/PDF/manual/253669.pdf">Intel® 64 and IA-32 Architectures Software Developer&#8217;s Manual Volume 3B: System Programming Guide, Part 2</a> ] для сохранения данных о последних исполненных ветвях кода. Формат данных в регистрах, содержащих значение о месте программы, откуда было передано управление, представлено в следующей таблице.</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="159">Битовое поле</td>
<td valign="top" width="169">Битовое смещение</td>
<td valign="top" width="85">Доступ</td>
<td valign="top" width="224">Описание</td>
</tr>
<tr>
<td valign="top" width="159">Data</td>
<td valign="top" width="169">47:0</td>
<td valign="top" width="85">чтение</td>
<td valign="top" width="224">Адрес, откуда было передано управление</td>
</tr>
<tr>
<td valign="top" width="159">SIGN_Ext</td>
<td valign="top" width="169">62:48</td>
<td valign="top" width="85">чтение</td>
<td valign="top" width="224">Знаковое расширение данного регистра</td>
</tr>
<tr>
<td valign="top" width="159">MISPRED</td>
<td valign="top" width="169">63</td>
<td valign="top" width="85">чтение</td>
<td valign="top" width="224">Устанавливается, если переход бы предсказан</td>
</tr>
</tbody>
</table>
<p>Формат данных в регистрах, содержащих значение о месте программы, куда было передано управление, отличается от представленного выше отсутствием поля MISPPRED.</p>
<p>Текущее положение в стеке хранится в регистре MSR_LASTBRANCH_TOS. Номера специфичных для i7 регистров представлены в следующей таблице.</p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top" width="73">Номер</td>
<td valign="top" width="246">Имя</td>
<td valign="top" width="319">Описание</td>
</tr>
<tr>
<td valign="top" width="73">1C9h</td>
<td valign="top" width="246">MSR_LASTBRANCH_TOS</td>
<td valign="top" width="319">Указатель стека LBR</td>
</tr>
<tr>
<td valign="top" width="73">680h</td>
<td valign="top" width="246">MSR_LASTBRANCH_0_FROM_IP</td>
<td valign="top" width="319">Часть стека LBR (первый элемент), содержащая адрес памяти, из которого был совершен переход</td>
</tr>
<tr>
<td valign="top" width="73">6C0h</td>
<td valign="top" width="246">MSR_LASTBRANCH_0_TO_IP</td>
<td valign="top" width="319">Часть стека LBR (первый элемент), содержащая адрес памяти, на который был совершен переход</td>
</tr>
</tbody>
</table>
<p><strong> Что с этим можно сделать</strong></p>
<p>Наиболее точным способом зафиксировать каждую исполненную процессором инструкцию (а именно эта статистика, фактически, является оценкой покрытия кода) было бы трассировать каждый шаг исполнения процессора. Для этих целей в современных процессорах семейства PC используется флаг трассировки. Однако, применение данного способа связано с большими накладными расходами на обработку исключений на каждом шаге процессора, что приводит к невозможности использования его для оценки реальных приложений.</p>
<p>Существует возможность уменьшить накладные расходы путем инициирования исключения трассировки только в начале каждого линейного блока. Линейный блок, получивший управление, считается покрытым, так как в его пределах нет инструкций передачи управления и, следовательно, каждая его инструкция будет исполнена. Таким образом, данный подход не уменьшает точности оценки покрытия.</p>
<p>Для решения различных задач полезно знать не только адрес, куда был совершен переход при передаче управления, но и исходный адрес. Для этих целей удобно использовать стек MSR-регистров LBR. Значение на вершине этого стека будет содержать адрес перехода и исходный адрес.</p>
<p>Значения приведенных выше MSR-регистров доступны только из режима ядра. При реализации алгоритма оценки покрытия только в режиме ядра неизбежны следующие проблемы:</p>
<ul>
<li>cложность идентификации контекста (процесса и потока ) в котором выполняется обработчик прерывания int 3;</li>
<li>cложность идентификации модуля к которому принадлежит исполняемый код.</li>
</ul>
<p>Данные проблемы, а так же возможность использования наработок для статического и динамического анализа программ пользовательского режима, обуславливают использование архитектуры системы, где имеются две главные части:</p>
<ul>
<li>отладчик пользовательского режима. Эта часть системы отвечает за старт процесса, фиксирование фактов загрузки модулей, старта процессов и потоков;</li>
<li>обработчик прерывания int 1. Эта часть системы отвечает за чтение данных из LBR и передачу пользовательскую часть.</li>
</ul>
<p>Отладчик пользовательского режима решает еще одну важную задачу – взвод флага TF для исследуемого потока. Флаг TF взводится отладчиком для потока сразу после его старта. Тот факт, что отладчик реализован в пользовательском режиме упрощает задачу выделения из всех потоков только те, что относятся к исследуемой программе.</p>
<p>После того как флаг TF установлен и инструкция исполнена, управление получает часть системы, расположенная в ядерном адресном пространстве. Здесь фиксируется информация о переходе. После этого необходимо установить флаг BTF, который сбрасывается перед передачей управления обработчику int 1.</p>
<p>После этого управление снова получает отладчик пользовательского режима. Здесь сохраняется информация о переходе, проводится необходимый анализ и взводится флаг TF. Общая схема работы систем представлена на рисунке ниже.</p>
<div class="page" title="Page 63"> <a href="http://artem.ufoctf.ru/wp-content/uploads/2011/03/hardware_debug.png"><img class="alignnone wp-image-669" src="http://artem.ufoctf.ru/wp-content/uploads/2011/03/hardware_debug.png" alt="hardware_debug" width="300" height="234" /></a></div>
<p>Обмен между подсистемой, расположенной в ядре,  и подсистемой пользовательского режима происходит через стандартный механизм ioctl. Получение предыдущей ветви выполняется при обработке шага трассировки в пользовательском режиме. Это дает возможность получить данные для последнего перехода.</p>
<p><strong>Что в итоге получилось</strong></p>
<p>Реализованная утилита проста и наглядна. Называется она <a href="http://artem.ufoctf.ru/?wpdmdl=607">IKWYD-0.2.0</a> (<a href="http://artem.ufoctf.ru/?wpdmdl=622">исходные коды</a>). Консольная программа принимает один аргумент &#8212; коммандная строка для запуска исселдуемой программы. Утилита сама подгружает драйвер при старте и выгружает при завершении работы.  Скомпилированный проект, исходные коды и описание может быть загружено <a href="http://artem.ufoctf.ru/archives/download/ikwyd-0-2-0">со страницы проекта</a>.</p>
<p>Из известных минусов на данный момент: драйвер не правильно работает на многопроцессорных системах &#8212; требуется доработка. Утилита значительно притормаживает из-за того что флаг TF взводится в пользовательском режиме. Если кто-то знает, как это сделать в драйвере &#8212; обязательно расскажите мне об этом!</p>
<p>Буду рад услышать любой фидбэк.</p>
</div>
]]></content:encoded>
							<wfw:commentRss>https://artem.ufoctf.ru/archives/485/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
							</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.w3-edge.com/products/

Object Caching 0/169 objects using apc
Page Caching using disk: enhanced (SSL caching disabled) 
Database Caching 1210/1358 queries in 1.148 seconds using memcached

Served from: artem.ufoctf.ru @ 2026-03-02 09:18:12 by W3 Total Cache
-->