<?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>Segmentation fault &#187; Publications</title>
	<atom:link href="http://www.segmentationfault.fr/categories/publications/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.segmentationfault.fr</link>
	<description>Projets d’un consultant en sécurité informatique</description>
	<lastBuildDate>Fri, 15 Feb 2019 08:02:10 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Reversing Google Play and Micro-Protobuf applications</title>
		<link>http://www.segmentationfault.fr/publications/reversing-google-play-and-micro-protobuf-applications/</link>
		<comments>http://www.segmentationfault.fr/publications/reversing-google-play-and-micro-protobuf-applications/#comments</comments>
		<pubDate>Wed, 19 Sep 2012 20:11:23 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Publications]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[androguard]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[protobuf]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=946</guid>
		<description><![CDATA[I recently released a Google Play Unofficial Python API, which aims at providing a way for developers to query Google&#8217;s official Android application store. Such projects already exist, but they are all based on the previous version (&#171;&#160;Android Market&#160;&#187;), and are therefore limited. My goal was to adapt those projects and port them to the [...]]]></description>
			<content:encoded><![CDATA[<p>I recently released a <a href="https://github.com/egirault/googleplay-api/">Google Play Unofficial Python API</a>, which aims at providing a way for developers to query Google&rsquo;s official Android application store. Such projects already exist, but they are all based on the previous version (&laquo;&nbsp;Android Market&nbsp;&raquo;), and are therefore limited. My goal was to adapt those projects and port them to the last version of Google Play.</p>
<p>This article first highights the limitations of existing projects. Then it focuses on the official Android client for Google Play and its internals, based on a <a href="http://code.google.com/p/protobuf/">Protobuf</a> variant. Thanks to <a href="http://code.google.com/p/androguard/">Androguard</a> and its awesome static analysis features, I show how to automatically recover the <code>.proto</code> file of Google Play, enabling us to generate stubs for querying Google&rsquo;s servers. Finally, I quickly introduce the <a href="https://github.com/egirault/googleplay-api/">unofficial API</a>.<span id="more-946"></span></p>
<h3>Existing projects</h3>
<p>Google Play can be queried in two ways: using the <a href="https://play.google.com/store/apps">official website</a> or the Android client. The website contains pretty much all the useful information, such as app name and developer name, comments, last version number and release date, permissions required by the app, statistics, etc. I guess one could build a simple program that queries this website and parses the pages, but it would still have one limitation: you simply cannot download apps. Well, you can, but for this you will need an actual compatible phone, and as soon as you perform the install request, the application will get downloaded and installed on your phone. Then if you want to retrieve it in order to analyse it, you must plug in your phone and use <code>adb pull</code>. Some managed to get Google Play run within the emulator, but this is still a bit complicated and not straightforward: you need Java, <a href="http://developer.android.com/sdk/index.html">Android SDK</a>, customize your emulator ROM to embed Google Play, and script everyting yourself.</p>
<p>The main project I have been looking at is <a href="http://code.google.com/p/android-market-api/">android-market-api</a>, written in Java. Actually, I am a Python fan, and played much more with <a href="https://github.com/liato/android-market-api-py">its Python equivalent</a>. The goal of those projects is to simulate the network activity generated by the Android client, query Google Play servers, and parse the result. The underlying protocol used by Google Play is based on Google&rsquo;s <a href="http://code.google.com/p/protobuf/">Protocol Buffers</a>, aka <em>Protobuf</em>. For those who do not know, this library provides a way to encode messages in binary, compact blobs before sending them on the network, and decode them on the other side. The <a href="https://developers.google.com/protocol-buffers/docs/overview">documentation</a> contains plainty of details on the actual <a href="https://developers.google.com/protocol-buffers/docs/encoding?hl=fr">encoding format</a>, so I won&rsquo;t cover it. The only important thing to know about Protobuf is that it is much easier to decode messages if you know the structure of exchanged messages. Messages are composed of fields, each one having a tag, a name and a type. When encoded, a message embeds the tag, value and type (only basic types, or a generic &laquo;&nbsp;message&nbsp;&raquo; type) of each field, but <strong>not</strong> their names. Therefore, the semantics of each field must be guessed, and that is not always easy.</p>
<p>When Google Play Android client is able to query Google&rsquo;s servers and download APKs, all network communications are done with Protobuf and HTTP(S). The underlying Protobuf file used by the unofficial API projects (and based on Android Market) has been published as a <a href="http://code.google.com/p/android-market-api/source/browse/trunk/AndroidMarketApi/proto/market.proto"><code>.proto</code> file</a>. The unofficial API can forge some of those requests and interpret results. While playing with them, I have managed to search Android apps, but I could not always download them. Indeed, this version of the API requires a numeric « assetId » corresponding to the app you want to download. When trying to get appropriate assetIds using other API methods such as <code>search()</code>, I got non-numeric values, such as: <code>v2:com.fankewong.angrybirdsbackup2sd:1:4</code>. This type of value is rejected by Google Server when trying to download the app. Too bad&#8230;</p>
<h3>A first look at Google Play Android client</h3>
<p>The weird thing is that the non-numeric assetId problem occurs quite often, but not on all apps. I guess this is because Google updated their API when they switched to Google Play; those projects are using the old version of the API. The only way to have up-to-date information and be able to download any app would then be to analyse the updated Android client, and adapt existing projects.</p>
<p>Here we go! We retrieve <code>com.android.vending-1.apk</code> from an up-to-date Android phone using <code>adb</code>, and we use our favorite Android RE tools. A first look at class names highlights a pretty explicit <code>VendingProtos</code> class, under the <code>com.google.android.vending.remoting.protos</code> package. It contains references to a package named <code>com.google.protobuf.micro</code>, embedded within the app. This package contains classes used to encode and decode messages. It is actually part of a public project, named <a href="http://code.google.com/p/micro-protobuf/">micro-protobuf</a>, which is a lightweight version of Protobuf. However, the underlying protocol remains the same.</p>
<p>Most of network traffic is sent using HTTPS. After installing our own on CA onto the phone and setting up an interception proxy like Burp, we can sniff traffic. From a black-box approach, the exchanged data looks like a binary stream:</p>
<div id="attachment_950" class="wp-caption aligncenter" style="width: 533px"><a href="http://www.segmentationfault.fr/wp-content/uploads/2012/09/googleplay_burp1.png"><img class=" wp-image-950 " title="googleplay_burp" src="http://www.segmentationfault.fr/wp-content/uploads/2012/09/googleplay_burp1.png" alt="" width="523" height="462" /></a><p class="wp-caption-text">Capturing a Protobuf response with Burp</p></div>
<p>All we need now is the <code>.proto</code> file of Google Play to be able to decode it. But how can we get this file? It is unfortunately not embedded within the app, so we have to find another way. <a href="http://www.sysdream.com/reverse-engineering-protobuf-apps">A paper and a tool</a> have been published on the subject, but work only when the studied app or program embeds some kind of metadata, used by reflection features of Protobuf. This metadata is generally embedded in regular stubs generated with Google&rsquo;s standard protobuf compiler called <code>protoc</code>. However, this is not the case here since the Protobuf stubs embedded within Google Play Android client were not compiled with standard <code>protoc</code>. Micro-protobuf seems to remove this metadata, probably to make protocol reversing harder.</p>
<p>Anyway, is there a way to guess the structure of exchanged messages, just by having a look at the decompiled Java code of the app? Let&rsquo;s go back to the <code>VendingProtos</code> class. It is contains many subclasses, among which one named <code>AppDataProto</code>:</p>
<pre>public static final class AppDataProto extends MessageMicro
{
  private int cachedSize = -1;
  private boolean hasKey;
  private boolean hasValue;
  private String key_ = "";
  private String value_ = "";

  [...]

  public AppDataProto mergeFrom(CodedInputStreamMicro 
                                paramCodedInputStreamMicro)
    throws IOException
  {
    while (true)
    {
      int i = paramCodedInputStreamMicro.readTag();
      switch (i)
      {
      default:
        if (parseUnknownField(paramCodedInputStreamMicro, i))
          continue;
      case 0:
        return this;
      case 10:
        String str1 = paramCodedInputStreamMicro.readString();
        AppDataProto localAppDataProto1 = setKey(str1);
        break;
      case 18:
      }
      String str2 = paramCodedInputStreamMicro.readString();
      AppDataProto localAppDataProto2 = setValue(str2);
    }
  }

  public AppDataProto setKey(String paramString)
  {
    this.hasKey = 1;
    this.key_ = paramString;
    return this;
  }

  public AppDataProto setValue(String paramString)
  {
    this.hasValue = 1;
    this.value_ = paramString;
    return this;
  }

  [...]
}</pre>
<p>We can guess that this class represents a Micro-Protobuf message (the <code>extends MessageMicro</code> part) and that it has two string fields: <code>key</code> and <code>value</code>. Their tag can be extracted from the <code>mergeFrom()</code> method, which aims at decode incoming binary messages. It is composed of a main loop (<code>while(true)</code>) and a <code>switch</code> statement. Each case – except the first and second ones – corresponds to a field. The value of each case is actually the binary representation of the tag and type of the field. Everything is in the documentation; to skip the details, the actual value of each case is equal to <code>(tag &lt;&lt; 3) | type</code>. For instance, 10 stands for tag 1, type 2 (string). 18 means tag 2, string. Thus, the actual <code>.proto</code> file looks as follows:</p>
<pre>message AppDataProto {
  optional string key = 1;
  optional string value = 2;
}</pre>
<p>Actually type 2 is not exactly &laquo;&nbsp;string&nbsp;&raquo;, but any length-delimited field. It could be a string, a series of bytes, or an embedded message itself. In that case, the code looks like this:</p>
<pre>case 26:
  VendingProtos.AppDataProto localAppDataProto = new VendingProtos.AppDataProto();
  paramCodedInputStreamMicro.readMessage(localAppDataProto);
  DataMessageProto localDataMessageProto2 = addAppData(localAppDataProto);
  break;</pre>
<p>This field has a tag equal to 3 (26 &gt;&gt; 3) and is a message which name is <code>AppDataProto</code>. In order to get this sub-message structure, we would have to repeat the analysis process to the corresponding class, and so on.</p>
<h3>Automatic analysis</h3>
<p>We now have a way of recovering a message structure by analyzing the generated code. All we need now is automating the process. For this, we can use <a href="http://code.google.com/p/androguard/">Androguard</a>, a multi-purpose framework intended to make Android reversing easier. With Androguard, we can simply open an APK, decompile it, parse its Dalvik code, and do all sorts of things. Once installed, one can use the provided <code>androlyze</code> tool to dynamically interact with the framework, and then write a script to automate everything.</p>
<p>Androguard lets us easily browse the available classes and find those that extends <code>MessageMicro</code>.</p>
<pre>In [1]: apk = APK('com.android.vending-1.apk')
In [2]: dvm = DalvikVMFormat(apk.get_dex())
In [3]: vma = uVMAnalysis(dvm)
In [4]: proto_classes = filter(lambda c: "MessageMicro;" in c.get_superclassname(), dvm.get_classes())
In [5]: proto_class_names = map(lambda c: c.get_name(), proto_classes)</pre>
<p>Then we extract the <code>mergeFrom()</code> method of each class by filtering the method list generated by <code>dvm.get_methods_class(class_name)</code>. The basic block list of each method can be obtained with <code>vma.get_method(m).basic_blocks.gets()</code>.<br />
The first is usually the one that implements the switch instruction. In Dalvik, a switch is often represented as a <code>sparse-switch</code> instruction, which operand is a table composed of a list of values and offsets, called <code>sparse-switch-payload</code>. Here is an example:</p>
<pre>invoke-virtual v3, Lcom/google/protobuf/micro/CodedInputStreamMicro;-&gt;readTag()I
move-result v0
sparse-switch v0, +52 (0xa4)
[...]
sparse-switch-payload sparse-switch-payload 0:9 a:a 12:12 1a:1a 22:22 2a:2a 32:32 3a:3a 42:42 4a:4a</pre>
<p>Each (value, offset) tuple correspond to a case of the switch; if the value matches the compared register, then the execution continues to the corresponding offset. Once we are able to browse each case of the switch (and its target basic block), we can determine the name of each field and its type by examining the name of the corresponding accessors. For instance, here is a typical basic block:</p>
<pre>invoke-virtual v3, Lcom/google/protobuf/micro/CodedInputStreamMicro;-&gt;readString()Ljava/lang/String;
move-result-object v1
invoke-virtual v2, v1, L[...]AddressProto;-&gt;setCity(Ljava/lang/String;)L[...]AddressProto;
goto -25</pre>
<p>Each basic block contains two accessor calls: <code>readXXX()</code> and <code>setYYY()</code>. Their goal is to read an incoming series of bytes and initialize one field of the message. <code>XXX</code> corresponds to the type of the field (here, <em>string</em>), and <code>YYY</code> to its name (<em>city</em>).</p>
<p>The simplified analysis algorithm looks like:</p>
<pre>for each class that extends MessageMicro:
  get its mergeFrom() method
    find the sparse-switch instruction
    get the corresponding sparse-switch-payload
    index all values and offsets in a dict
    for each value, offset:
      tag = value &gt;&gt; 3
      get the target basic block using the offset
      find readXXX() and setYYY() calls
      type = XXX
      name = YYY
      index the tuple (tag, type, name)</pre>
<p>Then we only need to format the output in order to generate a parsable <code>.proto</code> file, dealing with nested messages and groups among other things.</p>
<p>I called the resulting script <a href="https://github.com/egirault/googleplay-api/blob/master/androguard/androproto.py"><code>androproto.py</code></a>. It is released with the API code; feel free to play with it. It is able to analyze the target app and print the recovered Profotuf file. I apologize for the dirty code; since Google Play is the only app using Micro-Protobuf that I&rsquo;ve analyzed, this script is pretty specific. But it should work with any app using this library, with a few changes. Its output on Google Play app looks like this:</p>
<pre>message AckNotificationResponse {
}
message AndroidAppDeliveryData {
  optional int64 downloadSize = 1;
  optional string signature = 2;
  optional string downloadUrl = 3;
  repeated AppFileMetadata additionalFile = 4;
  repeated HttpCookie downloadAuthCookie = 5;
  optional bool forwardLocked = 6;
  optional int64 refundTimeout = 7;
  optional bool serverInitiated = 8;
  optional int64 postInstallRefundWindowMillis = 9;
  optional bool immediateStartNeeded = 10;
  optional AndroidAppPatchData patchData = 11;
  optional EncryptionParams encryptionParams = 12;
}
message AndroidAppPatchData {
  optional int32 baseVersionCode = 1;
  optional string baseSignature = 2;
  optional string downloadUrl = 3;
  optional int32 patchFormat = 4;
  optional int64 maxPatchSize = 5;
}
[...]</pre>
<p>The resulting output is <em>almost</em> usable with <code>protoc</code>. Almost, because there is a duplicate message that you need to manually remove in order to make <code>protoc</code> happy. But after taking care of that detail, you have a working <a href="https://github.com/egirault/googleplay-api/blob/master/googleplay.proto"><code>googleplay.proto</code></a> that you can use to generate C++, Java and Python stubs for querying Google Play API!</p>
<h3>Building Google Play Unofficial Python API</h3>
<p>In order to parse Google Play protobuf messages, we dump each server response intercepted with Burp into a file, an use:</p>
<pre>protoc --decode=ResponseWrapper googleplay.proto &lt; dump.bin</pre>
<p><code>ResponseWrapper</code> is the root message type; it can be easily guessed by looking at the message names. Once we have a clue of what&rsquo;s received by the application, we can start building our own API. Since we need a valid auth token from Google server, we need first to authenticate. I simply reused the code from <a href="https://github.com/liato/android-market-api-py">android-market-api-py</a>. Once logged in, we need to deal with protobuf traffic. For most of API requests, the Android client does not send protobuf messages, but only simple GET or POST requests, such as <code>search?c=3&amp;q=%s</code>. In order to parse Protobuf responses, we use the generated Python module (<code>googleplay_pb2</code>):</p>
<pre>message = googleplay_pb2.ResponseWrapper.FromString(data)</pre>
<p>The resulting message can be browsed like a regular Python object. For some API methods, Google servers also return some <em>prefetch</em> data. A prefetch element contains a URL and raw data. It acts like a cache and can be dealt with pretty easily with a few lines of code.</p>
<p>The final API is pretty straightforward to use. Just follow the <a href="https://github.com/egirault/googleplay-api/blob/master/README.md">README</a>. First make sure to edit <code>googleplay.py</code> and insert your phone&rsquo;s <code>androidID</code>, then supply your Google credentials in <code>config.py</code>. You can use the provided scripts, producing CSV output, and prettify them with <code>pp</code>. Sorry for the following truncated output due to this blog&#8230;</p>
<pre>$ alias pp="column -s ';' -t"  # pretty-print CSV

$ python search.py earth | pp
Title                           Package name                            Creator                  Super Dev  Price    Offer Type  Version Code  Size     Rating  Num Downloads
Google Earth                    com.google.earth                        Google Inc.              1          Gratuit  1           53            8.6MB    4.46    10 000 000+
Terre HD Free Edition           ru.gonorovsky.kv.livewall.earthhd       Stanislav Gonorovsky     0          Gratuit  1           33            4.7MB    4.47    1 000 000+
Earth Live Wallpaper            com.seb.SLWP                            unixseb                  0          Gratuit  1           60            687.4KB  4.06    5 000 000+
Super Earth Wallpaper Free      com.mx.spacelwpfree                     Mariux                   0          Gratuit  1           2             1.8MB    4.41    100 000+
Earth And Legend                com.dvidearts.earthandlegend            DVide Arts Incorporated  0          5,99 €   1           6             6.8MB    4.82    50 000+
Earth 3D                        com.jmsys.earth3d                       Dokon Jang               0          Gratuit  1           12            3.4MB    4.05    500 000+
[...]

$ python categories.py | pp
ID                   Name
GAME                 Jeux
NEWS_AND_MAGAZINES   Actualités et magazines
COMICS               BD
LIBRARIES_AND_DEMO   Bibliothèques et démos
COMMUNICATION        Communication
ENTERTAINMENT        Divertissement
EDUCATION            Enseignement
FINANCE              Finance

$ python list.py 
Usage: list.py category [subcategory] [nb_results] [offset]
List subcategories and apps within them.
category: To obtain a list of supported catagories, use categories.py
subcategory: You can get a list of all subcategories available, by supplying a valid category

$ python list.py WEATHER | pp
Subcategory ID            Name
apps_topselling_paid      Top payant
apps_topselling_free      Top gratuit
apps_topgrossing          Les plus rentables
apps_topselling_new_paid  Top des nouveautés payantes
apps_topselling_new_free  Top des nouveautés gratuites

$ python list.py WEATHER apps_topselling_free | pp
Title                  Package name                                  Creator          Super Dev  Price    Offer Type  Version Code  Size    Rating  Num Downloads
La chaine météo        com.lachainemeteo.androidapp                  METEO CONSULT    0          Gratuit  1           8             4.6MB   4.38    1 000 000+
Météo-France           fr.meteo                                      Météo-France     0          Gratuit  1           11            2.4MB   3.63    1 000 000+
GO Weather EX          com.gau.go.launcherex.gowidget.weatherwidget  GO Launcher EX   0          Gratuit  1           25            6.5MB   4.40    10 000 000+
Thermomètre (Gratuit)  com.xiaad.android.thermometertrial            Mobiquité        0          Gratuit  1           60            3.6MB   3.78    1 000 000+

$ python permissions.py com.google.android.gm
android.permission.ACCESS_NETWORK_STATE
android.permission.GET_ACCOUNTS
android.permission.MANAGE_ACCOUNTS
android.permission.INTERNET
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
[...]

$ python download.py com.google.android.gm
Downloading 2.7MB... Done

$ file com.google.android.gm.apk 
com.google.android.gm.apk: Zip archive data, at least v2.0 to extract</pre>
<h3>Conclusion</h3>
<p>Although there is no metadata within Micro-Protobuf applications, recovering <code>.proto</code> files is still doable and it can still be done automatically. The lack of obfuscation is clearly an advantage for an attacker, since all class and method names are easy to understand. Having a non-official Google Play API is handy for many reasons: performing statistics that aren&rsquo;t available on the official front-end, looking for plagiarism, automatic malware search / downloading / analysis (Androguard to the rescue)&#8230; Feel free to browse the <a href="https://github.com/egirault/googleplay-api/">source</a>, fork the project, and improve it!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/publications/reversing-google-play-and-micro-protobuf-applications/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Nuit Du Hack 2009 : Et les vainqueurs sont&#8230;</title>
		<link>http://www.segmentationfault.fr/securite-informatique/bilan-nuit-du-hack-2009/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/bilan-nuit-du-hack-2009/#comments</comments>
		<pubDate>Sun, 14 Jun 2009 20:17:00 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Publications]]></category>
		<category><![CDATA[Reverse Engineering]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[pentest]]></category>
		<category><![CDATA[XeeK]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=655</guid>
		<description><![CDATA[Tant attendue, la NDH 2009 s&#8217;est terminée ce matin même. La péniche sur laquelle se déroulait l&#8217;événement battait son plein ; nous étions quasiment 200 à bord. Pour la première fois, le challenge était un Capture The Flag  au cours duquel se sont affrontés une demi douzaine d&#8217;équipes. Mais cette année, la team de Ghosts [...]]]></description>
			<content:encoded><![CDATA[<p>Tant attendue, la NDH 2009 s&rsquo;est terminée ce matin même. La péniche sur laquelle se déroulait l&rsquo;événement battait son plein ; nous étions quasiment 200 à bord. Pour la première fois, le challenge était un Capture The Flag  au cours duquel se sont affrontés une demi douzaine d&rsquo;équipes. Mais cette année, la team de Ghosts In The Stack n&rsquo;était pas au complet car il manquait Heurs, contraint de ne pas participer au challenge vu qu&rsquo;il fait désormais partie du staff. Ma team, répondant au nom de Trollkore (un trip IRC&#8230;) était donc composée d&rsquo;Ivanlef0u, sh4ka, Pierz et Kal0n. Et c&rsquo;est notre équipe qui a remporté le challenge ! Voici, rien que pour vous, un petit résumé de cette super nuit organisée par <a href="http://www.sysdream.com">Sysdream</a>. [EDIT 15/16/09 : slides et sources mis en ligne]<span id="more-655"></span></p>
<h3>Conférences</h3>
<p>Le programme était aussi riche qu&rsquo;intense : une douzaine de conférences se déroulant sur deux plateformes ; il y avait donc toujours deux confs en simultané. L&rsquo;inconvénient était toutefois qu&rsquo;on ne pouvait assister qu&rsquo;à la moitié des confs&#8230; Pour ma part, j&rsquo;ai alterné entre les deux plateformes, et j&rsquo;ai en plus du finaliser quelques slides donc je n&rsquo;ai pas pu en profiter pleinement. Au final, voila ce à quoi j&rsquo;ai assisté :</p>
<ul>
<li><strong>SCOW &#8211; ShellCoding On Windows</strong> : Heurs présente son nouvel outil permettant de générer un shellcode générique sous Wndows à partir d&rsquo;un simple programme C. Un outil permettant de gagner un temps fou lors de la conception d&rsquo;un exploit, avec en prime une polymorphisation du shellcode en question.</li>
<li><strong>GoRing0 </strong>: Présentée par moi-même. Cette conférence se veut accessible à tous ceux qui s&rsquo;intéressent de près ou de loin au noyau et au fonctionnement des processeurs x86, en particulier le système de privilèges (ring). J&rsquo;y présente dans un premier temps toutes les bases nécessaire pour comprendre le coeur de la conférence : un rootkit que j&rsquo;ai développé et qui permet de passer un thread en ring 0, le contexte étant préservé.</li>
<li><strong>Drive by Pharming</strong> : Abc528 présente une faille XSRF des routeurs de type box (Alicebox, Livebox&#8230;) permettant de modifier leur configuration depuis une page HTML hébergée sur un site quelconque.</li>
<li><strong>XeeK </strong>: Ma deuxième conf de la soirée. Je présente XeeK, un projet dont j&rsquo;ai déjà parlé <a href="http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/">ici</a>, mais que je n&rsquo;ai pas encore eu le temps de finir. Il s&rsquo;agit d&rsquo;un framework visant à exploiter les failles XSS très rapidement et simplement.</li>
<li><strong>Lockpicking </strong>: Cocolitos et Mr Jack nous démontrent qu&rsquo;aucun verrou n&rsquo;est vraiment sûre, en crochetant différents types de serrures, les unes à la suite des autres. On y apprend entre autres qu&rsquo;on peut crocheter certaines serrures avec un bout d&rsquo;essuie glace, et ouvrir un cadenas avec une canette. Même certaines serrures réputées haute sécurité y passent.</li>
</ul>
<p>Dommage, j&rsquo;ai loupé la conférences de Virtualabs sur les framework Web next gen, qui pourraient fortement m&rsquo;intéresser pour poursuivre XeeK.</p>
<p>Sinon, si je devais donner mon opinion sur les 3 confs que j&rsquo;ai vues, je dirai qu&rsquo;elles étaient à la hauteur de mes attentes et qu&rsquo;elles valaient vraiment le coup d&rsquo;oeil, sauf une : le Drive By Pharming. Soyons clairs : je respecte tous les conférenciers ainsi que les présentations qu&rsquo;ils ont données. Mais je pense que cette conférence, bien que s&rsquo;adressant à des débutants, manquait de préparation, de contenu (elle a duré 10 min) et contenait des erreurs assez flagrantes. Je reste enthousiaste à l&rsquo;idée d&rsquo;accueillir des confs de tous les niveaux, mais je pense toutefois que les conférenciers ne devraient pas hésiter à approfondir un peu plus leurs sujets. Enfin, pour ce qui est de la conférence sur le lockpicking, bien que je n&rsquo;ai aucune expérience en la matière, j&rsquo;ai vraiment adoré.</p>
<h3>Slides</h3>
<p>Voici les slides de mes conférences ainsi que les sources/binaires que je publie :</p>
<ul>
<li><strong>GoRing0 </strong>: <a href="http://www.segmentationfault.fr/wp-content/uploads/2009/06/goring0.pdf">Slides </a>- <a href="http://www.segmentationfault.fr/wp-content/uploads/2009/06/goring0-bin.zip">Binaires </a>- <a href="http://www.segmentationfault.fr/wp-content/uploads/2009/06/goring0-src.zip">Sources</a></li>
<li><strong>XeeK </strong>: <a href="http://www.segmentationfault.fr/wp-content/uploads/2009/06/xeek.pdf">Slides</a></li>
</ul>
<p>Pour les autres, allez sur le <a href="http://www.nuitduhack.com">site officiel</a> ou contacter directement les conférenciers.</p>
<h3>Challenge</h3>
<p>Grosse nouveauté de cette année : le challenge principal est un Capture The Flag. Le principe est simple : chaque équipe possède quelques serveurs, leur but étant de les protéger et d&rsquo;attaquer ceux des autres. En gros :</p>
<ul>
<li>Règle n°1 : pas d&rsquo;attaques physiques.</li>
<li>Règle n°2 : pas d&rsquo;attaques sur le serveur du staff.</li>
<li>Règle n°3 : tout le reste est permis. Même  le déni de service.</li>
</ul>
<p>Pour pimenter l&rsquo;affaire, aucune information n&rsquo;est donnée au préalable, pas même les IP de nos propres machines. Pas de DHCP. Il nous faut alors sniffer le traffic pour nous apercevoir qu&rsquo;une machine emmet en broadcast. Nous nous attribuons donc des IP statiques sur la même plage, et configurons la machine qui broadcast comme passerelle. A partir de là, nous découvrons le serveur de monitoring qui contient les résultats en temps réel su challenge avec le classement des équipes, ainsi que la liste de toutes les machines. Autant dire que Nmap a bien tourné&#8230;</p>
<p>On nous fait parvenir les logins/pass de notre machine Windows, mais pas ceux de celle sous Linux. Prétexte:  ils sont facile à trouver. Je m&rsquo;acharne donc à bruteforcer avec Hydra (en l&rsquo;ayant recompilé au passage avec le support pour SSH), mais rien n&rsquo;y fait. Pierz se penche sur Windows, fait tourner Metasploit, et découvre que les machines sont vulnérables au MS08_067. En quelques secondes, il roote une machine adverse et récupère les hashs à valider. Le score décolle enfin ! Décidé à faire baisser le score des autres équipes, j&rsquo;exploite la vuln à mon tour et en profite supprimer le contenu de c:\Windows\system32 ainsi que boot.ini et autoexec.bat, puis je lance un reboot. Cependant, je n&rsquo;avais pas prévu que Windows restaurerai ces 2 fichiers et que la machine booterait toujours. Dommage&#8230;</p>
<p>Pendant ce temps, sh4ka et Ivan s&rsquo;acharnent sur notre Windows en remote desktop. Ivan se fait plaisir sur les crackmes fournis et les reverse rapidement. Kal0n est quant à lui sur un exploit PhpMyAdmin. Avec Sh4ka, je me penche sur le Web. Cependant, il y a un imprévu : le challenge Web prévu est inaccessible car mal configuré. Nous allons alors sur le serveur commun que HZV a laissé pour que même les non participants puissent s&rsquo;entraîner. Nous trouvons rapidement une include locale, une injection SQL, une faille par authentification faible via cookies et une XSS qui n&rsquo;a d&rsquo;ailleurs pas été validé (non prévue à la base). Pendant ce temps, Ivan se penche sur un crackme en kernel, qui lui donne du fil à retordre mais qui fini par tomber.</p>
<p>Aux environs de 5h, on finit par nous donner les accès Linux. Dépités, nous constatons que le login/pass n&rsquo;était en effet pas bien dur à trouver (freeman:team2). En supposant que la combinaison soit similaire sur les autres machines, nous parvenons à nous connecter chez les autres équipes. Mais nous voyons que tout a été chrooté dans tous les sens, et qu&rsquo;au final n&rsquo;avons accès qu&rsquo;à cat, ls, cs, mv, mkdir et python. Nous découvrons plusieurs binaires suid root, dont un vulnérable à un buffer overflow. L&rsquo;ASLR étant activé, l&rsquo;exploitation via  ret onto ret est toujours faisable mais comme nous n&rsquo;avons pas gdb sur la machine distante, et qu&rsquo;il commence à se faire tard (ou tôt, question de point de vue), nous préférons nous arrêter là. En plus, nous sommes une des seules équipes restantes&#8230;</p>
<h3>Remise des prix</h3>
<p>Vers 6h, Crashfr annonce les résultats. Nous sommes premiers ! Jamais nous n&rsquo;aurions pensé gagner, car nous nous attendions à affronter Dvrasp, Fozzy et Artyc&#8230; Mais en fait, il étaient trop occupés au bar <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Crashfr remet les prix aux équipes : des certifications CEH pour les 1ers, et des livres pour les deuxièmes et troisièmes. Sans oublier bien sûr les super trophées en verres, réalisés pour l&rsquo;occasion. Pour ma part, comme je serai bientôt consultant chez Sysdream, je pense plutôt convertir ce CEH en LPT (Licensed Penetration Tester), une autre certification d&rsquo;EC-Council. En tout cas, si j&rsquo;ai particupé à cette nuit, c&rsquo;était uniquement pour le fun. Comme d&rsquo;habitude, la NDH est de mieux en mieux, et son ampleur augmente au fil du temps. A quand une NDH rivalisant avec le Black Hat et le Defcon ? En plus, c&rsquo;était ma dernière NDH en tant que challenger, vu que l&rsquo;année prochaine je ferai partie du staff et je pourrai à mon tour goûter aux joies de voir tout le monde s&rsquo;arracher les cheveux sur un challenge dont je suis l&rsquo;auteur <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>See you next year !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/bilan-nuit-du-hack-2009/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Conférence NDH 2009 sur GoRing0</title>
		<link>http://www.segmentationfault.fr/projets/conference-ndh-2009-goring0/</link>
		<comments>http://www.segmentationfault.fr/projets/conference-ndh-2009-goring0/#comments</comments>
		<pubDate>Wed, 13 May 2009 22:50:50 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[Publications]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[ring 0]]></category>
		<category><![CDATA[rootkit]]></category>
		<category><![CDATA[XeeK]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=641</guid>
		<description><![CDATA[Je me suis récemment lancé sur un nouveau projet perso, nommé GoRing0. Ce projet est parti d&#8217;une question existentielle que je me suis posée concernant les processus, ou plutôt les threads. Sous Linux et Windows, ceux-ci s&#8217;exécutent normalement en ring 3 (mode processeur userland), alors que les drivers s&#8217;exécutent en ring 0 (kernelland).  Ma question [...]]]></description>
			<content:encoded><![CDATA[<p>Je me suis récemment lancé sur un nouveau projet perso, nommé GoRing0. Ce projet est parti d&rsquo;une question existentielle que je me suis posée concernant les processus, ou plutôt les threads. Sous Linux et Windows, ceux-ci s&rsquo;exécutent normalement en ring 3 (mode processeur <em>userland</em>), alors que les drivers s&rsquo;exécutent en ring 0 (<em>kernelland</em>).  Ma question était la suivante : est-ce techniquement possible de passer un thread du ring 3 vers le ring 0 ? Attention, je ne parle pas de faire un appel à un code driver depuis un programme ring 3 par le biais d&rsquo;une interruption ou d&rsquo;un IOCTL, mais bien de passer une le code du thread lui-même en ring 0. Étant convaincu que la réponse à cette question est affirmative, je me lance dans la conception d&rsquo;une preuve de concept : GoRing0.<span id="more-641"></span></p>
<h3>GoRing0</h3>
<p>GoRing0 est donc un rootkit qui a pour objectif de faire passer un thread en ring 0, et de le rebasculer accessoirement en ring 3 lorsqu&rsquo;il le souhaite. Pour cela, celui-ci devra bien évidemment charger un driver, afin de s&rsquo;élever les droits et de permettre une telle commutation. La partie utilisateur du rootkit pourrait se présenter sous la forme d&rsquo;une librairie exportant deux fonctions principales : GoRing0() et GoRing3(), permettant le basculement en ring 0 et ring 3 respectivement. N&rsquo;importe quel programme pourrait alors faire appel à ces fonctions et s&rsquo;élever les droits à volonté. Je développe pour le moment sous Windows, mais idéalement, GoRing0 devrait être capable de fonctionner aussi bien sous sous Linux, la manipulation qu&rsquo;il effectue étant surtout liée à l&rsquo;architecture x86.</p>
<p>Le principe de fonctionnement de GoRing0 repose sur les interruptions. Les fonctions GoRing0() et GoRing3() déclenchent une interruption spécifique qui est hookée par le driver et qui se charge de modifier la valeur de CS empilée automatiquement par le processeur. En effet il se trouve que le ring courant du processeur (le CPL) est encodé dans les 2 premiers bits de CS ainsi que dans le descripteur de segment (dans la GDT) auquel il correspond. Plus intéressant encore, Windows définit deux valeurs spéciales de CS : une en userland (0x1b), et une en kernelland (0&#215;8). Il suffit alors au handler d&rsquo;interruption de substituer la valeur empilée de CS par la valeur kernelland pour passer le thread en ring 0 au retour d&rsquo;interruption.</p>
<p>Pour le moment, j&rsquo;ai un prototype fonctionnel stable : j&rsquo;arrive à passer un thread en ring 0 et à le rebasculer en ring 3. Pour m&rsquo;en assurer, je peux afficher la mémoire kernel depuis ce thread (adresses supérieures à 0&#215;80000000 sous Windows). Cependant, lorsqu&rsquo;un thread est en ring 0, il est impossible d&rsquo;appeler des API Windows car celles-ci vérifient apparamment si le thread qui les appelle vient bien du ring 3. De même, il n&rsquo;est pas possible d&rsquo;appeler des fonctions du kernel depuis le thread même en ring 0, à moins d&rsquo;en connaître l&rsquo;adresse ou de la résoudre à l&rsquo;exécution.</p>
<h3>Nouvelle conférence à la Nuit Du Hack</h3>
<p>Enfin, j&rsquo;en viens à la véritable news de ce post&#8230; Au départ, je devais présenter une conférence sur XeeK et une autre sur InjecSO. Etant donné qu&rsquo;InjecSO est sorti depuis un moment maintenant (avec la doc sur ce blog), que je me suis lancé dans ce nouveau projet, et que cette année il n&rsquo;y a pour l&rsquo;instant aucune conférence orientée kernel, j&rsquo;ai pensé intéressant de remplacer la conférence sur InjecSO par une sur GoRing0. Je compte y présenter le projet et par la même occasion de présenter rapidement l&rsquo;architecture x86 et le développement en mode kernel aux débutants en la matière. Ceux pour qui les concepts d&rsquo;interruption, segments et autre GDT sont du chinois (autrement dit ceux qui n&rsquo;ont pas compris le paragraphe technique ci-dessus&#8230;) sont les bienvenus, je compte justement expliquer tout cela ! Ca sera de plus l&rsquo;occasion de releaser officiellement GoRing0 et de faire une petite démo. Sur ce, à la NDH !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/projets/conference-ndh-2009-goring0/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Conférences Nuit du Hack 2009</title>
		<link>http://www.segmentationfault.fr/securite-informatique/conferences-nuit-du-hack-2009/</link>
		<comments>http://www.segmentationfault.fr/securite-informatique/conferences-nuit-du-hack-2009/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 17:17:10 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[Nuit du hack]]></category>
		<category><![CDATA[Publications]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[XeeK]]></category>

		<guid isPermaLink="false">http://www.segmentationfault.fr/?p=604</guid>
		<description><![CDATA[C&#8217;est désormais officiel : je présenterai deux conférences à la prochaine Nuit Du Hack organisée par Sysdream et l&#8217;équipe de Hackerzvoice. Ma première conférence sera l&#8217;occasion de présenter XeeK, un projet personnel en cours de développement dont le but est de fournir un framework pour exploiter facilement des failles XSS et démontrer leur puissance. L&#8217;outil [...]]]></description>
			<content:encoded><![CDATA[<p>C&rsquo;est désormais officiel : je présenterai deux conférences à la prochaine <a href="http://www.nuitduhack.com/">Nuit Du Hack</a> organisée par <a href="http://www.sysdream.com/">Sysdream</a> et l&rsquo;équipe de <a href="http://hackerzvoice.net/">Hackerzvoice</a>.</p>
<p>Ma première conférence sera l&rsquo;occasion de présenter <a href="http://www.segmentationfault.fr/projets/xeek-framework-exploitation-xss/">XeeK</a>, un projet personnel en cours de développement dont le but est de fournir un framework pour exploiter facilement des failles XSS et démontrer leur puissance. L&rsquo;outil n&rsquo;est toujours pas fini, donc il va falloir que je fasse vite pour arriver à quelque chose de présentable&#8230; :p</p>
<p>Le sujet de la deuxième conférence n&rsquo;est pas encore décidé à 100%, mais une chose est sure : il traitera d&rsquo;un domaine nettement plus applicatif et bas niveau. Je pensais au départ présenter <a href="http://www.segmentationfault.fr/projets/injecso-injection-de-so-sous-linux/">InjecSO</a>, mais je vais voir si je ne peux pas trouver un autre sujet encore plus intéressant et inédit&#8230;<span id="more-604"></span></p>
<p>Enfin, j&rsquo;en profite pour faire de la pub pour Heurs qui présentera quant à lui son dernier projet : SCOW, un outil permettant de développer des shellcodes entièrement en C sous Windows. Avec un peu de chance, on aura droit à la dernière version en avant première&#8230;</p>
<p>Retrouvez le <a href="http://www.nuitduhack.com/programme-conferences-salon-challenge-hack.htm">programme</a> complet sur le site officiel. Avec un challenge de type Capture The Flag et un lieu inédit (une péniche sur la Seine), la soirée s&rsquo;annonce mémorable d&rsquo;avance ! J&rsquo;ai déjà hâte d&rsquo;y être <img src='http://www.segmentationfault.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/securite-informatique/conferences-nuit-du-hack-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Exposé : Le Web 2.0</title>
		<link>http://www.segmentationfault.fr/insa/expose-le-web-20/</link>
		<comments>http://www.segmentationfault.fr/insa/expose-le-web-20/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 14:06:38 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[INSA]]></category>
		<category><![CDATA[Publications]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://60gp.ovh.net/~emilieng/insa/expose-le-web-20/</guid>
		<description><![CDATA[En 3ème année, il nous a été demandé de réaliser un exposé technique sur un sujet de notre choix. Toujours par groupe, c&#8217;est toutefois un exercice très différent de la monographie : il est nettement plus synthétique (moins d&#8217;une dizaine de pages) , nous n&#8217;avions que trois mois pour le rédiger, et la soutenance se [...]]]></description>
			<content:encoded><![CDATA[<p>En 3ème année, il nous a été demandé de réaliser un exposé technique sur un sujet de notre choix. Toujours par groupe, c&rsquo;est toutefois un exercice très différent de la <a href="http://www.segmentationfault.fr/insa/monographie-les-enjeux-du-logiciel-libre/" title="Monographie : Les enjeux du logiciel libre">monographie</a> : il est nettement plus synthétique (moins d&rsquo;une dizaine de pages) , nous n&rsquo;avions que trois mois pour le rédiger, et la soutenance se présentait en anglais&#8230;</p>
<p><span id="more-7"></span>Parmi tous les sujets proposés, nous avons choisis le «Web 2.0». Même si c&rsquo;est un sujet très populaire ces derniers temps, il faut avouer qu&rsquo;il est aussi très controversé : certains le considère comme un phénomène de mode sans réelle innovation technique, d&rsquo;autres parlent même d&rsquo;argument marketing pour être plus «vendeur».</p>
<p>Notre travail a consisté à rechercher des informations, et à les synthétiser pour fournir un exposé qui se veut pertinent, le tout en moins de dix pages. Ce document ne se veut pas complet (c&rsquo;est bien un <em>exposé</em>), mais fournira un bon point de départ pour ceux qui s&rsquo;intéressent de près ou de loin à ce sujet. Il est toutefois préférable d&rsquo;avoir quelques bases sur le technologies Web, même s&rsquo;il n&rsquo;y a nullement besoin d&rsquo;être spécialiste dans le domaine pour le comprendre.</p>
<p>Je publie aujourd&rsquo;hui ce document, et j&rsquo;espère qu&rsquo;il vous plaira. La licence n&rsquo;est pas définie, car je dois avouer que je n&rsquo;ai pas encore demandé à mes collègues leur autorisation pour utiliser une licence libre. Considérez donc que ce sont les règles standards du copyright qui s&rsquo;appliquent : vous êtes libre de citer des passages de ce document si vous n&rsquo;oubliez pas de citer leurs sources dans le document d&rsquo;origine. Ceci étant dit, bonne lecture !</p>
<ul>
<li><a href="http://www.segmentationfault.fr/wp-content/uploads/2007/12/web20.pdf" title="Exposé technique : le Web 2.0">Exposé technique sur le Web 2.0 (PDF)</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/insa/expose-le-web-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Monographie : Les enjeux du logiciel libre</title>
		<link>http://www.segmentationfault.fr/insa/monographie-les-enjeux-du-logiciel-libre/</link>
		<comments>http://www.segmentationfault.fr/insa/monographie-les-enjeux-du-logiciel-libre/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 13:34:42 +0000</pubDate>
		<dc:creator>Emilien Girault</dc:creator>
				<category><![CDATA[INSA]]></category>
		<category><![CDATA[Publications]]></category>

		<guid isPermaLink="false">http://60gp.ovh.net/~emilieng/insa/monographie-les-enjeux-du-logiciel-libre/</guid>
		<description><![CDATA[L&#8217;année dernière, alors que j&#8217;étais en 3ème année au département informatique de l&#8217;INSA de Rennes, j&#8217;ai eu l&#8217;occasion de réaliser une monographie. Qu&#8217;est-ce qu&#8217;une monographie ? Il s&#8217;agit d&#8217;un document écrit traitant d&#8217;une étude réalisée à propos d&#8217;un sujet précis. Ce travail était à réaliser sur une durée d&#8217;un an, par groupe de quatre étudiants. [...]]]></description>
			<content:encoded><![CDATA[<p>L&rsquo;année dernière, alors que j&rsquo;étais en 3ème année au département informatique de l&rsquo;INSA de Rennes, j&rsquo;ai eu l&rsquo;occasion de réaliser une monographie. Qu&rsquo;est-ce qu&rsquo;une monographie ? Il s&rsquo;agit d&rsquo;un document écrit traitant d&rsquo;une étude réalisée à propos d&rsquo;un sujet précis. Ce travail était à réaliser sur une durée d&rsquo;un an, par groupe de quatre étudiants.</p>
<p><span id="more-4"></span>Nous avons choisis le sujet du logiciel libre, et plus précisément de ses enjeux aussi bien pour les particuliers que pour les professionnels. Notre travail a été ensuite présenté devant un jury lors d&rsquo;une soutenance. Nous  avons eu la surprise de voir notre exposé gagner le concours des monographies l&rsquo;établissement.</p>
<p>Notre monographie fait une trentaine de pages, et est publiée sous licence FDL. Pour ceux qui l&rsquo;ignorent, cette licence est l&rsquo;équivalent de la licence GPL pour les documents. Ce qui veut dire que vous êtes libre de la consulter, de la copier, de la redistribuer, à condition que ces oeuvres résultantes soient publiées également sous cette même licence, et qu&rsquo;elles citent tous les contributeurs.</p>
<p>Vous pouvez télécharger les fichiers suivants :</p>
<ul>
<li><a href="http://www.segmentationfault.fr/wp-content/uploads/2007/12/monographie-les-enjeux-des-logiciels-libres.pdf" title="Monographie : Les enjeux du logiciel libre">La monographie au format PDF</a></li>
<li><a href="http://www.segmentationfault.fr/wp-content/uploads/2007/12/mono-sources.zip" title="Sources Monographie">Les sources du document, au format LaTeX et BibTeX</a></li>
</ul>
<p>Par soucis de place sur mon hébergeur, je ne publie pas les images qui sont assez volumineuses. Si vous souhaitez néanmoins reprendre notre travail pour l&rsquo;améliorer tout en souhaitant inclure ces images, vous pouvez me contacter afin que je vous les fournisse.</p>
<p>Bonne lecture, et n&rsquo;hésitez pas à améliorer vous-même ce document !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.segmentationfault.fr/insa/monographie-les-enjeux-du-logiciel-libre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
