<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Guenael]]></title>
  <link href="http://guenael.ca/atom.xml" rel="self"/>
  <link href="http://guenael.ca/"/>
  <updated>2016-08-09T03:21:20+02:00</updated>
  <id>http://guenael.ca/</id>
  <author>
    <name><![CDATA[Guenael]]></name>
    
  </author>

  
  <entry>
    <title type="html"><![CDATA[Article - TinyBeacon project]]></title>
    <link href="http://guenael.ca/blog/2016/08/08/article-tinybeacons/"/>
    <updated>2016-08-08T21:00:00+02:00</updated>
    <id>http://guenael.ca/blog/2016/08/08/article-tinybeacons</id>
    <content type="html"><![CDATA[<p>TinyBeacon enables an easy setup of VHF and UHF beacons, through a simple and compact design, using a credit card-size PCB, at a low cost, and with easy installation close to the antenna. The PLL system is disciplined by GPS, allowing digital modes like WSPR and PI4, which require good clock stability and time synchronization. The system integrates a DC-DC regulator that accepts flexible power between 10 and 15 volts, with a common QRP output power of 5W. The reference design is provided for 50, 144, 220 and 432 MHz, but the circuit could be adapted to other bands.</p>

<p><a href="/content/TinyBeacon-EN-Guenael.pdf">Download here</a></p>

<p><a href="/content/TinyBeacon-EN-Guenael.pdf"><img src="/content//TinyBeacon-EN-Guenael-cover.jpg" alt="TinyBeacon project" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Article - Slot antennas for amateur radio bands]]></title>
    <link href="http://guenael.ca/blog/2014/05/25/article-slot-antennas/"/>
    <updated>2014-05-25T12:00:00+02:00</updated>
    <id>http://guenael.ca/blog/2014/05/25/article-slot-antennas</id>
    <content type="html"><![CDATA[<p>My last paper presents designs and calculations for a set of slot antennas centered on the amateur microwave bands. Special attention has been given to ease of construction, using simple supply materials available in standard sizes in the construction industry. Also, the traditional calculation formulas, which are only valid with a perfect waveguide, have been extended using iterative simulation and optimization to apply to common materials, while maintaining good performance.</p>

<p><a href="/content/Slot-antennas-for-amateur-radio-bands-EN-Guenael.pdf">Download here</a></p>

<p><a href="/content/Slot-antennas-for-amateur-radio-bands-EN-Guenael.pdf"><img src="/content/Slot-antennas-for-amateur-radio-bands-EN-Guenael-cover.png" alt="Slot antennas for amateur radio bands" /></a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ebCTF - CRY100: Clear text attack]]></title>
    <link href="http://guenael.ca/blog/2013/06/02/ebCTF-cry100/"/>
    <updated>2013-06-02T23:00:00+02:00</updated>
    <id>http://guenael.ca/blog/2013/06/02/ebCTF-cry100</id>
    <content type="html"><![CDATA[<p>The second challenge for the <a href="http://ebctf.nl/">ebCTF teaser</a> was very easy too, and solved by a very large number of participants. For this crypto challenge named CRY100, the Zip file provided was self-contained and it can be started offline (available <a href="http://ebctf.nl/files/314b0dd3220cf584c8b2a31f7da6aaf1/cry100_espionage.tar.gz">here</a> ).</p>

<p>After unpacking, the README file drop a password, useful to decrypt the first encrypted message, but not the second. So, we have to decrypt this second message without additional help, but the answer is not very far :) Indeed, watching the code gives interesting details, and the most important one should be about the ciphering function, where a XOR is simply used. Another interesting point was about the input key, hashed many time before to be used on the XOR function.</p>

<p>The context given with the previous decrypted message illustrate a perfect case of plaintext attack : With the previous decrypted message, we can bet than the second ciphered message have the same header. Since the ciphering function was a simple XOR, we only have to take the first bloc of the ciphered text and XOR it with the clear text bloc to get the key. Of course, it’s not the original text key, but the computed key. For sure we cannot deduce easily the initial text key (hash = one way-function), but we don’t need to know this key, deciphering the second message is good enough :)</p>

<p>Well, adding only 2 lines of code allows to retrieve the computed key and get the content of the ciphered message.</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="n">clearText</span> <span class="o">=</span> <span class="s">"From: Vlugge Jap"</span>
<span class="n">k</span> <span class="o">=</span> <span class="n">xor</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">16</span><span class="p">],</span> <span class="n">clearText</span><span class="p">)</span></code></pre></figure>

<p>In the application code:</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c">#!/usr/bin/python2</span>
<span class="kn">import</span> <span class="nn">hashlib</span><span class="o">,</span> <span class="nn">string</span><span class="o">,</span> <span class="nn">sys</span>

<span class="n">ROUNDS</span> <span class="o">=</span> <span class="mi">20000</span>

<span class="k">def</span> <span class="nf">xor</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">):</span>
    <span class="n">l</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
    <span class="k">return</span> <span class="s">''</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">^</span> <span class="nb">ord</span><span class="p">(</span><span class="n">y</span><span class="p">))</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">a</span><span class="p">[:</span><span class="n">l</span><span class="p">],</span> <span class="n">b</span><span class="p">[:</span><span class="n">l</span><span class="p">])])</span>

<span class="k">def</span> <span class="nf">h</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="n">x</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">.</span><span class="n">digest</span><span class="p">()</span>
    <span class="n">x</span> <span class="o">=</span> <span class="n">xor</span><span class="p">(</span><span class="n">x</span><span class="p">[:</span><span class="mi">16</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="mi">16</span><span class="p">:])</span>
    <span class="k">return</span> <span class="n">x</span>

<span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="nb">all</span><span class="p">([</span><span class="nb">ord</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">127</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">x</span><span class="p">])</span>

<span class="k">def</span> <span class="nf">crypt</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">passwd</span><span class="p">):</span>
    <span class="n">k</span> <span class="o">=</span> <span class="n">h</span><span class="p">(</span><span class="n">passwd</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="n">ROUNDS</span><span class="p">):</span>
        <span class="n">k</span> <span class="o">=</span> <span class="n">h</span><span class="p">(</span><span class="n">k</span><span class="p">)</span>

    <span class="n">out</span> <span class="o">=</span> <span class="s">''</span>

    <span class="c"># Clear text attack - ebCTF-CRY100 (2 lines)</span>
    <span class="n">clearText</span> <span class="o">=</span> <span class="s">"From: Vlugge Jap"</span>
    <span class="n">k</span> <span class="o">=</span> <span class="n">xor</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">16</span><span class="p">],</span> <span class="n">clearText</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">msg</span><span class="p">),</span> <span class="mi">16</span><span class="p">):</span>
        <span class="n">out</span> <span class="o">+=</span> <span class="n">xor</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">16</span><span class="p">],</span> <span class="n">k</span><span class="p">)</span>
        <span class="n">k</span> <span class="o">=</span> <span class="n">h</span><span class="p">(</span><span class="n">k</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">msg</span><span class="p">)))</span>

    <span class="k">return</span> <span class="n">out</span>

<span class="k">def</span> <span class="nf">encrypt</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">passwd</span><span class="p">):</span>
    <span class="n">msg</span> <span class="o">=</span> <span class="n">crypt</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span>

    <span class="k">return</span> <span class="n">msg</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">'base64'</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">decrypt</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">passwd</span><span class="p">):</span>
    <span class="n">msg</span> <span class="o">=</span> <span class="n">crypt</span><span class="p">(</span><span class="n">msg</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">'base64'</span><span class="p">),</span> <span class="n">passwd</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">verify</span><span class="p">(</span><span class="n">msg</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">msg</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">'Looks like a bad decrypt</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>
        <span class="n">sys</span><span class="o">.</span><span class="nb">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">5</span> <span class="ow">or</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s">'encrypt'</span><span class="p">,</span> <span class="s">'decrypt'</span><span class="p">):</span>
    <span class="k">print</span> <span class="s">'Usage:</span><span class="se">\t</span><span class="s">crypto.py encrypt &lt;password&gt; &lt;infile&gt; &lt;outfile&gt;'</span>
    <span class="k">print</span> <span class="s">'</span><span class="se">\t</span><span class="s">crypto.py decrypt &lt;password&gt; &lt;infile&gt; &lt;outfile&gt;'</span>
    <span class="n">sys</span><span class="o">.</span><span class="nb">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

<span class="n">op</span><span class="p">,</span> <span class="n">passwd</span><span class="p">,</span> <span class="n">infile</span><span class="p">,</span> <span class="n">outfile</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>

<span class="n">inp</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">infile</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>

<span class="k">if</span> <span class="n">op</span> <span class="o">==</span> <span class="s">'encrypt'</span><span class="p">:</span>
    <span class="n">ct</span> <span class="o">=</span> <span class="n">encrypt</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span>
    <span class="nb">open</span><span class="p">(</span><span class="n">outfile</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">ct</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">op</span> <span class="o">==</span> <span class="s">'decrypt'</span><span class="p">:</span>
    <span class="n">pt</span> <span class="o">=</span> <span class="n">decrypt</span><span class="p">(</span><span class="n">inp</span><span class="p">,</span> <span class="n">passwd</span><span class="p">)</span>
    <span class="nb">open</span><span class="p">(</span><span class="n">outfile</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pt</span><span class="p">)</span></code></pre></figure>

<p>And finally, the result:</p>

<p><img src="http://guenael.ca/images/posts/ebCTF-CRY100-final.png" alt="ebCTF CRY100 Decoded message" /></p>

<p>Thanks again Eindbazen!</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ebCTF - BIN100: The dices secret face]]></title>
    <link href="http://guenael.ca/blog/2013/06/02/ebCTF-bin100/"/>
    <updated>2013-06-02T22:00:00+02:00</updated>
    <id>http://guenael.ca/blog/2013/06/02/ebCTF-bin100</id>
    <content type="html"><![CDATA[<p>Last week-end, I played some hours to the <a href="http://ebctf.nl/">ebCTF teaser</a>. The first challenges (100 points) were very easy, but funny in the same time. <a href="http://ebctf.nl/files/8cc2391a7a4d2f86355a10a1abdafbba/ebCTF-Teaser-BIN100-Dice.exe">BIN100</a> was a console application for Windows, containing a tiny dice game. The goal was to get the right sequence of dices to win the game. I’m pretty sure that it was possible to beat the game in different ways, but I choose an easy one, using IDA to understand the internals and force the destiny :)</p>

<p>Playing the game in a usual way shows some interesting strings, for example : “You rolled a three! Good!”, and I simply chose to search “Good” in IDA to locate some interesting blocs of code.</p>

<p><img src="/images/posts/ebCTF-BIN100-dice.png" alt="ebCTF BIN 100 Game screen capture" /></p>

<p>The first hit was without appeal and you can see on the screenshot below the conditional jump before the printed result. So, I nopped all the five calls to complete the sequence, directly on the binary file. By chance, there is no internal check (ex. hash check on the code) and the program gave me the flag without any more question.</p>

<p><img src="/images/posts/ebCTF-BIN100.png" alt="ebCTF BIN 100 IDA debugging" /></p>

<p>The funny joke appear during the last dice roll, the next screenshot speaks for itself :)</p>

<p><img src="/images/posts/ebCTF-BIN100-funny.png" alt="ebCTF BIN 100 Dice joke" /></p>

<p>Thanks Eindbazen!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[PlaidCTF giga250: Common factor attack]]></title>
    <link href="http://guenael.ca/blog/2013/04/25/giga250/"/>
    <updated>2013-04-25T22:12:00+02:00</updated>
    <id>http://guenael.ca/blog/2013/04/25/giga250</id>
    <content type="html"><![CDATA[<p>The last <a href="http://play.plaidctf.com/">PlaidCTF</a> was full of very interesting challenges. Giga was one of them in the crypto thread. The source code of the application was provided and it reveal an <a href="https://en.wikipedia.org/wiki/RSA_%28algorithm%29">RSA cryptosystem</a>. Each time you connect the server, it generate a new key and encrypt the flag with it, after you can send any strings and get the encrypted result.</p>

<p>A quick look into the code shows extra effort on the random function, to insert a vulnerability. The quality of the generated random is degraded and partially reused beetween sessions. So, we can guess a faulty key generation, and a possible attack is about common factor. A good reading is available <a href="http://www.loyalty.org/~schoen/rsa/">here</a>.</p>

<p>The source code provided is self-contained and I started to debug my attack locally, simulating the same conditions :</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c">#!/usr/bin/env python</span>

<span class="c"># PlaidCTF [FFF] Crypto challenge : giga 250pts</span>
<span class="c"># Writeup : Guenael</span>
<span class="c">#</span>
<span class="c"># Vulnerability : Random fault RSA key generation</span>
<span class="c"># Attack : RSA common factor attack </span>
<span class="c"># References : http://www.loyalty.org/~schoen/rsa/</span>

<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="n">bytes_to_long</span><span class="p">,</span> <span class="n">long_to_bytes</span>
<span class="kn">from</span> <span class="nn">Crypto.PublicKey</span> <span class="kn">import</span> <span class="n">RSA</span>
<span class="kn">from</span> <span class="nn">Crypto.Hash</span> <span class="kn">import</span> <span class="n">MD5</span>

<span class="n">DEBUG</span> <span class="o">=</span> <span class="mi">1</span>

<span class="c"># Code from Rosettacode : http://rosettacode.org/wiki/Greatest_common_divisor#Python</span>
<span class="k">def</span> <span class="nf">gcd</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
	<span class="k">return</span> <span class="n">gcd</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">u</span> <span class="o">%</span> <span class="n">v</span><span class="p">)</span> <span class="k">if</span> <span class="n">v</span> <span class="k">else</span> <span class="nb">abs</span><span class="p">(</span><span class="n">u</span><span class="p">)</span>

<span class="c"># Code from Rosettacode : http://rosettacode.org/wiki/Modular_inverse#Python</span>
<span class="k">def</span> <span class="nf">extended_gcd</span><span class="p">(</span><span class="n">aa</span><span class="p">,</span> <span class="n">bb</span><span class="p">):</span>
    <span class="n">lastremainder</span><span class="p">,</span> <span class="n">remainder</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">aa</span><span class="p">),</span> <span class="nb">abs</span><span class="p">(</span><span class="n">bb</span><span class="p">)</span>
    <span class="n">x</span><span class="p">,</span> <span class="n">lastx</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">lasty</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span>
    <span class="k">while</span> <span class="n">remainder</span><span class="p">:</span>
        <span class="n">lastremainder</span><span class="p">,</span> <span class="p">(</span><span class="n">quotient</span><span class="p">,</span> <span class="n">remainder</span><span class="p">)</span> <span class="o">=</span> <span class="n">remainder</span><span class="p">,</span> <span class="nb">divmod</span><span class="p">(</span><span class="n">lastremainder</span><span class="p">,</span> <span class="n">remainder</span><span class="p">)</span>
        <span class="n">x</span><span class="p">,</span> <span class="n">lastx</span> <span class="o">=</span> <span class="n">lastx</span> <span class="o">-</span> <span class="n">quotient</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span>
        <span class="n">y</span><span class="p">,</span> <span class="n">lasty</span> <span class="o">=</span> <span class="n">lasty</span> <span class="o">-</span> <span class="n">quotient</span><span class="o">*</span><span class="n">y</span><span class="p">,</span> <span class="n">y</span>
    <span class="k">return</span> <span class="n">lastremainder</span><span class="p">,</span> <span class="n">lastx</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">aa</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">1</span><span class="p">),</span> <span class="n">lasty</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">bb</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">1</span><span class="p">)</span>

<span class="c"># Code from Rosettacode : http://rosettacode.org/wiki/Modular_inverse#Python</span>
<span class="k">def</span> <span class="nf">modinv</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
	<span class="n">g</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">extended_gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">g</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
		<span class="k">raise</span> <span class="nb">ValueError</span>
	<span class="k">return</span> <span class="n">x</span> <span class="o">%</span> <span class="n">m</span>

<span class="c"># Random fault vulnerability</span>
<span class="k">def</span> <span class="nf">rng</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
	<span class="k">if</span> <span class="n">DEBUG</span><span class="o">&gt;</span><span class="mi">1</span><span class="p">:</span> <span class="k">print</span> <span class="s">'arg. n= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
	<span class="k">global</span> <span class="n">rbuf</span>
	<span class="n">rand</span> <span class="o">=</span> <span class="n">rbuf</span><span class="p">[:</span><span class="n">n</span><span class="p">]</span>
	<span class="n">rbuf</span> <span class="o">=</span> <span class="n">rbuf</span><span class="p">[</span><span class="n">n</span><span class="p">:]</span>
	<span class="k">while</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">rbuf</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">4096</span><span class="p">):</span>
		<span class="n">hr</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">urandom</span><span class="p">(</span><span class="mi">4096</span><span class="p">))</span>
		<span class="n">rbuf</span> <span class="o">+=</span> <span class="n">rbuf</span> <span class="o">+</span> <span class="n">hr</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
	<span class="k">if</span> <span class="n">DEBUG</span><span class="o">&gt;</span><span class="mi">1</span><span class="p">:</span> <span class="k">print</span> <span class="s">'ret. rand= '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">bytes_to_long</span><span class="p">(</span><span class="n">rand</span><span class="p">))</span>
	<span class="k">return</span> <span class="n">rand</span>

<span class="n">rbuf</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">urandom</span><span class="p">(</span><span class="mi">4096</span><span class="p">)</span>
<span class="n">hr</span> <span class="o">=</span> <span class="n">MD5</span><span class="o">.</span><span class="n">new</span><span class="p">()</span>

<span class="n">clearText</span> <span class="o">=</span> <span class="s">'theSecretLocalFlag'</span>

<span class="n">nArray</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
	<span class="n">rsa</span> <span class="o">=</span> <span class="n">RSA</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="mi">1024</span><span class="p">,</span><span class="n">rng</span><span class="p">)</span>
	<span class="n">e</span><span class="o">=</span><span class="mi">65537</span> <span class="c">#e = getattr(rsa,'e') #65537 by default</span>
	<span class="n">ciphertext</span> <span class="o">=</span> <span class="n">bytes_to_long</span><span class="p">(</span><span class="n">rsa</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">clearText</span><span class="p">,</span><span class="s">""</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>

	<span class="n">a</span> <span class="o">=</span> <span class="mi">2</span><span class="o">**</span><span class="n">e</span> <span class="o">-</span> <span class="n">bytes_to_long</span><span class="p">(</span><span class="n">rsa</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="s">"</span><span class="se">\x02</span><span class="s">"</span><span class="p">,</span><span class="s">""</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
	<span class="n">b</span> <span class="o">=</span> <span class="mi">3</span><span class="o">**</span><span class="n">e</span> <span class="o">-</span> <span class="n">bytes_to_long</span><span class="p">(</span><span class="n">rsa</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="s">"</span><span class="se">\x03</span><span class="s">"</span><span class="p">,</span><span class="s">""</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>
	<span class="n">n</span> <span class="o">=</span> <span class="nb">long</span><span class="p">(</span><span class="n">extended_gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span>

	<span class="k">for</span> <span class="n">nc</span> <span class="ow">in</span> <span class="n">nArray</span><span class="p">:</span>
		<span class="n">p</span> <span class="o">=</span> <span class="n">extended_gcd</span><span class="p">(</span><span class="n">nc</span><span class="p">,</span><span class="n">n</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">p</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="o">**</span><span class="mi">510</span><span class="p">):</span> <span class="c"># Possible cadidate close to 1024/2 bits ?</span>
			<span class="n">q</span> <span class="o">=</span> <span class="n">n</span> <span class="o">/</span> <span class="n">p</span>    <span class="c"># Deduct q</span>
			<span class="n">d</span> <span class="o">=</span> <span class="n">modinv</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="p">(</span><span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">q</span><span class="o">-</span><span class="mi">1</span><span class="p">))</span> <span class="c"># Calculate the private key</span>
			<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
				<span class="k">print</span> <span class="s">"n= "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
				<span class="k">print</span> <span class="s">"p= "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
				<span class="k">print</span> <span class="s">"q= "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">q</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
				<span class="k">print</span> <span class="s">"d= "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>

			<span class="k">print</span><span class="p">(</span><span class="s">"Decrpyted ciphertext: "</span><span class="p">)</span>
			<span class="k">print</span> <span class="n">long_to_bytes</span><span class="p">(</span><span class="nb">pow</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span>

			<span class="n">quit</span><span class="p">()</span>
	<span class="n">nArray</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="k">print</span> <span class="s">"Trying another candidate..."</span></code></pre></figure>

<p>In a second time, the code was adapted to connect the real server :</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c">#!/usr/bin/env python</span>

<span class="c"># PlaidCTF [FFF] Crypto challenge : giga 250pts</span>
<span class="c"># Writeup : Guenael</span>
<span class="c">#</span>
<span class="c"># Vulnerability : Random fault RSA key generation</span>
<span class="c"># Attack : RSA common factor attack </span>
<span class="c"># References : http://www.loyalty.org/~schoen/rsa/</span>

<span class="kn">import</span> <span class="nn">re</span>
<span class="kn">import</span> <span class="nn">telnetlib</span>
<span class="kn">from</span> <span class="nn">Crypto.Util.number</span> <span class="kn">import</span> <span class="n">bytes_to_long</span><span class="p">,</span> <span class="n">long_to_bytes</span>
<span class="kn">from</span> <span class="nn">Crypto.PublicKey</span> <span class="kn">import</span> <span class="n">RSA</span>
<span class="kn">from</span> <span class="nn">Crypto.Hash</span> <span class="kn">import</span> <span class="n">MD5</span>

<span class="n">DEBUG</span> <span class="o">=</span> <span class="bp">True</span>

<span class="c"># Code snip from Rosettacode : http://rosettacode.org/wiki/Modular_inverse#Python</span>
<span class="k">def</span> <span class="nf">extended_gcd</span><span class="p">(</span><span class="n">aa</span><span class="p">,</span> <span class="n">bb</span><span class="p">):</span>
    <span class="n">lastremainder</span><span class="p">,</span> <span class="n">remainder</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">aa</span><span class="p">),</span> <span class="nb">abs</span><span class="p">(</span><span class="n">bb</span><span class="p">)</span>
    <span class="n">x</span><span class="p">,</span> <span class="n">lastx</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">lasty</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0</span>
    <span class="k">while</span> <span class="n">remainder</span><span class="p">:</span>
        <span class="n">lastremainder</span><span class="p">,</span> <span class="p">(</span><span class="n">quotient</span><span class="p">,</span> <span class="n">remainder</span><span class="p">)</span> <span class="o">=</span> <span class="n">remainder</span><span class="p">,</span> <span class="nb">divmod</span><span class="p">(</span><span class="n">lastremainder</span><span class="p">,</span> <span class="n">remainder</span><span class="p">)</span>
        <span class="n">x</span><span class="p">,</span> <span class="n">lastx</span> <span class="o">=</span> <span class="n">lastx</span> <span class="o">-</span> <span class="n">quotient</span><span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span>
        <span class="n">y</span><span class="p">,</span> <span class="n">lasty</span> <span class="o">=</span> <span class="n">lasty</span> <span class="o">-</span> <span class="n">quotient</span><span class="o">*</span><span class="n">y</span><span class="p">,</span> <span class="n">y</span>
    <span class="k">return</span> <span class="n">lastremainder</span><span class="p">,</span> <span class="n">lastx</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">aa</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">1</span><span class="p">),</span> <span class="n">lasty</span> <span class="o">*</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span> <span class="k">if</span> <span class="n">bb</span> <span class="o">&lt;</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">1</span><span class="p">)</span>

<span class="c"># Code snip from Rosettacode : http://rosettacode.org/wiki/Modular_inverse#Python</span>
<span class="k">def</span> <span class="nf">modinv</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">m</span><span class="p">):</span>
	<span class="n">g</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">extended_gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">g</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
		<span class="k">raise</span> <span class="nb">ValueError</span>
	<span class="k">return</span> <span class="n">x</span> <span class="o">%</span> <span class="n">m</span>

<span class="n">e</span><span class="o">=</span><span class="mi">65537</span> <span class="c">#65537 used by default on Crypto.PublicKey API</span>

<span class="n">HOST</span> <span class="o">=</span> <span class="s">'184.73.59.25'</span>
<span class="n">PORT</span> <span class="o">=</span> <span class="mi">4321</span>
<span class="n">MSG</span>  <span class="o">=</span> <span class="s">"Now enter a message you wish to encrypt: "</span>

<span class="n">nArray</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
	<span class="n">tn</span> <span class="o">=</span> <span class="n">telnetlib</span><span class="o">.</span><span class="n">Telnet</span><span class="p">(</span><span class="n">HOST</span><span class="p">,</span><span class="n">PORT</span><span class="p">)</span>
	<span class="n">ciphertext</span> <span class="o">=</span> <span class="nb">long</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s">'={34}</span><span class="err">\</span><span class="s">W(</span><span class="err">\</span><span class="s">w+?)</span><span class="err">\</span><span class="s">W={34}'</span><span class="p">,</span> <span class="n">tn</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="n">MSG</span><span class="p">),</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span><span class="o">.</span><span class="n">groups</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span><span class="mi">16</span><span class="p">)</span>

	<span class="n">tn</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">"</span><span class="se">\x02</span><span class="s">"</span><span class="p">)</span> <span class="c"># Short values are faster for next gcd</span>
	
	<span class="n">a</span> <span class="o">=</span> <span class="mi">2</span><span class="o">**</span><span class="n">e</span> <span class="o">-</span> <span class="nb">long</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s">'={34}</span><span class="err">\</span><span class="s">W(</span><span class="err">\</span><span class="s">w+?)</span><span class="err">\</span><span class="s">W={34}'</span><span class="p">,</span> <span class="n">tn</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="n">MSG</span><span class="p">),</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span><span class="o">.</span><span class="n">groups</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span><span class="mi">16</span><span class="p">)</span>

	<span class="n">tn</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">"</span><span class="se">\x03</span><span class="s">"</span><span class="p">)</span>
	<span class="n">b</span> <span class="o">=</span> <span class="mi">3</span><span class="o">**</span><span class="n">e</span> <span class="o">-</span> <span class="nb">long</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s">'={34}</span><span class="err">\</span><span class="s">W(</span><span class="err">\</span><span class="s">w+?)</span><span class="err">\</span><span class="s">W={34}'</span><span class="p">,</span> <span class="n">tn</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="n">MSG</span><span class="p">),</span> <span class="n">re</span><span class="o">.</span><span class="n">MULTILINE</span><span class="p">)</span><span class="o">.</span><span class="n">groups</span><span class="p">()[</span><span class="mi">0</span><span class="p">],</span><span class="mi">16</span><span class="p">)</span>

	<span class="n">tn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>

	<span class="n">n</span> <span class="o">=</span> <span class="nb">long</span><span class="p">(</span><span class="n">extended_gcd</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)[</span><span class="mi">0</span><span class="p">])</span> <span class="c"># Extract the public key</span>

	<span class="k">for</span> <span class="n">nc</span> <span class="ow">in</span> <span class="n">nArray</span><span class="p">:</span>
		<span class="c"># Looking for a common factor with the previous keys</span>
		<span class="n">p</span> <span class="o">=</span> <span class="n">extended_gcd</span><span class="p">(</span><span class="n">nc</span><span class="p">,</span><span class="n">n</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> 
		<span class="c"># Remove false positives. Prime close to 1024/2 bits ?</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">p</span> <span class="o">&gt;</span> <span class="mi">2</span><span class="o">**</span><span class="mi">510</span><span class="p">):</span> 
			<span class="n">q</span> <span class="o">=</span> <span class="n">n</span> <span class="o">/</span> <span class="n">p</span>
			<span class="n">d</span> <span class="o">=</span> <span class="n">modinv</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="p">(</span><span class="n">p</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">q</span><span class="o">-</span><span class="mi">1</span><span class="p">))</span> <span class="c"># Calculate the private key</span>
			<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
				<span class="k">print</span> <span class="s">"n= "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
				<span class="k">print</span> <span class="s">"p= "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
				<span class="k">print</span> <span class="s">"q= "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">q</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
				<span class="k">print</span> <span class="s">"d= "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">+</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>

			<span class="k">print</span><span class="p">(</span><span class="s">"Decrpyted ciphertext: "</span><span class="p">)</span>
			<span class="k">print</span> <span class="n">long_to_bytes</span><span class="p">(</span><span class="nb">pow</span><span class="p">(</span><span class="n">ciphertext</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">n</span><span class="p">))</span> <span class="c"># Decode ciphertext with the private key</span>

			<span class="n">quit</span><span class="p">()</span>
	<span class="n">nArray</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">n</span><span class="p">)</span>
	<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span> <span class="k">print</span> <span class="s">"Trying another candidate..."</span></code></pre></figure>

<p>And finally, the original source code of the challenge (available on other place, but given here to be self-contained)</p>

<p>Thanks FFF!</p>

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c">#!/usr/bin/env python</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">from</span> <span class="nn">Crypto.PublicKey</span> <span class="kn">import</span> <span class="n">RSA</span>
<span class="kn">from</span> <span class="nn">Crypto.Hash</span> <span class="kn">import</span> <span class="n">MD5</span>
<span class="kn">import</span> <span class="nn">SocketServer</span>
<span class="kn">import</span> <span class="nn">threading</span>
<span class="kn">import</span> <span class="nn">time</span>

<span class="n">rbuf</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">urandom</span><span class="p">(</span><span class="mi">4096</span><span class="p">)</span>
<span class="n">hr</span> <span class="o">=</span> <span class="n">MD5</span><span class="o">.</span><span class="n">new</span><span class="p">()</span>

<span class="n">flag</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">"secret"</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">rng</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
  <span class="k">global</span> <span class="n">rbuf</span>
  <span class="n">rand</span> <span class="o">=</span> <span class="n">rbuf</span><span class="p">[:</span><span class="n">n</span><span class="p">]</span>
  <span class="n">rbuf</span> <span class="o">=</span> <span class="n">rbuf</span><span class="p">[</span><span class="n">n</span><span class="p">:]</span>
  <span class="k">while</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">rbuf</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">4096</span><span class="p">):</span>
    <span class="n">hr</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">urandom</span><span class="p">(</span><span class="mi">4096</span><span class="p">))</span>
    <span class="n">rbuf</span> <span class="o">+=</span> <span class="n">rbuf</span> <span class="o">+</span> <span class="n">hr</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
  <span class="k">return</span> <span class="n">rand</span>


<span class="k">class</span> <span class="nc">threadedserver</span><span class="p">(</span><span class="n">SocketServer</span><span class="o">.</span><span class="n">ThreadingMixIn</span><span class="p">,</span> <span class="n">SocketServer</span><span class="o">.</span><span class="n">TCPServer</span><span class="p">):</span>
    <span class="k">pass</span>

<span class="k">class</span> <span class="nc">incoming</span><span class="p">(</span><span class="n">SocketServer</span><span class="o">.</span><span class="n">BaseRequestHandler</span><span class="p">):</span>
  <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
    <span class="n">cur_thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">current_thread</span><span class="p">()</span>
    <span class="n">welcome</span> <span class="o">=</span> <span class="s">"""
*******************************************
*** Welcome to GIGA! ***
**the super secure key management service**
*******************************************

We are generating an RSA keypair for you now.
(Please be sure to move your mouse to populate the entropy stream)
"""</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">welcome</span><span class="p">)</span>
    <span class="n">rsa</span> <span class="o">=</span> <span class="n">RSA</span><span class="o">.</span><span class="n">generate</span><span class="p">(</span><span class="mi">1024</span><span class="p">,</span><span class="n">rng</span><span class="p">)</span>
    <span class="k">print</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">rsa</span><span class="p">,</span><span class="s">'n'</span><span class="p">)</span>
    <span class="c">#make it look like we're doing hardcore crypto</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">xrange</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
      <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.2</span><span class="p">)</span>
      <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"."</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">Congratulations! Key created!</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>

    <span class="c">#no one will ever be able to solve our super challenge!</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"To prove how secure our service is "</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"here is an encrypted flag:</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"==================================</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">rsa</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span><span class="s">""</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"hex"</span><span class="p">))</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">==================================</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
    <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"Find the plaintext and we'll give you points</span><span class="se">\n\n</span><span class="s">"</span><span class="p">)</span>

    <span class="c">#now they can be safe from the FBI too!</span>
    <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
      <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">Now enter a message you wish to encrypt: "</span><span class="p">)</span>
      <span class="n">m</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
      <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"Your super unreadable ciphertext is:</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
      <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"==================================</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
      <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">rsa</span><span class="o">.</span><span class="n">encrypt</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="s">""</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"hex"</span><span class="p">))</span>
      <span class="bp">self</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">==================================</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>

<span class="n">server</span> <span class="o">=</span> <span class="n">threadedserver</span><span class="p">((</span><span class="s">"0.0.0.0"</span><span class="p">,</span> <span class="mi">4321</span><span class="p">),</span> <span class="n">incoming</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">timeout</span> <span class="o">=</span> <span class="mi">4</span>
<span class="n">server_thread</span> <span class="o">=</span> <span class="n">threading</span><span class="o">.</span><span class="n">Thread</span><span class="p">(</span><span class="n">target</span><span class="o">=</span><span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">)</span>
<span class="n">server_thread</span><span class="o">.</span><span class="n">daemon</span> <span class="o">=</span> <span class="bp">True</span>
<span class="n">server_thread</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>

<span class="n">server_thread</span><span class="o">.</span><span class="n">join</span><span class="p">()</span></code></pre></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The website is up!]]></title>
    <link href="http://guenael.ca/blog/2013/04/25/up/"/>
    <updated>2013-04-25T21:56:00+02:00</updated>
    <id>http://guenael.ca/blog/2013/04/25/up</id>
    <content type="html"><![CDATA[<p>I decided to replace my old website by this new blog, focuses on CTF security challenges. No rocket science here, only my tiny experiments and some lines of code. Feel free to send me an email if you have questions or if you want exchange on some ctf problems. Thank you for your visit and good reading.</p>
]]></content>
  </entry>
  
</feed>
