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

  <title><![CDATA[Irken Kitties]]></title>
  <link href="http://irkenkitties.com/atom.xml" rel="self"/>
  <link href="http://irkenkitties.com/"/>
  <updated>2019-01-07T12:34:21-08:00</updated>
  <id>http://irkenkitties.com/</id>
  <author>
    <name><![CDATA[Safiire]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[An Integer Overflow Puzzle]]></title>
    <link href="http://irkenkitties.com/blog/2019/01/07/integer-overflow-puzzle/"/>
    <updated>2019-01-07T15:53:11-07:00</updated>
    <id>http://irkenkitties.com/blog/2019/01/07/integer-overflow-puzzle</id>
    <content type="html"><![CDATA[<p>I just came across this cute puzzle and decided to solve it.  Like a lot of simple CTF puzzles, we’re just asked
to pass some program arguments which when correct, guide the control flow to giving us a shell.</p>

<p>We’re given this C source code:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="cp">#include &lt;unistd.h&gt;</span>
</span><span class="line">
</span><span class="line"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">long</span> <span class="o">**</span><span class="n">argv</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="k">if</span><span class="p">(</span><span class="o">*</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="mh">0x1064deadbeef4601u</span> <span class="o">==</span> <span class="mh">0xd1038d2e07b42569u</span><span class="p">){</span>
</span><span class="line">    <span class="n">execl</span><span class="p">(</span><span class="s">&quot;/bin/sh&quot;</span><span class="p">,</span> <span class="s">&quot;sh&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>If we can provide the correct number in <code>*argv[1]</code>, passing this conditional, we’ll execute a <code>/bin/sh</code> shell on
this suid binary and win.  Continue on to see how it was solved.</p>

<!-- more -->

<h2 id="something-is-different-in-argv">Something is different in argv</h2>

<p>Normally the <code>main</code> function in a C program will look something like <code>int main(int argc, char **argv)</code> where <code>argc</code>
is the number of arguments provided, including the program name as argument 0, and <code>char **argv</code> or similarly <code>char *argv[]</code>
which is an array of pointers to character arrays (C strings) representing each argument.</p>

<p>The program’s environment variables <code>char **envp</code>, (the third argument to <code>main</code>, which has been left out in this case), and
the commandline arguments are loaded into the beginning of the stack area when the program loads.</p>

<p>Let’s say we run this program like this <code>./level02 one two three four</code>, and have a look at how that area of the stack looks in
radare2.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">$ </span>r2 -d ./level02 one two three four
</span><span class="line">-- I accidentally the kernel with radare2.
</span><span class="line">
</span><span class="line">Process with PID <span class="m">27842</span> started...
</span><span class="line"><span class="o">=</span> attach <span class="m">27842</span> 27842
</span><span class="line">
</span><span class="line"><span class="c">#  Short binary analysis</span>
</span><span class="line"><span class="o">[</span>0x564684b24050<span class="o">]</span>&gt; aa
</span><span class="line"><span class="o">[</span>x<span class="o">]</span> Analyze all flags starting with sym. and entry0 <span class="o">(</span>aa<span class="o">)</span>
</span><span class="line">
</span><span class="line"><span class="c"># Debug Continue Until main</span>
</span><span class="line"><span class="o">[</span>0x564684b24050<span class="o">]</span>&gt; dcu sym.main
</span><span class="line">
</span><span class="line">hit breakpoint at: 564684b24135
</span><span class="line">
</span><span class="line"><span class="c">#  Analyse Register rdi, first argument to main, normally named argc</span>
</span><span class="line"><span class="o">[</span>0x564684b24135<span class="o">]</span>&gt; ar rdi
</span><span class="line">0x00000005
</span><span class="line">
</span><span class="line"><span class="c">#  Analyse Register rsi, second argument to main, normally named argv</span>
</span><span class="line"><span class="o">[</span>0x564684b24135<span class="o">]</span>&gt; ar rsi
</span><span class="line">0x7ffe26db3678
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This is the X86_64 calling convention of putting function arguments in order in the registers: <code>rdi, rsi, rdx, rcx, r8, r9</code>
which means main was called essentially like this: <code>main(rdi, rsi)</code>, or in this case literally <code>main(5, 0x7ffe26db3678)</code>.</p>

<p>Somewhat confusingly this C program types <code>argv</code> differently, this will be important later.  So the four arguments we gave,
plus the program’s name gives us <code>5</code> here, and the stack address <code>0x7ffe26db3678</code> will be a pointer, to a pointer, to those
argument strings, so let’s look at that now.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="c">#  Print Hex, 0x50 bytes at the address pointed to by rsi</span>
</span><span class="line"><span class="o">[</span>0x564684b24135<span class="o">]</span>&gt; px 0x50 @ <span class="o">[</span>rsi<span class="o">]</span>
</span><span class="line">
</span><span class="line">- offset -       <span class="m">0</span> <span class="m">1</span>  <span class="m">2</span> <span class="m">3</span>  <span class="m">4</span> <span class="m">5</span>  <span class="m">6</span> <span class="m">7</span>  <span class="m">8</span> <span class="m">9</span>  A B  C D  E F  0123456789ABCDEF
</span><span class="line">0x7ffe26db5785  2e2f 6c65 <span class="m">7665</span> 6c30 <span class="m">3200</span> 6f6e <span class="m">6500</span> <span class="m">7477</span>  ./level02.one.tw
</span><span class="line">0x7ffe26db5795  6f00 <span class="m">7468</span> <span class="m">7265</span> <span class="m">6500</span> 666f <span class="m">7572</span> 004c 535f  o.three.four.LS_
</span><span class="line">0x7ffe26db57a5  434f 4c4f <span class="m">5253</span> 3d72 733d 303a <span class="m">6469</span> 3d30  <span class="nv">COLORS</span><span class="o">=</span><span class="nv">rs</span><span class="o">=</span>0:di<span class="o">=</span>0
</span><span class="line">0x7ffe26db57b5  313b <span class="m">3334</span> 3a6c 6e3d <span class="m">3031</span> 3b33 363a 6d68  1<span class="p">;</span>34:ln<span class="o">=</span>01<span class="p">;</span>36:mh
</span><span class="line">0x7ffe26db57c5  3d30 303a <span class="m">7069</span> 3d34 303b <span class="m">3333</span> 3a73 <span class="nv">6f3d</span>  <span class="o">=</span>00:pi<span class="o">=</span>40<span class="p">;</span>33:so<span class="o">=</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We can see here the following arguments, <code>./level02</code>, <code>one</code>, <code>two</code>, <code>three</code>, and <code>four</code>, each separated by a <code>0x00</code> null character
to terminate the string.  After that we have a similar situation for environment variables, <code>LS_COLORS=...</code> shown here, which we
don’t care about.</p>

<h2 id="an-argument-string-is-not-an-integer">An Argument String is Not an Integer</h2>

<p>Remembering that <code>char **argv</code> and <code>char *argv[]</code> mean essentially the same thing in C, let’s find out what happens when that
is changed to <code>long **argv</code>.</p>

<p>In the normal course of things <code>char *argv[]</code> holds an array of <code>char *</code> which are C strings as shown above.  In this program
we have <code>long **argv</code> which essentially means a pointer to an array of pointers to <code>long</code>.  Confusing?</p>

<p>Basically what this is going to do is force a string entered on the commandline to be interpreted as a type of 64-bit signed
int called a <code>long</code>.  It’s going to force the bytes in a string to be interpreted as a 64-bit number, which we’ll subsequently do
some math on.  Computers don’t care about data types, and in C we can take any pointer to some bytes and say, consider the following
bytes as this type.</p>

<p>Let’s have some fun, and convert an 8 character string into a 64-bit integer, a <code>long</code> as this program is doing.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="cp">#include &lt;stdio.h&gt;</span>
</span><span class="line">
</span><span class="line"><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">){</span>
</span><span class="line">
</span><span class="line">  <span class="kt">char</span> <span class="o">*</span><span class="n">string</span> <span class="o">=</span> <span class="s">&quot;ABCDEFGH&quot;</span><span class="p">;</span>
</span><span class="line">  <span class="kt">long</span> <span class="o">*</span><span class="n">integer</span> <span class="o">=</span> <span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)</span><span class="n">string</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;sizeof(long) = %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">long</span><span class="p">));</span>
</span><span class="line">  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%p</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">integer</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Giving the output:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="err">$</span> <span class="p">.</span><span class="o">/</span><span class="n">string_to_int</span>
</span><span class="line"><span class="k">sizeof</span><span class="p">(</span><span class="kt">long</span><span class="p">)</span> <span class="o">=</span> <span class="mi">8</span>
</span><span class="line"><span class="mh">0x4847464544434241</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We can see, because X86_64 is little endian, <code>A = 0x41, B = 0x42</code>, and so on, is now backwards, and represents a fairly
large 64-bit number.</p>

<h2 id="finding-the-correct-number-for-argv1">Finding the Correct Number for argv[1]</h2>

<p>Since we now understand how a commandline string can represent a number, let’s find that number so we can pass the following
condition:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="c"><span class="line">  <span class="k">if</span><span class="p">(</span><span class="o">*</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">*</span> <span class="mh">0x1064deadbeef4601u</span> <span class="o">==</span> <span class="mh">0xd1038d2e07b42569u</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This should be as simple as taking this equation and rearranging it terms of <code>x</code>:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="n">x</span> <span class="o">*</span> <span class="mh">0x1064deadbeef4601</span> <span class="o">=</span> <span class="mh">0xd1038d2e07b42569</span>
</span><span class="line"><span class="n">x</span> <span class="o">=</span> <span class="mh">0xd1038d2e07b42569</span> <span class="o">/</span> <span class="mh">0x1064deadbeef4601</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This works out to <code>x = 12</code>, and it’s wrong.  This is because we’re mixing regular algebra with integer division
and disregarding that integers on the computer have a finite range due to bit depth, and wrap around when they exceed the
resolution of bits used.</p>

<p>Now let’s say we have, for example 8-bit unsigned integers and multiply <code>99 * 5 = 495</code>.  The maximum value of of an 8-bit
unsigned integer is <code>2^8 - 1 = 255</code>, and this is too high.  Counting 0, we have a total of 256 distinct values.</p>

<p>In order to find out how this expression will actually work out on the CPU we can say instead <code>99 * 5 mod 2^8 = 239</code>, which
is the answer you would get for 8-bits after it wraps around.  We’ll use that next for our 64-bit values.</p>

<p>I’m going to use Wolfram Alpha to solve for <code>x</code>, because I don’t know offhand how to do algebra involving modulus.  First
we’ll convert the large 64-bit hex into decimal.  I very much like hex, but Wolfram Alpha doesn’t. Boo to that.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="mh">0x1064deadbeef4601u</span> <span class="o">=</span> <span class="mi">1181313840091973121</span>
</span><span class="line"><span class="mh">0xd1038d2e07b42569u</span> <span class="o">=</span> <span class="mi">15061036807694329193</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Then entering this equation into Wolfram to solve for <code>x</code>:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="perl"><span class="line"><span class="n">mod</span><span class="p">(</span><span class="mi">1181313840091973121</span> <span class="o">*</span> <span class="n">x</span><span class="p">,</span> <span class="mi">2</span><span class="o">^</span><span class="mi">64</span><span class="p">)</span> <span class="o">=</span> <span class="mi">15061036807694329193</span>
</span><span class="line">
</span><span class="line"><span class="n">Solution</span> <span class="n">is</span> <span class="n">this</span> <span class="n">set</span> <span class="n">of</span> <span class="n">linear</span> <span class="n">equations:</span>
</span><span class="line"><span class="n">x</span> <span class="o">=</span> <span class="mi">18446744073709551616</span> <span class="o">*</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">8319100071223652201</span>  <span class="n">forall</span> <span class="n">n</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This will give a valid solution for any <code>n</code>, because of the cyclic nature of integer overflows, so let’s just pick <code>n = 1</code>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="n">n</span> <span class="o">=</span> <span class="mi">1</span>
</span><span class="line"><span class="n">x</span> <span class="o">=</span> <span class="mi">18446744073709551616</span> <span class="o">*</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">8319100071223652201</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">26765844144933203817</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>We now have one of an infinite amount of solutions, but we have a problem, this number is too large to fit into 64-bits.
How can we tell how many bits a number needs to be represented?  The base 2 logarithm of a number will let us know exactly
how many bits are needed.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="n">x</span> <span class="o">=</span> <span class="mi">26765844144933203817</span>
</span><span class="line"><span class="no">Math</span><span class="o">.</span><span class="n">log2</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">64</span><span class="o">.</span><span class="mi">53702695614811</span>
</span><span class="line">
</span><span class="line"><span class="c1">#  Requires just slightly more than 64-bits.</span>
</span><span class="line"><span class="c1">#  Wrap it back into 64-bit range, gives us a 63 bit number, which is fine</span>
</span><span class="line"><span class="n">wrapped</span> <span class="o">=</span> <span class="n">x</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">64</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">8319100071223652201</span>
</span><span class="line">
</span><span class="line"><span class="c1">#  Now fits into 62-ish bits, good.</span>
</span><span class="line"><span class="no">Math</span><span class="o">.</span><span class="n">log2</span><span class="p">(</span><span class="n">wrapped</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">62</span><span class="o">.</span><span class="mi">85113317948744</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Looks like we should have just picked <code>n = 0</code> and saved ourselves some time.  I figured as much, but we got to show off
the <code>log2</code> thing, so whatever.  I’m interested in knowing if we can solve this with values of <code>n &lt; 0</code>, but not <em>that</em> interested
at the moment :)</p>

<p>Next we need to check that <code>8319100071223652201</code> is the number we’re looking for by multiplying it out, this looks like
it’s going to be a HUGE number, so we’ll again need to use modulus to wrap it back within 64-bits.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="mi">8319100071223652201</span> <span class="o">*</span> <span class="mi">1181313840091973121</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">9827468051246619677849523421944489321</span>
</span><span class="line">
</span><span class="line"><span class="c1">#  Again wrap it back into 64-bit</span>
</span><span class="line"><span class="p">(</span><span class="mi">8319100071223652201</span> <span class="o">*</span> <span class="mi">1181313840091973121</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span><span class="o">**</span><span class="mi">64</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">15061036807694329193</span>
</span><span class="line">
</span><span class="line"><span class="c1">#  Exactly the number that will pass the conditional</span>
</span><span class="line"><span class="mh">0xd1038d2e07b42569</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">15061036807694329193</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="convert-our-found-number-to-hex">Convert our found number to hex</h2>

<p>Our number is <code>8319100071223652201</code>, and in hexadecimal that is <code>0x7373617034366f69</code>.  This looks suspiciously like each byte
is an ASCII character value to me, forming an 8 character string, so let’s convert that in radare.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">&gt; ? 0x7373617034366f69
</span><span class="line">hex     0x7373617034366f69
</span><span class="line">octal   0715633027006415467551
</span><span class="line">int64   8319100071223652201
</span><span class="line">string  <span class="s2">&quot;io64pass&quot;</span>
</span><span class="line">binary  0b0111001101110011011000010111000000110100001101100110111101101001
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Looks like we have found the commandline argument that will get us our suid shell, <code>io64pass</code> so let’s try it out.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">$ </span>ls -lah level02
</span><span class="line">-rwsr-xr-x <span class="m">1</span> root root 17K Jan  <span class="m">7</span> 01:02 level02
</span><span class="line">
</span><span class="line"><span class="nv">$ </span>./level02 io64pass
</span><span class="line"><span class="c"># whoami</span>
</span><span class="line">root
</span><span class="line"><span class="c"># id</span>
</span><span class="line"><span class="nv">uid</span><span class="o">=</span>0<span class="o">(</span>root<span class="o">)</span> <span class="nv">gid</span><span class="o">=</span>0<span class="o">(</span>root<span class="o">)</span> <span class="nv">groups</span><span class="o">=</span>0<span class="o">(</span>root<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Solving a Danish Defense Intelligence Puzzle]]></title>
    <link href="http://irkenkitties.com/blog/2017/08/19/solving-danish-defense-intelligence-puzzle/"/>
    <updated>2017-08-19T15:53:11-07:00</updated>
    <id>http://irkenkitties.com/blog/2017/08/19/solving-danish-defense-intelligence-puzzle</id>
    <content type="html"><![CDATA[<p>While I was browsing the Reverse Engineering sub on Reddit a few months ago, I came across a puzzle that the poster said came from a Danish newspaper.
It consisted of a single fairly large image, with a small amount of x86 assembly on one side, and a large block of text on the other, formatted to
display a question mark.  So, having finally had the time to sit down and solve this recently, I thought I would do a writeup, explaining my
thought processes along the way in the hopes someone can learn from it.  Another goal here is to expose people to the majesty of Radare2, which
is a Vim-like commandline reverse engineering tool that follows the principles of the Unix philosophy.</p>

<p><img src="http://irkenkitties.com/images/dan32.png" alt="The Challenge" title="The Challenge" /></p>

<p>It looks like a CrackMe, or capture the flag exercise.  The x86 assembly is clearly a virtual machine, and I assumed the block of text on the
right would be a binary that runs on that virtual machine.  I call the machine, for lack of a better name, <em>Dan32</em>, because as I later
found out, it is a 32-bit virtual machine, and originates from Denmark.</p>

<p>The block of text on the right is base64 encoded, which is easy enough to to convert back into a binary file, but since it is an image,
we can’t directly get at that block in a text format without doing some kind of optical character recognition.  We can guess it is base64
encoded by the characters used, and really after you’ve seen a lot of base64, you can usually spot it pretty easily.</p>

<p>I tried a few online OCR services, which did not work, and since I had invested almost no time into this, I was ready to say the hell with it.
I was not about to type all that base64 text into my text editor by hand.</p>

<p>I did end up solving this puzzle and creating tools to reverse engineer it, what follows is a detailed writeup, read on for more.</p>

<p>Note: If you are using a blocker such as Privacy Badger, like I do, I’ve noticed the terminal movie playback embeds from asciinema.org may
be blocked by default.  If you wish to see those in this post, you’ll have to toggle that domain to allow in your plugin, though you don’t
need to accept cookies from that domain for it to work.</p>

<!-- more -->

<h2 id="getting-the-base64-text">Getting the Base64 Text</h2>
<p>Staring at it a bit longer, we notice certain characters in the base64 side are bolded, and if we go through and write down each bolded character,
it spells out some nonsense <code>MzJoYWNrZXI1NTd6amt6aS5vbmlvbgo.</code>.</p>

<p>I thought, since we are looking at a massive bunch of base64, that maybe this was also base64 encoded.  We can use a tool called <code>rax2</code> which
is a part of Radare2 in order to decode it like this:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">$ </span>rax2 -D MzJoYWNrZXI1NTd6amt6aS5vbmlvbgo.
</span><span class="line">32hacker557zjkzi.onion
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>It’s a vanity <code>.onion</code> address on the TOR network.  The site, which unfortunately is not online anymore, has downloads for both the assembly listing, and the base64,
saving us from needing to worry about how to get those characters into our computer by hand.</p>

<p>My approach to these sorts of files, that might be malicious or not, is usually to use <code>hexdump</code> or a hex editor program to look at them
before going any further.  After doing this to the base64 file, I notice that it is full of ANSI terminal escape sequences, and that these
ones are for positioning text at (x,y) coordinates, setting bolding etc.  This is because if you were to <code>cat</code> the file to your terminal,
it would reproduce the formatting seen in the image, with the question mark and all, which is pretty cute, and are actually required to
put the text in the right order to be decoded.</p>

<p>Before I <code>cat</code> this to my terminal, I wrote a script to check each of the ANSI escape sequences to make sure they were only positional
and style commands, and nothing weird or malicious.  They turned out alright, so I printed it to my terminal and copy pasted the
text into a file.  Then I wrote another script to remove the end of line hyphens, join it all together, and base64 decode it, resulting
in a binary file that I named <a href="https://github.com/safiire/radare2-dan32/blob/master/disk.img" title="disk.img">disk.img</a></p>

<p>You can find the complete source code for all of the Radare2 plugins I wrote to solve this <a href="https://github.com/safiire/radare2-dan32/">on my github</a>.</p>

<h2 id="the-virtual-machine">The Virtual Machine</h2>
<p>The provided x86 assembly for the virtual machine is bare bones, but it tells us everything we need to know to run this binary.
The label <code>OP_TABLE</code> points to an enumeration of each opcode the VM supports, and the order, so we know the numeric value of the that op.</p>

<p><img src="http://irkenkitties.com/images/dan32_asm1.png" alt="Assembly Listing" title="Assembly Listing" /></p>

<p>Some more information we learn from the given asm is</p>

<ul>
  <li>There are at least 64 registers in this machine</li>
  <li>It must be a 32-bit machine</li>
  <li><code>%define REG(r) [REGS + r * 4]</code> Registers are 32-bits wide</li>
  <li><code>%define PTR(p) [MEM + p]</code> It requires some read/write memory space</li>
  <li><code>lea esi [DISK + esi]</code> It requires some read/write space to act as a disk</li>
  <li><code>mov eax, [OP_TABLE + eax * 4]</code> Every opcode is 4 bytes wide</li>
  <li><code>cmov</code> is the only way to do conditionals</li>
</ul>

<p>Even after learning all that information, it’s incomplete, some of the opcodes are not given implementations, such as <code>write,
in, div</code>, and the various sized <code>load.x, store.x</code>, and <code>nor</code>, to name a few.  So we’ll need to look at what’s given,
and implement those ourselves.</p>

<h2 id="my-philosophy-of-reversing">My Philosophy of Reversing</h2>
<p>Here’s where a major part of my reverse engineering philosophy comes in, I don’t as a rule like to run random binaries given to me,
especially in malware/crackme situations.  If I take the VM’s assembly listing, complete the missing implementations, and run the
mystery binary <code>disk.img</code>, I have literally no idea what it is capable of at this point.  Worst case scenario is that binary knows
about flaw in the given virtual machine, and exploits it for a VM escape onto my host system and starts doing shit.</p>

<p>I’m heavy on the static analysis side, but at this point I don’t have any debugger, or analysis tools that even understand this
made up computer architecture.  What I want to do, is use Radare2 to reverse engineer the binary, so I’m going to need to teach Radare2
about this file format, computer architecture, invent a textural assembly language, and so on.  And that’s the real fun of this challenge for
me, honestly, so that’s what I did.  Radare2 allows you to write plugins to extend it, so it can understand any CPU, real or
imagined, and simulate its running through ESIL (Evaluable Strings Intermediate Language).</p>

<h2 id="radare2-plugins">Radare2 Plugins</h2>
<p>The first Radare2 plugin to write, is the asm plugin.  This plugin takes the 32-bit machine level opcodes and fills in a structure
with information about that opcode, its arguments, and it provides a textual representation for viewing a disassembly listing.</p>

<p>In order to do this, we’ll write a plugin in C.  The asm plugin’s main function has the following prototype</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="k">static</span> <span class="kt">int</span> <span class="nf">disassemble</span><span class="p">(</span><span class="n">RAsm</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="n">RAsmOp</span> <span class="o">*</span><span class="n">op</span><span class="p">,</span> <span class="n">ut8</span> <span class="o">*</span><span class="n">buf</span><span class="p">,</span> <span class="n">ut64</span> <span class="n">len</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The parameters to <code>disassemble</code> are:</p>

<ul>
  <li><code>RAsm *a</code> is the current assembler context</li>
  <li><code>RAsmOp *op</code> is the structure we need to fill in</li>
  <li><code>ut8 *buf</code> are the opcode bytes we are disassembling</li>
  <li><code>ut64 len</code> is the length of <code>buf</code></li>
</ul>

<p>The important fields of <code>RAsmOp</code> to fill in here, are <code>buf_asm</code> which holds the textual representation of the disassembled opcode,
and <code>size</code>, the size of the opcode.</p>

<p>Looking at the provided x86 assembly code, we can see how to dismantle a 32-bit opcode into its constituent parts, remember all
opcodes are 4 bytes long or 32-bits.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">mov</span> <span class="no">ebp</span><span class="p">,</span> <span class="no">edx</span>
</span><span class="line"><span class="nf">shr</span> <span class="no">ebp</span><span class="p">,</span> <span class="mi">21</span>
</span><span class="line"><span class="nf">and</span> <span class="no">ebp</span><span class="p">,</span> <span class="mi">77</span><span class="no">o</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">esi</span><span class="p">,</span> <span class="no">edx</span>
</span><span class="line"><span class="nf">shr</span> <span class="no">esi</span><span class="p">,</span> <span class="mi">15</span>
</span><span class="line"><span class="nf">and</span> <span class="no">esi</span><span class="p">,</span> <span class="mi">77</span><span class="no">o</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">edi</span><span class="p">,</span> <span class="no">edx</span>
</span><span class="line"><span class="nf">shr</span> <span class="no">edi</span><span class="p">,</span> <span class="mi">9</span>
</span><span class="line"><span class="nf">and</span> <span class="no">edi</span><span class="p">,</span> <span class="mi">77</span><span class="no">o</span>
</span><span class="line">
</span><span class="line"><span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">edx</span>
</span><span class="line"><span class="nf">shr</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">27</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="err">[</span><span class="no">OP_TABLE</span> <span class="err">+</span> <span class="no">eax</span> <span class="p">*</span> <span class="mi">4</span><span class="err">]</span>
</span><span class="line"><span class="nf">jmp</span> <span class="no">eax</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Becomes</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="cp">#define SIX_BIT 077</span>
</span><span class="line">
</span><span class="line"><span class="c1">//  Cast 4 bytes from buf to a unsigned 32 bit value</span>
</span><span class="line"><span class="n">ut32</span> <span class="n">dword</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">ut32</span><span class="o">*</span><span class="p">)</span><span class="n">buf</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="c1">//  32 - 27 leaves a 5-bit opcode</span>
</span><span class="line"><span class="n">ut8</span> <span class="n">op_index</span> <span class="o">=</span> <span class="p">(</span><span class="n">dword</span> <span class="o">&gt;&gt;</span> <span class="mi">27</span><span class="p">);</span>
</span><span class="line">
</span><span class="line"><span class="c1">//  Extract 3 6-bit arguments using the SIX_BIT mask</span>
</span><span class="line"><span class="n">ut8</span> <span class="n">edi</span> <span class="o">=</span> <span class="p">(</span><span class="n">dword</span> <span class="o">&gt;&gt;</span> <span class="mi">9</span> <span class="p">)</span> <span class="o">&amp;</span> <span class="n">SIX_BIT</span><span class="p">;</span>
</span><span class="line"><span class="n">ut8</span> <span class="n">esi</span> <span class="o">=</span> <span class="p">(</span><span class="n">dword</span> <span class="o">&gt;&gt;</span> <span class="mi">15</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">SIX_BIT</span><span class="p">;</span>
</span><span class="line"><span class="n">ut8</span> <span class="n">ebp</span> <span class="o">=</span> <span class="p">(</span><span class="n">dword</span> <span class="o">&gt;&gt;</span> <span class="mi">21</span><span class="p">)</span> <span class="o">&amp;</span> <span class="n">SIX_BIT</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Next, for convenience, we make a lookup table that maps 0 to 63 to the corresponding register name.  I happen to know from
the future, that <code>r62</code> is the stack pointer, and <code>r63</code> is the instruction pointer, but I didn’t know this at the time.
It makes reading the disassembly a lot easier though once we know this.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="k">static</span> <span class="k">const</span> <span class="k">struct</span> <span class="p">{</span>
</span><span class="line">    <span class="kt">char</span> <span class="o">*</span><span class="n">name</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span> <span class="n">regs</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">  <span class="p">{</span> <span class="s">&quot;r00&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r01&quot;</span>  <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r02&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r03&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r04&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r05&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r06&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r07&quot;</span> <span class="p">},</span>
</span><span class="line">  <span class="p">{</span> <span class="s">&quot;r08&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r09&quot;</span>  <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r10&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r11&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r12&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r13&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r14&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r15&quot;</span> <span class="p">},</span>
</span><span class="line">  <span class="p">{</span> <span class="s">&quot;r16&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r17&quot;</span>  <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r18&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r19&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r20&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r21&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r22&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r23&quot;</span> <span class="p">},</span>
</span><span class="line">  <span class="p">{</span> <span class="s">&quot;r24&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r25&quot;</span>  <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r26&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r27&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r28&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r29&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r30&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r31&quot;</span> <span class="p">},</span>
</span><span class="line">  <span class="p">{</span> <span class="s">&quot;r32&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r33&quot;</span>  <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r34&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r35&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r36&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r37&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r38&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r39&quot;</span> <span class="p">},</span>
</span><span class="line">  <span class="p">{</span> <span class="s">&quot;r40&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r41&quot;</span>  <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r42&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r43&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r44&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r45&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r46&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r47&quot;</span> <span class="p">},</span>
</span><span class="line">  <span class="p">{</span> <span class="s">&quot;r48&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r49&quot;</span>  <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r50&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r51&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r52&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r53&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r54&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r55&quot;</span> <span class="p">},</span>
</span><span class="line">  <span class="p">{</span> <span class="s">&quot;r56&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r57&quot;</span>  <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r58&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r59&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r60&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;r61&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;esp&quot;</span> <span class="p">},</span> <span class="p">{</span> <span class="s">&quot;eip&quot;</span> <span class="p">}</span>
</span><span class="line"><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Since in the disassembly output we’re going to be referencing things by register name a lot, I grab the textual names
for each argument as well.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="kt">char</span> <span class="o">*</span><span class="n">edi_reg</span> <span class="o">=</span> <span class="n">regs</span><span class="p">[</span><span class="n">edi</span><span class="p">].</span><span class="n">name</span><span class="p">;</span>
</span><span class="line"><span class="kt">char</span> <span class="o">*</span><span class="n">esi_reg</span> <span class="o">=</span> <span class="n">regs</span><span class="p">[</span><span class="n">esi</span><span class="p">].</span><span class="n">name</span><span class="p">;</span>
</span><span class="line"><span class="kt">char</span> <span class="o">*</span><span class="n">ebp_reg</span> <span class="o">=</span> <span class="n">regs</span><span class="p">[</span><span class="n">ebp</span><span class="p">].</span><span class="n">name</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>What follows in the <code>disassemble</code> function is a switch statement on <code>op_index</code>, where we just need to fill in the
op size and the textual representation of the opcode itself.  So I’ll show a few of those here, you can see the
full source of these plugins <a href="https://github.com/safiire/radare2-dan32" title="on my github">here</a></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="c"><span class="line">  <span class="k">case</span> <span class="mi">11</span><span class="o">:</span>
</span><span class="line">    <span class="n">snprintf</span><span class="p">(</span><span class="n">op</span><span class="o">-&gt;</span><span class="n">buf_asm</span><span class="p">,</span> <span class="n">R_ASM_BUFSIZE</span><span class="p">,</span> <span class="s">&quot;nor %s, %s, %s&quot;</span><span class="p">,</span> <span class="n">ebp_reg</span><span class="p">,</span> <span class="n">esi_reg</span><span class="p">,</span> <span class="n">edi_reg</span><span class="p">);</span>
</span><span class="line">    <span class="n">op</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
</span><span class="line">    <span class="k">break</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So for example the <code>nor</code> instruction, which wasn’t provided in the image, just uses <code>snprintf</code> to write out our
human readable disassembly, and sets the <code>op-&gt;size = 4</code>.  This ends up producing something like <code>nor r21, r57, r57</code>.</p>

<p>Quickly taking a look at another example, <code>movi</code> is the move immediate value instruction, and looks like this:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="k">case</span> <span class="mi">16</span><span class="o">:</span>
</span><span class="line">  <span class="n">eax</span> <span class="o">=</span> <span class="n">dword</span><span class="p">;</span>
</span><span class="line">  <span class="n">ecx</span> <span class="o">=</span> <span class="n">dword</span><span class="p">;</span>
</span><span class="line">  <span class="n">eax</span> <span class="o">&gt;&gt;=</span> <span class="mi">5</span><span class="p">;</span>
</span><span class="line">  <span class="n">eax</span> <span class="o">&amp;=</span> <span class="mh">0xffff</span><span class="p">;</span>
</span><span class="line">  <span class="n">ecx</span> <span class="o">&amp;=</span> <span class="mo">037</span><span class="p">;</span>
</span><span class="line">  <span class="n">eax</span> <span class="o">&lt;&lt;=</span> <span class="p">(</span><span class="n">ecx</span> <span class="o">&amp;</span> <span class="mh">0xff</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="n">snprintf</span><span class="p">(</span><span class="n">op</span><span class="o">-&gt;</span><span class="n">buf_asm</span><span class="p">,</span> <span class="n">R_ASM_BUFSIZE</span><span class="p">,</span> <span class="s">&quot;movi %s, 0x%0x&quot;</span><span class="p">,</span> <span class="n">ebp_reg</span><span class="p">,</span> <span class="n">eax</span><span class="p">);</span>
</span><span class="line">  <span class="n">op</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">=</span> <span class="mi">4</span><span class="p">;</span>
</span><span class="line">  <span class="k">break</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Notice <code>op-&gt;size = 4</code> for all instructions, and setting <code>op-&gt;size = -1</code> indicates an invalid operation.  The above <code>movi</code> instruction actually
encodes an immediate value directly into the opcode itself.  This is the only instruction which does this, all other instructions
must move values into a register to operate on them.  Again, this is a straight translation from from the given x86 asm.</p>

<p>Other instructions had to be put together just following the pattern that was set out for us.  For example, <code>div, mul, nor</code>
all work the same as the given <code>mul</code> opcode.  All said, it is not a lot of work to get a fully functioning disassembler going in Radare2.</p>

<p>Here is the last part of the plugin, where we hook our code up by setting callbacks, and some information:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="n">RAsmPlugin</span> <span class="n">r_asm_plugin_dan32</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">  <span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">&quot;dan32&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">author</span> <span class="o">=</span> <span class="s">&quot;safiire@irkenkitties.com&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">license</span> <span class="o">=</span> <span class="s">&quot;None&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">desc</span> <span class="o">=</span> <span class="s">&quot;Dan32 disassembler&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">arch</span> <span class="o">=</span> <span class="s">&quot;dan32&quot;</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">bits</span> <span class="o">=</span> <span class="mi">32</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">init</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">fini</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">disassemble</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">disassemble</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">modify</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">,</span>
</span><span class="line">  <span class="p">.</span><span class="n">assemble</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">,</span>
</span><span class="line"><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>And here’s the result, a nice looking assembly readout that we can use to start reversing the binary.</p>

<p><img src="http://irkenkitties.com/images/r2_disassembly1.png" alt="Disassembly" title="Disassembly" /></p>

<h2 id="radare-analysis-plugin">Radare Analysis Plugin</h2>
<p>With the above plugin we can now see human readable disassembly of the binary, but Radare doesn’t have enough information
about this architecture yet to allow us to step through the program and simulate it like you would in a debugger. And you can’t yet
perform static analysis like you would get with IDA.  Radare supports about one zillion architectures already, but
since this CPU was probably invented just for this challenge, we’ll have to add support ourselves.</p>

<p>Radare’s answer to this is ESIL, (Evaluable Strings Intermediate Language), providing a register profile for the
CPU, and using those to create an analysis plugin.  An analysis plugin expects us to implement a function like this, to set
the register profile.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="k">static</span> <span class="kt">int</span> <span class="nf">set_reg_profile</span><span class="p">(</span><span class="n">RAnal</span> <span class="o">*</span><span class="n">anal</span><span class="p">)</span> <span class="p">{</span>
</span><span class="line">  <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">p</span> <span class="o">=</span>
</span><span class="line">  <span class="s">&quot;=A0  r03</span><span class="se">\n</span><span class="s">&quot;</span>
</span><span class="line">  <span class="s">&quot;=A1  r04</span><span class="se">\n</span><span class="s">&quot;</span>
</span><span class="line">  <span class="s">&quot;=A2  r05</span><span class="se">\n</span><span class="s">&quot;</span>
</span><span class="line">  <span class="s">&quot;=LR  r59</span><span class="se">\n</span><span class="s">&quot;</span>
</span><span class="line">  <span class="s">&quot;=PC  r63</span><span class="se">\n</span><span class="s">&quot;</span>
</span><span class="line">  <span class="s">&quot;=SP  r62</span><span class="se">\n</span><span class="s">&quot;</span>
</span><span class="line">  <span class="s">&quot;gpr r00 .32   0 0</span><span class="se">\n</span><span class="s"> gpr r01 .32   4 0</span><span class="se">\n</span><span class="s"> gpr r02 .32 ... etc&quot;</span>
</span><span class="line">  <span class="s">&quot;gpr r08 .32  32 0</span><span class="se">\n</span><span class="s"> gpr r09 .32  36 0</span><span class="se">\n</span><span class="s"> gpr r10 .32 ...&quot;</span>
</span><span class="line">  <span class="s">&quot;gpr r16 .32  64 0</span><span class="se">\n</span><span class="s"> gpr r17 .32  68 0</span><span class="se">\n</span><span class="s"> gpr r18 .32 ...&quot;</span>
</span><span class="line">  <span class="s">&quot;gpr r24 .32  96 0</span><span class="se">\n</span><span class="s"> gpr r25 .32 100 0</span><span class="se">\n</span><span class="s"> gpr r26 .32 ...&quot;</span>
</span><span class="line">  <span class="s">&quot;gpr r32 .32 128 0</span><span class="se">\n</span><span class="s"> gpr r33 .32 132 0</span><span class="se">\n</span><span class="s"> gpr r34 .32 ...&quot;</span>
</span><span class="line">  <span class="s">&quot;gpr r40 .32 160 0</span><span class="se">\n</span><span class="s"> gpr r41 .32 164 0</span><span class="se">\n</span><span class="s"> gpr r42 .32 ...&quot;</span>
</span><span class="line">  <span class="s">&quot;gpr r48 .32 192 0</span><span class="se">\n</span><span class="s"> gpr r49 .32 196 0</span><span class="se">\n</span><span class="s"> gpr r50 .32 ...&quot;</span>
</span><span class="line">  <span class="s">&quot;gpr r56 .32 224 0</span><span class="se">\n</span><span class="s"> gpr r57 .32 228 0</span><span class="se">\n</span><span class="s"> gpr r58 .32 ...&quot;</span>
</span><span class="line">  <span class="k">return</span> <span class="n">r_reg_set_profile_string</span><span class="p">(</span><span class="n">anal</span><span class="o">-&gt;</span><span class="n">reg</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Here we specify all 64 general purpose registers in the machine, and also give aliases to registers that have special meaning.
The format is <code>gpr &lt;registername&gt; .&lt;size in bits&gt; &lt;offset&gt;</code>.</p>

<p>With this we can create a register file containing registers of various sizes, which can overlap. For example in x86, we can specify
register <code>gpr ax .16 0</code>, but also specify the high and low bytes as <code>gpr ah .8 8</code> and <code>gpr al .8 0</code>.</p>

<p>Dan32 doesn’t have overlapping registers, or high and low register access by name, so we don’t need to do this.</p>

<p>Some register aliases are A0, A1, A2, which are for arguments that are passed to functions via register, which is
pretty common in this binary.  LR is the link register, which like on an ARM CPU holds the return address of a function, PC, is the
instruction pointer, and SP is the stack pointer, so I’ve filled those in after having gotten some experience with the
binary’s two calling conventions.</p>

<p>The next task for the analysis plugin is to create ESIL for each and every instruction supported by the CPU. There are not many
instructions so this didn’t take very long.</p>

<p>The plugin must implement an analysis function with the following prototype, which looks extremely similar to the asm plugin function:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="k">static</span> <span class="kt">int</span> <span class="nf">dan32_anal_op</span><span class="p">(</span><span class="n">RAnal</span> <span class="o">*</span><span class="n">anal</span><span class="p">,</span> <span class="n">RAnalOp</span> <span class="o">*</span><span class="n">op</span><span class="p">,</span> <span class="n">ut64</span> <span class="n">addr</span><span class="p">,</span> <span class="k">const</span> <span class="n">ut8</span> <span class="o">*</span><span class="n">data</span><span class="p">,</span> <span class="kt">int</span> <span class="n">len</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Here, we’re asked to fill in more information about the opcode in the given <code>RAnalOp *op</code> parameter, it looks something like this:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="k">struct</span> <span class="n">RAnalOp</span> <span class="p">{</span>
</span><span class="line">  <span class="n">id</span>       <span class="c1">// I use the opcode index</span>
</span><span class="line">  <span class="n">esil</span>     <span class="c1">// A string containing ESIL</span>
</span><span class="line">  <span class="n">size</span>     <span class="c1">// Size of opcode, this is always 4 in dan32</span>
</span><span class="line">  <span class="n">nopcode</span>  <span class="c1">// No idea, other plugins set this to 1</span>
</span><span class="line">  <span class="n">addr</span>     <span class="c1">// Address this opcode is at</span>
</span><span class="line">  <span class="n">jump</span>     <span class="c1">// If this opcode jumps somewhere, the address</span>
</span><span class="line">  <span class="n">fail</span>     <span class="c1">// Where to jump on failure condition</span>
</span><span class="line">  <span class="n">ptr</span>      <span class="c1">// Pointer to the primary data we&#39;re working with</span>
</span><span class="line">  <span class="n">val</span>      <span class="c1">// Value of the primary data we&#39;re working with</span>
</span><span class="line">  <span class="n">type</span>     <span class="c1">// enum of types such as R_ANAL_OP_TYPE_CJMP for conditional jump</span>
</span><span class="line">  <span class="n">family</span>   <span class="c1">// enum of type family such as R_ANAL_OP_FAMILY_IO for I/O</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>All of these are pretty important for proper analysis, but the most important, so that we can simulate this binary inside
radare2, without running it on the untrusted VM we were given, is the ESIL.  Here is an example of ESIL for <code>movi</code>, the
move immediate value instruction:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="mi">0x41</span>
</span><span class="line">
</span><span class="line"><span class="err">;</span> <span class="nf">becomes</span>
</span><span class="line">
</span><span class="line"><span class="err">0</span><span class="nf">x41</span><span class="p">,</span><span class="no">r57</span><span class="p">,</span><span class="err">=</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>ESIL is a stack machine, turing complete, so it is able to represent the instructions for any CPU, it is like a ridiculous
sort of microcode almost.  A more complicated instruction <code>cmov</code>, the conditional move instruction, looks like this:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">cmov</span> <span class="no">eip</span><span class="p">,</span> <span class="no">r57</span> <span class="no">if</span> <span class="no">r23</span>
</span><span class="line">
</span><span class="line"><span class="err">;</span>  <span class="nf">becomes</span>
</span><span class="line">
</span><span class="line"><span class="nf">r23</span><span class="p">,</span><span class="err">?</span><span class="p">,</span><span class="err">{</span><span class="p">,</span><span class="no">r57</span><span class="p">,</span><span class="no">eip</span><span class="p">,</span><span class="err">=</span><span class="p">,</span><span class="err">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So after each instruction is codified by type and given an ESIL representation, we’re done.  If you are
interested in how ESIL works, <a href="https://radare.gitbooks.io/radare2book/content/disassembling/esil.html">here’s the docs</a>.
I’ve written some pretty crazy ESIL for the disk sector read/write code, and stack machines are not my favourite, but
they work :)   Here is some of the longest ESIL I wrote for one opcode.  It reads 512 bytes from a numbered disk sector, into a given memory address.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">read</span> <span class="err">[</span><span class="no">r57</span><span class="err">]</span><span class="p">,</span> <span class="no">sector</span><span class="p">(</span><span class="no">r21</span><span class="p">)</span>
</span><span class="line">
</span><span class="line"><span class="err">;</span>  <span class="nf">becomes</span>
</span><span class="line">
</span><span class="line"><span class="err">0</span><span class="nf">x0</span><span class="p">,</span><span class="no">r40</span><span class="p">,</span><span class="err">=</span><span class="p">,</span>
</span><span class="line"><span class="err">0</span><span class="nf">x200</span><span class="p">,</span><span class="no">r21</span><span class="p">,*,</span>
</span><span class="line"><span class="err">0</span><span class="nf">x200000</span><span class="p">,</span><span class="err">+</span><span class="p">,</span>
</span><span class="line"><span class="nf">r40</span><span class="p">,</span><span class="err">+</span><span class="p">,</span>
</span><span class="line"><span class="err">[8],</span>
</span><span class="line"><span class="nf">r57</span><span class="p">,</span><span class="no">r40</span><span class="p">,</span><span class="err">+</span><span class="p">,</span>
</span><span class="line"><span class="err">=[8],</span>
</span><span class="line"><span class="err">0</span><span class="nf">x8</span><span class="p">,</span><span class="no">r40</span><span class="p">,</span><span class="err">+=</span><span class="p">,</span>
</span><span class="line"><span class="err">0</span><span class="nf">x200</span><span class="p">,</span><span class="no">r40</span><span class="p">,</span><span class="err">==</span><span class="p">,</span><span class="err">!</span><span class="p">,</span>
</span><span class="line"><span class="err">?{,3,</span><span class="nf">GOTO</span><span class="p">,</span><span class="err">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="disassembling-the-binary-in-radare2">Disassembling the binary in Radare2</h2>

<p>Ok, so now we’re all set to get a disassembly view of this binary, we’ll just load it up in Radare2, hit play
to see how it goes.</p>

<script type="text/javascript" src="https://asciinema.org/a/134202.js" id="asciicast-134202" data-preload="1" async=""></script>

<p>“Wrong Endianness”.  Now, there are a few things going on here, so let’s look at the first instruction: <code>movi r00, 0x78200</code>.
I don’t want to get to bogged down in the details, but I know from the future, that register <code>r00</code> is like the zero register
on a MIPS system, it always contains the value 0, and so here writing <code>0x78200</code> to that register, is effectively a no-op,
and we’ll see why that’s done in the next part.</p>

<p>Next up we have <code>movi eip, 0x14</code>.  There are no jump instructions in this opcode set, and unlike x86, you <em>can</em> write to the
instruction pointer register to get a jump.  Interestingly, jumping to <code>0x14</code> is not a multiple of 4, and so we’re jumping out of alignment,
which is why we’re seeing the disassembler isn’t able to interpret a few instructions after that at first.</p>

<p>When we get to the address <code>0x14</code>, we end up at series of instructions that loads immediates, and then uses <code>out</code> to print them
out to the display.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">0</span><span class="nf">x00000014</span>  <span class="no">e00a2087</span>    <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">W</span><span class="err">&#39;</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000018</span>  <span class="mi">000020</span><span class="no">cf</span>    <span class="no">out</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0000001c</span>  <span class="mi">21072087</span>    <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">r</span><span class="err">&#39;</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000020</span>  <span class="mi">000020</span><span class="no">cf</span>    <span class="no">out</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000024</span>  <span class="no">e00d2087</span>    <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">o</span><span class="err">&#39;</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000028</span>  <span class="mi">000020</span><span class="no">cf</span>    <span class="no">out</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0000002c</span>  <span class="no">e1062087</span>    <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">n</span><span class="err">&#39;</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000030</span>  <span class="mi">000020</span><span class="no">cf</span>    <span class="no">out</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000034</span>  <span class="no">e00c2087</span>    <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="err">&#39;</span><span class="no">g</span><span class="err">&#39;</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000038</span>  <span class="mi">000020</span><span class="no">cf</span>    <span class="no">out</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0000003c</span>  <span class="mi">25002087</span>    <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="err">&#39;</span> <span class="err">&#39;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>A little bit of radare knowledge, the immediate values were displayed as hex to begin with, so I wrote a little radare expression
to hint to it that those immediates are actually string or char values using the <code>ahi</code> command, which stands for “analyse hint immediate”.</p>

<p>Radare2 is terse as hell, and you get very used to it, and probably, maybe, start loving it.  The expression below basically creates
a range from the current address, denoted as <code>$$</code>, to <code>$$ + 17 * 8</code> with a step of 8 bytes.  The <code>@@=</code> functions as an iterator, which runs
the command <code>ahi s</code> on each address in the range, telling radare the immediate values are character values.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">ahi</span> <span class="no">s</span> <span class="err">@@=`?</span><span class="no">s</span> <span class="no">$$</span> <span class="no">$$</span><span class="err">+</span><span class="mi">17</span><span class="p">*</span><span class="mi">8</span> <span class="mi">8</span><span class="err">`</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Anyway, the real problem is we’re interpreting the binary as little endian, when it’s actually big endian.  So we can just go back to our plugin
and fix that pretty simply in the disassemble function by reversing the bytes, and setting the endian properly.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="c1">//  Decode the op</span>
</span><span class="line"><span class="n">ut8</span> <span class="n">big_end</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span>
</span><span class="line"><span class="n">big_end</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">buf</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
</span><span class="line"><span class="n">big_end</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">buf</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
</span><span class="line"><span class="n">big_end</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">buf</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span><span class="line"><span class="n">big_end</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="n">buf</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span><span class="line">
</span><span class="line"><span class="n">ut32</span> <span class="n">dword</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">ut32</span><span class="o">*</span><span class="p">)</span><span class="n">big_end</span><span class="p">;</span>
</span><span class="line"><span class="n">ut8</span> <span class="n">op_index</span> <span class="o">=</span> <span class="p">(</span><span class="n">dword</span> <span class="o">&gt;&gt;</span> <span class="mi">27</span><span class="p">);</span>       <span class="c1">// 5-bit opcode</span>
</span><span class="line">
</span><span class="line"><span class="c1">// ...</span>
</span><span class="line">
</span><span class="line"><span class="n">RAsmPlugin</span> <span class="n">r_asm_plugin_dan32</span> <span class="o">=</span> <span class="p">{</span>
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line">
</span><span class="line">  <span class="p">.</span><span class="n">endian</span> <span class="o">=</span> <span class="n">R_SYS_ENDIAN_BIG</span><span class="p">,</span>
</span><span class="line">
</span><span class="line">  <span class="c1">// ...</span>
</span><span class="line"><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="correct-endian">Correct Endian</h2>
<p>Back to the entrypoint of our binary, what was once a no-op, when read backwards, jumps us past all the “Wrong Endian” stuff, and
begins displaying the binary properly so we can reverse it.</p>

<p>The opcode <code>87e00180</code> when read in big endian jumps us with <code>movi eip, 0xc</code>, and another jump <code>movi eip, 0xa8</code>, bringing us
finally to some actual code.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">0</span><span class="nf">x000000a8</span>   <span class="no">movi</span> <span class="no">r20</span><span class="p">,</span> <span class="mi">0xc0</span>
</span><span class="line"><span class="err">0</span><span class="nf">x000000ac</span>   <span class="no">movi</span> <span class="no">r21</span><span class="p">,</span> <span class="mi">0x14c</span>
</span><span class="line"><span class="err">0</span><span class="nf">x000000b0</span>   <span class="no">movi</span> <span class="no">r22</span><span class="p">,</span> <span class="mi">0xbe</span>
</span><span class="line"><span class="err">0</span><span class="nf">x000000b4</span>   <span class="no">store.b</span> <span class="err">[</span><span class="no">r22</span><span class="err">]</span><span class="p">,</span> <span class="no">r00</span>
</span><span class="line"><span class="err">0</span><span class="nf">x000000b8</span>   <span class="no">read</span> <span class="err">[</span><span class="no">r00</span><span class="err">]</span><span class="p">,</span> <span class="no">sector</span><span class="p">(</span><span class="no">r00</span><span class="p">)</span>
</span><span class="line"><span class="err">0</span><span class="nf">x000000bc</span>   <span class="no">goto</span> <span class="no">r21</span>
</span><span class="line"><span class="err">;</span>  <span class="nf">print</span> <span class="err">&quot;</span><span class="no">Disk</span> <span class="no">read</span> <span class="no">error</span><span class="err">!&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This is the first in a series of tricks and tests that the binary performs on the virtual machine itself to make sure it is
implemented properly.  With the use of a bin plugin for dan32, which I’m not going to bore you with here but is available on GitHub
with the rest of the code, I’ve tried to setup a memory layout that would be familiar for someone like myself who works with ELF or PE files.
Here is that layout.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">00</span>  <span class="err">0</span><span class="nf">x00000000</span> <span class="err">|</span><span class="c">#-------------------------| 0x0000092b  2.3K mrwx .text</span>
</span><span class="line"><span class="err">01</span>  <span class="err">0</span><span class="nf">x0000092c</span> <span class="err">|</span><span class="c">#-------------------------| 0x00000b79   589 mrw- .bss</span>
</span><span class="line"><span class="err">02*</span> <span class="err">0</span><span class="nf">x00000c00</span> <span class="err">|</span><span class="c">#-------------------------| 0x00007503 26.3K mrw- .encrypted</span>
</span><span class="line"><span class="err">03</span>  <span class="err">0</span><span class="nf">x000ffc00</span> <span class="err">|</span><span class="p">------------</span><span class="c">#-------------| 0x00100000    1K mrw- .stack</span>
</span><span class="line"><span class="err">04</span>  <span class="err">0</span><span class="nf">x00200000</span> <span class="err">|</span><span class="p">-------------------------</span><span class="c">#| 0x00207503 29.3K mrw- .diskrom</span>
</span><span class="line"><span class="err">05</span>  <span class="err">0</span><span class="nf">x00100000</span> <span class="err">|</span><span class="p">------------</span><span class="c">#############-| 0x001f0000  960K -rwx esil.ram</span>
</span><span class="line"><span class="err">=&gt;</span>  <span class="err">0</span><span class="nf">x00001dc0</span> <span class="err">|</span><span class="p">--------------------------</span><span class="err">|</span> <span class="mi">0x00001ec0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Remembering the <code>DISK</code> address that was mentioned in the x86 assembly VM, which is meant to represent a readable writeable
disk area from which the program is loaded.  This area stores <code>disk.img</code> in the <code>.diskrom</code> section at address <code>0x200000</code>.  I probably
shouldn’t have called it a diskrom, since you can write to it, but I didn’t know it was going to be written to at the time, so
it’s too late now.  I actually believed it was going to be something like a game cartridge rom at first, but oh well.</p>

<p>The code is executed from the <code>.text</code> section, with entrypoint <code>0x0</code>, and we have a <code>.bss</code> section which contains some initialized
data that is used in the program.  The <code>read</code> and <code>write</code> instructions are used to copy data from the disk into memory by <code>0x200</code> byte
sectors.</p>

<p>So the trick here, is that at <code>0xb4</code> we are writing from <code>r00</code>, which always contains zero to address <code>0xbe</code>, which is altering
an instruction.  Then, if your <code>read</code> instruction works properly this is immediately corrected by reloading the entire first
sector from <code>.diskrom</code> back into memory, undoing the damage.  If your <code>read</code> instruction is not working, you will be greeted by
the text “Disk read error!” and the program will halt.</p>

<script type="text/javascript" src="https://asciinema.org/a/134327.js" id="asciicast-134327" data-preload="1" async=""></script>

<p>Notice how the analysis plugin is working, showing beautiful ascii arrows that point to the destinations of our jumps.  When
the zero is written to address <code>0xbe</code>, it modifies the instruction, and we see the control flow is taking us directly towards
“Disk read error” and a halt.  The <code>read</code> immediately fixes this and the control flow updates.</p>

<h2 id="the-next-test">The Next Test</h2>
<p>Next we move on to <code>0x14c</code>, which is an area of the binary that sets up the stack pointer, and reads the rest
of the program from <code>.diskrom</code> one sector at a time.</p>

<p>I guess here we can get our first look at how dan32 goes about things.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">;--</span> <span class="nl">fcn_read_other_sectors:</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0000014c</span>      <span class="no">add</span> <span class="no">r61</span><span class="p">,</span> <span class="no">eip</span><span class="p">,</span> <span class="no">r00</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000150</span>      <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="mi">0x4</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000154</span>      <span class="no">nor</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000158</span>      <span class="no">add</span> <span class="no">r61</span><span class="p">,</span> <span class="no">r61</span><span class="p">,</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0000015c</span>      <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="mi">0x1</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000160</span>      <span class="no">add</span> <span class="no">r61</span><span class="p">,</span> <span class="no">r61</span><span class="p">,</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000164</span>      <span class="no">movi</span> <span class="no">esp</span><span class="p">,</span> <span class="no">sym.stack_end</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Here’s some things to take note of right off the bat:</p>

<ul>
  <li>There is no subtraction instruction</li>
  <li>There is no concept of signed numbers</li>
  <li>We can still have negative numbers using 2’s complement</li>
  <li>There are no other bitwise logical operations besides NOR</li>
  <li>NOR is universal, and can construct any other gate</li>
  <li>There is no direct way to move one register into another one, so addition + 0 is used</li>
  <li><code>nor(a, a)</code> flips all the bits of <code>a</code></li>
  <li><code>nor(a, a)</code> is equivalent to <code>-(a + 1)</code> in 2’s complement</li>
  <li><code>r00</code> is a hardware zero register</li>
  <li><code>r57</code> is used as a temporary register</li>
</ul>

<p>There’s a few patterns we see using NOR throughout this binary.  Above we want to save the instruction pointer to <code>r61</code>, and
then subtract 4 from it.  This is done many times in this binary like this:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">add</span> <span class="no">r61</span><span class="p">,</span> <span class="no">eip</span><span class="p">,</span> <span class="no">r00</span>     <span class="err">;</span>  <span class="no">r61</span> <span class="err">=</span> <span class="no">eip</span>
</span><span class="line"><span class="nf">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="mi">0x4</span>         <span class="err">;</span>  <span class="no">r57</span> <span class="err">=</span> <span class="mi">4</span>
</span><span class="line"><span class="nf">nor</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r57</span>     <span class="err">;</span>  <span class="no">r57</span> <span class="err">=</span> <span class="p">-</span><span class="mi">5</span>
</span><span class="line"><span class="nf">add</span> <span class="no">r67</span><span class="p">,</span> <span class="no">r61</span><span class="p">,</span> <span class="no">r57</span>     <span class="err">;</span>  <span class="no">r61</span> <span class="err">=</span> <span class="no">r61</span> <span class="p">-</span> <span class="mi">5</span>
</span><span class="line"><span class="nf">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="mi">0x1</span>         <span class="err">;</span>  <span class="no">r57</span> <span class="err">=</span> <span class="mi">1</span>
</span><span class="line"><span class="nf">add</span> <span class="no">r61</span><span class="p">,</span> <span class="no">r61</span><span class="p">,</span> <span class="no">r57</span>     <span class="err">;</span>  <span class="no">r61</span> <span class="err">=</span> <span class="no">r61</span> <span class="err">+</span> <span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This is a roundabout way of just saying <code>r61 = eip - 4</code>, but that’s what we’re dealing with here :)</p>

<p>The next test the binary performs on the virtual machine, is to test the <code>div</code> instruction.  Since
this instruction was not provided in the x86 assembly code, it is to ensure we’ve got the argument
order right, and we’re not allowing division by zero.  If we’ve done it wrong, we’re sent off to
some code that prints “ALU Malfunction (DIV)” and halts the program.</p>

<p>By the way, these symbols such as <code>fcn.alu_malfunction_div, fcn.main</code>, and so on, were added by me
while reversing the binary to make it more clear what is going on.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">nor</span> <span class="no">r20</span><span class="p">,</span> <span class="no">r00</span><span class="p">,</span> <span class="no">r00</span>                       <span class="err">;</span> <span class="no">r20</span> <span class="err">=</span> <span class="p">-</span><span class="mi">1</span>
</span><span class="line"><span class="nf">div</span> <span class="no">r20</span><span class="p">,</span> <span class="no">r00</span><span class="p">,</span> <span class="no">r20</span>                       <span class="err">;</span> <span class="no">r20</span> <span class="err">=</span> <span class="mi">0</span> <span class="err">/</span> <span class="p">-</span><span class="mi">1</span>
</span><span class="line"><span class="nf">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="no">fcn.alu_malfunction_div</span>       <span class="err">;</span>
</span><span class="line"><span class="nf">add</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r00</span>                       <span class="err">;</span> <span class="no">does</span> <span class="no">nothing</span>
</span><span class="line"><span class="nf">cmov</span> <span class="no">eip</span><span class="p">,</span> <span class="no">r57</span> <span class="no">if</span> <span class="no">r20</span>                    <span class="err">;</span> <span class="no">if</span><span class="p">(</span><span class="no">r20</span><span class="p">)</span> <span class="no">goto</span> <span class="no">fcn.alu_malfunction_div</span>
</span><span class="line"><span class="nf">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="no">fcn.main</span>                      <span class="err">;</span>
</span><span class="line"><span class="nf">goto</span> <span class="no">r57</span>                                <span class="err">;</span> <span class="no">goto</span> <span class="no">main</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That’s also our first look at conditionals in dan32.  There are no compare instructions, there is
no zero flag, and no conditional jumps like <code>jne</code>, as you find in other instruction sets.</p>

<p>An interesting side note I guess, is that there is no real compare instruction in x86 either, the
<code>cmp</code> instruction on that processor is actually an alias for subtracting the two values.  When
they are equal, since <code>a - a = 0</code>, this sets the zero flag, which is what instructions like <code>jne</code>
are conditional on.</p>

<h2 id="the-main-function">The Main Function</h2>

<p>Now that the Radare plugins are working, let’s have a look around the binary, simulate it a bit, and look
around.  This is loading a project file where I’ve already reversed the entire binary, but gives a good
idea of how it’s working.</p>

<script type="text/javascript" src="https://asciinema.org/a/134338.js" id="asciicast-134338" data-preload="1" async=""></script>

<p>Here’s where we start getting some idea of what this binary is up to, and finally get to see some proper
functions such as <code>print()</code>, <code>scan()</code>, <code>memcmp()</code> and things like that implemented.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">;--</span> <span class="nl">fcn.main:</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0000028c</span>      <span class="no">movi</span> <span class="no">r03</span><span class="p">,</span> <span class="no">str.password</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000290</span>      <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="mi">0x8</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000294</span>      <span class="no">add</span> <span class="no">r59</span><span class="p">,</span> <span class="no">eip</span><span class="p">,</span> <span class="no">r57</span>
</span><span class="line"><span class="err">0</span><span class="nf">x00000298</span>      <span class="no">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="no">fcn.print</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0000029c</span>      <span class="no">goto</span> <span class="no">r57</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>First up, radare has identified a string “Password: “, and helpfully renamed its address as the symbol
<code>str.password</code> for us.  Here we can see one of the two calling conventions in action.  This one is a
lot like fastcall, where we load the first few arguments of a function into registers <code>r03, r04, r05</code>,
and end up with our return value in <code>r01</code>.</p>

<p>Remember I identified <code>r59</code> as the link register, and that is used as our return value.  So here, the
calling convention is to calculate the return address, <code>eip + 8</code>, two instructions away, and store it
into <code>r59</code>, we then load the address of the print function <code>fcn.print</code> into a temp register, and jump
there.</p>

<p>Throughout the binary, <code>r57</code> is always used as a temporary register.  There are others such as <code>r20, r21</code>
which are always used as counters or array indices.  In fact, this assembly code is so consistent in the
way it does things and which registers it uses, that I wonder if it was emitted by a machine, or written by
hand by someone who is just awesome.</p>

<p>Now that we know our arguments, our return address, and where we’re going, that about fully describes
this calling convention.  There is also a stack based calling convention like you would find on
x86 32-bit, which I may write about later.</p>

<h2 id="the-print-function">The Print Function</h2>
<p>So don’t worry I’m not going to bore you to death by literally explaining every function,
but this print one is a fairly simple example to start with.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">;--</span> <span class="nl">fcn.print:</span>
</span><span class="line">
</span><span class="line"><span class="err">;</span>  <span class="nf">Initialize</span> <span class="no">r20</span> <span class="no">to</span> <span class="mi">0</span> <span class="no">as</span> <span class="no">an</span> <span class="no">array</span> <span class="no">index</span>
</span><span class="line"><span class="nf">add</span> <span class="no">r20</span><span class="p">,</span> <span class="no">r00</span><span class="p">,</span> <span class="no">r00</span>
</span><span class="line"><span class="nf">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="no">lbl.head</span>
</span><span class="line"><span class="nf">goto</span> <span class="no">r57</span>
</span><span class="line">
</span><span class="line"><span class="nl">lbl.body:</span>
</span><span class="line">   <span class="err">;</span>  <span class="nf">Output</span> <span class="no">the</span> <span class="no">character</span> <span class="no">in</span> <span class="no">r21</span>
</span><span class="line">   <span class="nf">out</span> <span class="no">r21</span>
</span><span class="line">   <span class="err">;</span>  <span class="nf">r20</span> <span class="err">+=</span> <span class="mi">1</span>
</span><span class="line">   <span class="nf">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="mi">0x1</span>
</span><span class="line">   <span class="nf">add</span> <span class="no">r20</span><span class="p">,</span> <span class="no">r20</span><span class="p">,</span> <span class="no">r57</span>
</span><span class="line">
</span><span class="line"><span class="nl">lbl.head:</span>
</span><span class="line">   <span class="err">;</span>  <span class="nf">r21</span> <span class="err">=</span> <span class="no">r03</span><span class="err">[</span><span class="no">r20</span><span class="err">]</span>
</span><span class="line">   <span class="nf">load.b</span> <span class="no">r21</span><span class="p">,</span> <span class="err">[</span><span class="no">r03</span> <span class="err">+</span> <span class="no">r20</span><span class="err">]</span>
</span><span class="line">   <span class="nf">movi</span> <span class="no">r57</span><span class="p">,</span> <span class="no">lbl.body</span>
</span><span class="line">   <span class="nf">add</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r00</span>
</span><span class="line">
</span><span class="line"><span class="err">;</span>  <span class="nf">return</span> <span class="no">if</span> <span class="no">r21</span> <span class="err">==</span> <span class="mi">0</span>
</span><span class="line"><span class="nf">cmov</span> <span class="no">eip</span><span class="p">,</span> <span class="no">r57</span> <span class="no">if</span> <span class="no">r21</span>
</span><span class="line"><span class="nf">goto</span> <span class="no">r59</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This function is simple, but normally to reverse a difficult function, I will slowly replace
elements of the disassembly with C, until I have a C function.  In this case, we’d have a for loop:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="kt">void</span> <span class="nf">print</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">r03</span><span class="p">){</span>
</span><span class="line">  <span class="k">for</span><span class="p">(</span><span class="n">r20</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">r03</span><span class="p">[</span><span class="n">r20</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">r20</span><span class="o">++</span><span class="p">){</span>
</span><span class="line">    <span class="n">out</span> <span class="n">r03</span><span class="p">[</span><span class="n">r20</span><span class="p">]</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="the-purpose-of-the-program">The Purpose of the Program</h2>
<p>I’ve kept from mentioning the actual purpose of this program for way too much of this article.  If
written in C, the main function would just about look like the following code.  This was figured out
by reversing each function in turn, and I got a happy surprise at the end, we’re going to be dealing
with encryption.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="kt">void</span> <span class="nf">main</span><span class="p">(){</span>
</span><span class="line">  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Password: &quot;</span><span class="p">);</span>
</span><span class="line">  <span class="n">chars_read</span> <span class="o">=</span> <span class="n">scan</span><span class="p">(</span><span class="n">passphrase_input</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="k">if</span><span class="p">(</span><span class="n">chars_read</span> <span class="o">==</span> <span class="mi">0</span><span class="p">){</span>
</span><span class="line">    <span class="n">print_eh_halt</span><span class="p">();</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line">  <span class="n">print</span><span class="p">(</span><span class="s">&quot;Initializing Encryption...&quot;</span><span class="p">);</span>
</span><span class="line">  <span class="n">burn_cpu</span><span class="p">();</span>
</span><span class="line">
</span><span class="line">  <span class="n">rc4_key_schedule</span><span class="p">(</span><span class="n">key_schedule</span><span class="p">,</span> <span class="n">passphrase_input</span><span class="p">,</span> <span class="n">chars_read</span><span class="p">);</span>
</span><span class="line">  <span class="n">print</span><span class="p">(</span><span class="s">&quot;Ok&quot;</span><span class="p">);</span>
</span><span class="line">  <span class="n">print</span><span class="p">(</span><span class="s">&quot;Checking Key&quot;</span><span class="p">);</span>
</span><span class="line">  <span class="n">burn_cpu</span><span class="p">();</span>
</span><span class="line">
</span><span class="line">  <span class="n">decrypt</span><span class="p">(</span><span class="n">key_schedule</span><span class="p">,</span> <span class="n">encrypted_test_data</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">);</span>
</span><span class="line">  <span class="n">result</span> <span class="o">=</span> <span class="n">memcmp</span><span class="p">(</span><span class="n">encrypted_test_data</span><span class="p">,</span> <span class="n">correct_decryption</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">){</span>
</span><span class="line">    <span class="n">print_bad_key_halt</span><span class="p">();</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line">  <span class="n">print</span><span class="p">(</span><span class="s">&quot;Ok&quot;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="n">rc4_key_schedule</span><span class="p">(</span><span class="n">key_schedule</span><span class="p">,</span> <span class="n">passphrase_input</span><span class="p">,</span> <span class="n">chars_read</span><span class="p">);</span>
</span><span class="line">  <span class="n">print</span><span class="p">(</span><span class="s">&quot;Decrypting Disk Image&quot;</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="n">decrypt_disk</span><span class="p">();</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So what’s going on here, is we’re going to do an in-place decryption of the <code>DISK</code> section if we’ve
entered the right passphrase.</p>

<p>We’re able to figure all this out, without running this binary at all,
through static analysis and a bit of ESIL simulation.  I guess the question is how did I know which
function was doing the decryption, what actual encryption algorithm was being used, and how I’m going
to figure out the passphrase without even running the binary.</p>

<p>The answer to the first question is that I knew I would probably need to find XOR somewhere
in this program which would XOR the ciphertext with the key stream, but since we have no XOR
instruction, I knew it would need to be created with a group of <code>NOR</code>, which I found pretty easily.</p>

<p><img src="http://irkenkitties.com/images/xor_nor.png" alt="XOR using NOR Gates" title="XOR using NOR Gates" /></p>

<p>So I spotted that pretty easily, and pinpointed the main decryption routine.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">nor</span> <span class="no">r58</span><span class="p">,</span> <span class="no">r21</span><span class="p">,</span> <span class="no">r01</span>
</span><span class="line"><span class="nf">nor</span> <span class="no">r21</span><span class="p">,</span> <span class="no">r58</span><span class="p">,</span> <span class="no">r21</span>
</span><span class="line"><span class="nf">nor</span> <span class="no">r57</span><span class="p">,</span> <span class="no">r58</span><span class="p">,</span> <span class="no">r01</span>
</span><span class="line"><span class="nf">nor</span> <span class="no">r21</span><span class="p">,</span> <span class="no">r21</span><span class="p">,</span> <span class="no">r57</span>
</span><span class="line"><span class="nf">nor</span> <span class="no">r21</span><span class="p">,</span> <span class="no">r21</span><span class="p">,</span> <span class="no">r21</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The answer to how did I know which encryption algorithm it was, is more funny.  I didn’t know
which one it was.  I had stepped through the key scheduling function a few times, after it prints
“Initializing Encryption”, and thought that it was basically key stretching the passphrase.  It
was only later when I was randomly reading through a writeup on some malware which used RC4 encryption,
that I realized what I was looking at the same RC4 key scheduling algorithm.</p>

<h2 id="cracking-the-passphrase">Cracking the Passphrase</h2>
<p>The main encrypted part of the binary was identified by the address that was being passed to the
<code>decrypt()</code> function, which was <code>0xc00</code>.  I also previously noticed this while running the binary
through the entropy function of the program <code>binwalk</code>.  Here is the output from <code>binwalk -E</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">$ </span>binwalk -E disk.img
</span><span class="line">
</span><span class="line">DECIMAL       HEXADECIMAL     ENTROPY
</span><span class="line">--------------------------------------------------------------------------------
</span><span class="line"><span class="m">0</span>             0x0             Falling entropy edge <span class="o">(</span>0.553052<span class="o">)</span>
</span><span class="line"><span class="m">3072</span>          0xC00           Rising entropy edge <span class="o">(</span>0.972975<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>One of the weaknesses of some encryption schemes, is in how it checks if the passphrase is valid
before decryption.  Say for example you enter a passphrase on a zip file or something, and the
unzip program just blindly decrypts the file without knowing if the password is valid.  It’s going to produce
total garbage if the passphrase is wrong, and the program won’t have any way of letting you know that
you’ve entered the wrong password.</p>

<p>So a common, bad, way to verify the password first, is to have some known ciphertext, plaintext pair
that is encrypted using the passphrase right in the binary.  You enter the passphrase, it decrypts this
small ciphertext, compares it to the known plaintext, and if it’s correct, it says “yay” and moves on
to decrypting the rest of the file.  If it’s wrong, it says “boo”, and doesn’t decrypt the file into
garbage.</p>

<p>This is what’s happening in our dan32 binary.  The known ciphertext, plaintext pair is included, meaning
we just have to crack that.</p>

<p>Here we can see that before decrypting the <code>DISK</code> section, it tries to decrypt
a small 56 byte buffer, and then compares that to a valid string that is included in the program.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="c"><span class="line">  <span class="n">decrypt</span><span class="p">(</span><span class="n">key_schedule</span><span class="p">,</span> <span class="n">encrypted_test_data</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">);</span>
</span><span class="line">  <span class="n">result</span> <span class="o">=</span> <span class="n">memcmp</span><span class="p">(</span><span class="n">encrypted_test_data</span><span class="p">,</span> <span class="n">correct_decryption</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="k">if</span><span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">){</span>
</span><span class="line">    <span class="n">print_bad_key_halt</span><span class="p">();</span>
</span><span class="line">  <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Here we can output the short encrypted buffer, and its valid decryption.  If the passphrase we give
doesn’t decrypt this short buffer correctly, the program will halt.  Here I use the <code>px</code> Radare command
to do a hexdump of the test ciphertext, and another <code>ps</code> command to print the plaintext string.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">px 0x38 @ sym.another_buffer_i_think
</span><span class="line">
</span><span class="line">- offset -   <span class="m">0</span> <span class="m">1</span>  <span class="m">2</span> <span class="m">3</span>  <span class="m">4</span> <span class="m">5</span>  <span class="m">6</span> <span class="m">7</span>  <span class="m">8</span> <span class="m">9</span>  A B  C D  E F  0123456789ABCDEF
</span><span class="line">0x00000964  <span class="m">7216</span> fa85 4c3c d0e4 <span class="m">5905</span> <span class="m">7954</span> d203 eb95  r...L&lt;..Y.yT....
</span><span class="line">0x00000974  <span class="m">1601</span> e73b 6dc8 642f 742f <span class="m">5419</span> aabe ea31  ...<span class="p">;</span>m.d/t/T....1
</span><span class="line">0x00000984  <span class="m">9306</span> c9e1 fa65 830f <span class="m">5118</span> a727 94ff <span class="m">9634</span>  .....e..Q..<span class="s1">&#39;...4</span>
</span><span class="line"><span class="s1">0x00000994  5af7 4c29 85de 8714                      Z.L)....</span>
</span><span class="line">
</span><span class="line"><span class="s1">ps 0x38 @ 0x0000092c</span>
</span><span class="line">
</span><span class="line"><span class="s1">Another one got caught today, it&#39;</span>s all over the papers.
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>That means in order to crack this passphrase, I only need to figure out how to successfully decrypt
this 56 byte buffer, which is something I can do entirely outside of this binary.  I decided to reverse
the key scheduling and decryption routine, and rewrite it in C so that I could brute force the password
quickly outside of this environment, and outside of Radare.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="c1">//  Here is the reversed RC4 key schedule from Dan32</span>
</span><span class="line"><span class="kt">void</span> <span class="nf">rc4_key_schedule</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">key_schedule</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">key_input</span><span class="p">,</span> <span class="kt">int</span> <span class="n">length</span><span class="p">){</span>
</span><span class="line">  <span class="kt">char</span> <span class="o">*</span><span class="n">ptr</span> <span class="o">=</span> <span class="p">(</span><span class="n">key_schedule</span> <span class="o">+</span> <span class="mi">2</span><span class="p">);</span>
</span><span class="line">  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mh">0xff</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span><span class="line">    <span class="n">ptr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">
</span><span class="line">  <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class="line">  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mh">0xff</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span><span class="line">    <span class="n">j</span> <span class="o">=</span> <span class="p">(</span><span class="n">j</span> <span class="o">+</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">key_input</span><span class="p">[</span><span class="n">i</span> <span class="o">%</span> <span class="n">length</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0xff</span><span class="p">;</span>
</span><span class="line">    <span class="kt">char</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">;</span>
</span><span class="line">    <span class="n">t1</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class="line">    <span class="n">t2</span> <span class="o">=</span> <span class="n">ptr</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
</span><span class="line">    <span class="n">ptr</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">t2</span><span class="p">;</span>
</span><span class="line">    <span class="n">ptr</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">t1</span><span class="p">;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="n">key_schedule</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class="line">  <span class="n">key_schedule</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="c1">//  Here is the PRGA from Dan32</span>
</span><span class="line"><span class="kt">char</span> <span class="nf">pseudo_random_generation_algorithm</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">key_schedule</span><span class="p">){</span>
</span><span class="line">  <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">key_schedule</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span><span class="line">  <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">key_schedule</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
</span><span class="line">
</span><span class="line">  <span class="kt">char</span> <span class="o">*</span><span class="n">s</span> <span class="o">=</span> <span class="n">zero_gap</span> <span class="o">+</span> <span class="mi">2</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="n">i</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xff</span><span class="p">;</span>
</span><span class="line">  <span class="n">j</span> <span class="o">=</span> <span class="p">(</span><span class="n">j</span> <span class="o">+</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0xff</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="n">key_schedule</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span><span class="line">  <span class="n">key_schedule</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">j</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="kt">char</span> <span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">;</span>
</span><span class="line">  <span class="n">t1</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class="line">  <span class="n">t2</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
</span><span class="line">  <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">t2</span><span class="p">;</span>
</span><span class="line">  <span class="n">s</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">t1</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="k">return</span> <span class="n">s</span><span class="p">[</span> <span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">s</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0xff</span> <span class="p">];</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>And finally the decrypt routine.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="c1">//  RC4 Decrypt from Dan32</span>
</span><span class="line"><span class="kt">void</span> <span class="nf">decrypt</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">key_stream</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">cipher_text</span><span class="p">,</span> <span class="kt">int</span> <span class="n">length</span><span class="p">){</span>
</span><span class="line">  <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">length</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span><span class="line">    <span class="kt">char</span> <span class="n">key</span> <span class="o">=</span> <span class="n">pseudo_random_generation_algorithm</span><span class="p">(</span><span class="n">key_stream</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">    <span class="n">cipher_text</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">cipher_text</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">key</span><span class="p">;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>I made this into a complete program, that takes a passphrase as argument, and then wrapped it in
a short Ruby script that repeatedly tries passwords from a list I have, until the decrypted result matches.
This only took about 3 minutes, the passphrase ended up being <code>agent</code>  This was lucky, because it could
have been a lot harder if it wasn’t a simple word, I would have needed to use hashcat or something a
bit more sophisticated.  There are also flaws with RC4 itself, which directly relate to the problems
with WEP, but I didn’t need to go that route.</p>

<p>I can’t really call writing this code a waste of time, since I ended up needing to do it in order to
actually identify the algorithm, but there are far easier ways to decrypt RC4 that I could have used,
for example, Radare2 comes with a program called <code>rahash2</code> which can, among about a zillion other things,
be used to decrypt RC4.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">$ </span>hexdump -C test.bin
</span><span class="line">
</span><span class="line"><span class="m">00000000</span>  <span class="m">72</span> <span class="m">16</span> fa <span class="m">85</span> 4c 3c d0 e4  <span class="m">59</span> <span class="m">05</span> <span class="m">79</span> <span class="m">54</span> d2 <span class="m">03</span> eb <span class="m">95</span>  <span class="p">|</span>r...L&lt;..Y.yT....<span class="p">|</span>
</span><span class="line"><span class="m">00000010</span>  <span class="m">16</span> <span class="m">01</span> e7 3b 6d c8 <span class="m">64</span> 2f  <span class="m">74</span> 2f <span class="m">54</span> <span class="m">19</span> aa be ea <span class="m">31</span>  <span class="p">|</span>...<span class="p">;</span>m.d/t/T....1<span class="p">|</span>
</span><span class="line"><span class="m">00000020</span>  <span class="m">93</span> <span class="m">06</span> c9 e1 fa <span class="m">65</span> <span class="m">83</span> 0f  <span class="m">51</span> <span class="m">18</span> a7 <span class="m">27</span> <span class="m">94</span> ff <span class="m">96</span> <span class="m">34</span>  <span class="p">|</span>.....e..Q..<span class="s1">&#39;...4|</span>
</span><span class="line"><span class="s1">00000030  5a f7 4c 29 85 de 87 14                           |Z.L)....|</span>
</span><span class="line"><span class="s1">00000038</span>
</span><span class="line">
</span><span class="line"><span class="s1">$ rahash2 -D rc4 -S s:agent test.bin</span>
</span><span class="line">
</span><span class="line"><span class="s1">Another one got caught today, it&#39;</span>s all over the papers.
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="decrypting-the-disk-image">Decrypting the Disk Image</h2>
<p>At this point I am thinking I will just dump the high entropy section of the binary from <code>0xc00</code> onwards
out to a separate file, and decrypt it with <code>rahash2</code> and be done with it, but when I try this, I end
up with unintelligible garbage, that isn’t proper dan32 code, and isn’t anything else I can
recognize.</p>

<p>The <code>DISK</code> section is divided into 512 byte sectors, and it turns out they are not decrypted in the order they
appear in the file.  The order of the pseudorandomly generated keystream matters since it’s a stream cipher,
and so that is why I’m getting garbage out.  I decided then to just simulate the decryption process within Radare
using ESIL, since I put so much work into properly defining each opcode in ESIL, it does simulate the VM perfectly.</p>

<p>The only problem is, that I have not implemented the <code>in</code> and <code>out</code> opcodes for doing IO, so I would be
running the program blind, and be unable to enter the passphrase or see printed output.</p>

<h2 id="fixing-the-io-problem">Fixing the IO Problem</h2>
<p>An easy way to avoid writing the <code>in</code> opcode, is for me to simulate the program up until it is about to
ask me for a passphrase, stop there, and just write the passphrase into memory at the right address, and
skip over the <code>scan()</code> function entirely and continue afterwards, so that’s what I’ve decided to do.</p>

<p>For the <code>out</code> opcode, there is a less hacky solution.  I can use ESIL to simulate an interrupt, and attach
that interrupt to an external program that will receive the character value to be printed.  I wrote a short
Ruby script which accepts an argument and prints it to the standard output.  And inside Radare2 simulate the
binary like this:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="c">#  Setup ESIL</span>
</span><span class="line">s 0
</span><span class="line">aei
</span><span class="line">aeim
</span><span class="line">aeip
</span><span class="line">
</span><span class="line"><span class="c">#  Allow the binary to virtually write into a memory cache</span>
</span><span class="line">e io.cache <span class="o">=</span> <span class="nb">true</span>
</span><span class="line">
</span><span class="line"><span class="c">#  And attach out.rb as an interrupt handler</span>
</span><span class="line">e cmd.esil.intr<span class="o">=</span>!./out.rb
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c">#  Advance to right before we call scan to ask for password</span>
</span><span class="line">aecu 0x000002ac
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c">#  Write the RC4 password into the right place in memory</span>
</span><span class="line"><span class="c">#  The length is written to the return value register</span>
</span><span class="line">
</span><span class="line">wz agent @ 0x1200
</span><span class="line">aer <span class="nv">r01</span> <span class="o">=</span> 0x5
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c">#  Skip over the call to scan(), and continue from there</span>
</span><span class="line"><span class="c">#  r63 is the instruction pointer</span>
</span><span class="line">
</span><span class="line">aer <span class="nv">r63</span> <span class="o">=</span> 0x000002b4
</span><span class="line">aecu 0x000004fc
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="the-result">The Result</h2>

<script type="text/javascript" src="https://asciinema.org/a/134335.js" id="asciicast-134335" data-speed="3" data-preload="1" async=""></script>

<p>This takes a while to complete, so I just went off and did something else.  Another thing, not shown here is that
the binary often calls functions that just do nothing but waste enormous amounts of time counting, which have no
effect on the output.  I patched these calls out of the binary so I wouldn’t have to wait 2000 years for it to finish.</p>

<p>Once all is said and done, the binary has completely rewritten the <code>DISK</code> section into yet another binary, and we’re
given this message:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">$ </span><span class="c"># Look, I&#39;m an HTTP server now!</span>
</span><span class="line"><span class="nv">$ </span>cat xinetd.conf
</span><span class="line">service httpd
</span><span class="line"><span class="o">{</span>
</span><span class="line">    <span class="nv">disable</span>     <span class="o">=</span> no
</span><span class="line">    <span class="nv">socket_type</span> <span class="o">=</span> stream
</span><span class="line">    <span class="nv">protocol</span>    <span class="o">=</span> tcp
</span><span class="line">    <span class="nb">wait</span>        <span class="o">=</span> no
</span><span class="line">    <span class="nb">bind</span>        <span class="o">=</span> 0.0.0.0
</span><span class="line">    <span class="nv">server</span>      <span class="o">=</span> u5emu
</span><span class="line">    <span class="nv">server_args</span> <span class="o">=</span> disk.img
</span><span class="line">    <span class="nb">type</span>        <span class="o">=</span> UNLISTED
</span><span class="line">    <span class="nv">port</span>        <span class="o">=</span> 80
</span><span class="line">    <span class="nv">user</span>        <span class="o">=</span> root
</span><span class="line"><span class="o">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>I dump the <code>DISK</code> segment into an actual file, and reload that in Radare, and sure enough it has decrypted itself into
a webserver written in dan32.  I reversed this new binary for a while, and found it contained:</p>

<ul>
  <li>Embedded html files</li>
  <li>A GIF of Morpheus from the Matrix</li>
  <li>A PNG background file</li>
  <li>Some lzma compressed issues of Phrack Magazine</li>
  <li>The Hacker’s Manifesto, by the Mentor</li>
  <li>Some zlib compressed files</li>
  <li>And the finally, the flag, written in Danish</li>
</ul>

<p>I used binwalk to extract these from the binary and looked through the contents.  I got the flag, so I’m calling this
one done.  Good experience overall, 10/10 would crack again.  I’m so proficient in reading dan32 assembly now, that it’s
a shame I’ll probably never have any use for it again, it’s a pretty nice VM.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Reversing Crackme Challenges]]></title>
    <link href="http://irkenkitties.com/blog/2016/04/12/reversing-crackme-challenges/"/>
    <updated>2016-04-12T16:27:26-07:00</updated>
    <id>http://irkenkitties.com/blog/2016/04/12/reversing-crackme-challenges</id>
    <content type="html"><![CDATA[<p>You may have noticed that I like to program many things in Ruby.  I really do like
many aspects of this language, and it’s usually the main language that I use at work
as well.  Lately I’ve been getting the feeling that a programmer can get judged
and immediately pigeon holed based on using a language a lot at work.  For example
if you use Ruby you must be “only” a web programmer, if you use a garbage collected
language, you mustn’t be able to manage memory, or handle programming in languages
like C or C++, let alone assembly.</p>

<p>So I like to take some of my free time and play hacker wargames like smashthestack.org,
or reverse engineer crackmes, so I decided to describe my process for solving those
types of challanges here.</p>

<!-- more -->

<h2 id="crackmes">Crackmes</h2>

<p>“Crackmes” are essentially a compiled binary without source code, which asks you
for a password or key,  you enter the wrong password you lose, you enter the right
one and you win and move onto the next.  You need to reverse engineer the binary
in order to discover the password, and these range from simple to tedious and
difficult as the creator of the crackme piles on layers of obfuscation, misdirection,
encryption, and anti-debugging techniques to stop you, not to mention you need
a good handle on assembly and keeping track of what is in various memory locations
during runtime.</p>

<h2 id="crackme0x00a">Crackme0x00a</h2>

<p>We start out simple, and so I start with my simplest techniques.  <code>crackme0x00a</code>
wants a password:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">  ./crackme0x00a
</span><span class="line">  IOLI Crackme Level 0x09
</span><span class="line">  Password: blah
</span><span class="line">  Password Incorrect!
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So first we think that perhaps the password is simply in the binary, and we can
find it by running the program <code>strings</code> on it to list every string in the program.
I think it’s safe to say that will work on this one, but I have a more direct
approach that I usually take, and that is run the program through <code>ltrace</code>.  <code>ltrace</code>
outputs all calls to library functions that the program makes, so here we’re looking
for something like a call to <code>strcmp</code></p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">  ltrace ./crackme0x00a
</span><span class="line">  __libc_start_main<span class="o">(</span>0x80484e4, 1, 0xffa24724, 0x8048570, 0x80485e0 &lt;unfinished ...&gt;
</span><span class="line">  <span class="nb">printf</span><span class="o">(</span><span class="s2">&quot;Enter password: &quot;</span><span class="o">)</span> <span class="o">=</span> 16
</span><span class="line">  __isoc99_scanf<span class="o">(</span>0x8048651, 0xffa24663, 0x8049ff4, 0x8048591, -1Enter password: blah
</span><span class="line">  <span class="o">)</span> <span class="o">=</span> 1
</span><span class="line">  strcmp<span class="o">(</span><span class="s2">&quot;g00dJ0B!&quot;</span>, <span class="s2">&quot;blah&quot;</span><span class="o">)</span> <span class="o">=</span> 1
</span><span class="line">  puts<span class="o">(</span><span class="s2">&quot;Wrong!&quot;</span>Wrong!<span class="o">)</span> <span class="o">=</span> 7
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Simple, we found the call to <code>strcmp</code> the password is <code>g00dJ0B!</code>.  You see how we can
see each call, with parameters and return value.  This was all that was needed to
beat this challenge.</p>

<h2 id="crackme0x00b">Crackme0x00b</h2>

<p>Let’s move onto the next one, with the same approach</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">ltrace ./crackme0x00b
</span><span class="line">__libc_start_main<span class="o">(</span>0x8048494, 1, 0xff82ec54, 0x8048500, 0x8048570 &lt;unfinished ...&gt;
</span><span class="line"><span class="nb">printf</span><span class="o">(</span><span class="s2">&quot;Enter password: &quot;</span><span class="o">)</span> <span class="o">=</span> 16
</span><span class="line">__isoc99_scanf<span class="o">(</span>0x80485e1, 0xff82eb4c, 0, 0xf77f249c, 0xff82ebf4Enter password: blah
</span><span class="line"><span class="o">)</span> <span class="o">=</span> 1
</span><span class="line">wcscmp<span class="o">(</span>0x804a040, 0xff82eb4c<span class="o">)</span> <span class="o">=</span> 1
</span><span class="line">puts<span class="o">(</span><span class="s2">&quot;Wrong!&quot;</span>Wrong!<span class="o">)</span> <span class="o">=</span> 7
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So the difference here is the password is being compared with wcscmp, which has
the prototype <code>int wcscmp (const wchar_t* wcs1, const wchar_t* wcs2);</code>  It compares
wide strings where each char is 16-bit.</p>

<p>On Linux most of the time the code and data sections get loaded around the address
<code>0x08040000</code>, and local variables are stored in the stack, which begins at the
top of memory and grows upwards from <code>0xffffffff</code>.</p>

<p>The arguments to <code>wcscmp</code> are <code>0x804a040</code>, which I’m guessing is in the initialized
data section, and is the secret password, and <code>0xff82eb4c</code> which <code>ltrace</code> shows is
the location on the stack that it wrote our input to.</p>

<p>The trick to this challenge, is that if we were simply to run the <code>strings</code> program
on the binary, it would have worked in the previous challenge, but not this one
because each character in a <code>wchar_t</code> string is 32-bits long with the most significant
bits zeroed out, and terminated by a a 32-bit 0x0000 value.</p>

<p>The quickest way I know to find out the bytes at <code>0x804a040</code> is to load the
binary into my debugger <code>radare2</code> and just print it out.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">[0</span><span class="nf">x080483e0</span><span class="err">]&gt;</span> <span class="no">px</span> <span class="mi">64</span> <span class="err">@</span><span class="mi">0x804a040</span>
</span><span class="line"><span class="err">-</span> <span class="nf">offset</span> <span class="p">-</span>   <span class="mi">0</span> <span class="mi">1</span>  <span class="mi">2</span> <span class="mi">3</span>  <span class="mi">4</span> <span class="mi">5</span>  <span class="mi">6</span> <span class="mi">7</span>  <span class="mi">8</span> <span class="mi">9</span>  <span class="no">A</span> <span class="no">B</span>  <span class="no">C</span> <span class="no">D</span>  <span class="no">E</span> <span class="no">F</span>  <span class="mi">0123456789</span><span class="no">ABCDEF</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0804a040</span>  <span class="mi">7700</span> <span class="mi">0000</span> <span class="mi">3000</span> <span class="mi">0000</span> <span class="mi">7700</span> <span class="mi">0000</span> <span class="mi">6700</span> <span class="mi">0000</span>  <span class="no">w...0...w...g...</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0804a050</span>  <span class="mi">7200</span> <span class="mi">0000</span> <span class="mi">6500</span> <span class="mi">0000</span> <span class="mi">6100</span> <span class="mi">0000</span> <span class="mi">7400</span> <span class="mi">0000</span>  <span class="no">r...e...a...t...</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0804a060</span>  <span class="mi">0000</span> <span class="mi">0000</span> <span class="mi">4743</span> <span class="mi">433</span><span class="no">a</span> <span class="mi">2028</span> <span class="mi">5562</span> <span class="mi">756</span><span class="no">e</span> <span class="mi">7475</span>  <span class="no">....GCC</span><span class="p">:</span> <span class="p">(</span><span class="no">Ubuntu</span>
</span><span class="line"><span class="err">0</span><span class="nf">x0804a070</span>  <span class="mi">2</span><span class="no">f4c</span> <span class="mi">696</span><span class="no">e</span> <span class="mi">6172</span> <span class="mi">6</span><span class="no">f20</span> <span class="mi">342</span><span class="no">e</span> <span class="mi">362</span><span class="no">e</span> <span class="mi">312</span><span class="no">d</span> <span class="mi">3975</span>  <span class="err">/</span><span class="no">Linaro</span> <span class="mi">4</span><span class="no">.6.1-9u</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The password is <code>w0wgreat</code>.</p>

<h2 id="crackme0x01">Crackme0x01</h2>

<p>Ok, let’s see what’s new in the next one, and hopefully get to use <code>radare2</code>
some more.  First let’s see what happens with <code>ltrace</code>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">ltrace</span> <span class="p">.</span><span class="err">/</span><span class="no">crackme0x01</span>
</span><span class="line"><span class="nf">__libc_start_main</span><span class="p">(</span><span class="mi">0x80483e4</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">0xffdd85c4</span><span class="p">,</span> <span class="mi">0x8048460</span><span class="p">,</span> <span class="mi">0x80484d0</span> <span class="err">&lt;</span><span class="no">unfinished</span> <span class="no">...</span><span class="err">&gt;</span>
</span><span class="line"><span class="nf">printf</span><span class="p">(</span><span class="err">&quot;</span><span class="no">IOLI</span> <span class="no">Crackme</span> <span class="no">Level</span> <span class="mi">0x01</span><span class="err">\</span><span class="no">n</span><span class="err">&quot;</span><span class="no">IOLI</span> <span class="no">Crackme</span> <span class="no">Level</span> <span class="mi">0x01</span><span class="p">)</span> <span class="err">=</span> <span class="mi">24</span>
</span><span class="line"><span class="nf">printf</span><span class="p">(</span><span class="err">&quot;</span><span class="no">Password</span><span class="p">:</span> <span class="err">&quot;</span><span class="p">)</span> <span class="err">=</span> <span class="mi">10</span>
</span><span class="line"><span class="nf">scanf</span><span class="p">(</span><span class="mi">0x804854c</span><span class="p">,</span> <span class="mi">0xffdd8524</span><span class="p">,</span> <span class="mi">0xf77a6ff4</span><span class="p">,</span> <span class="mi">0xf7636dd5</span><span class="p">,</span> <span class="mi">0xf77c8660</span>
</span><span class="line">
</span><span class="line"><span class="nl">Password:</span> <span class="nf">blah</span>
</span><span class="line"><span class="err">)</span> <span class="err">=</span> <span class="err">0</span>
</span><span class="line"><span class="nf">printf</span><span class="p">(</span><span class="err">&quot;</span><span class="no">Invalid</span> <span class="no">Password</span><span class="err">!\</span><span class="no">n</span><span class="err">&quot;</span><span class="no">Invalid</span> <span class="no">Password</span><span class="err">!</span><span class="p">)</span> <span class="err">=</span> <span class="mi">18</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So usually I just write in <code>blah</code> for a password, but we can see here that <code>scanf</code>
has returned <code>0</code> in response to my string.  <code>scanf</code> returns the number of things
it has parsed according to its format string.  So I’m guessing its format string
was not <code>"%s"</code> this time as it was before.  Maybe it was looking for a number.
Let’s load it into r2, dissassemble the main function and find out.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">╒</span> <span class="err">(</span><span class="nf">fcn</span><span class="p">)</span> <span class="no">sym.main</span> <span class="mi">113</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">arg</span> <span class="no">int</span> <span class="no">arg_149ah</span>    <span class="err">@</span> <span class="no">ebp</span><span class="err">+</span><span class="mi">0x149a</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">var</span> <span class="no">int</span> <span class="no">local_4h</span>     <span class="err">@</span> <span class="no">ebp-0x4</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483e4</span>      <span class="mi">55</span>             <span class="no">push</span> <span class="no">ebp</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483e5</span>      <span class="mi">89</span><span class="no">e5</span>           <span class="no">mov</span> <span class="no">ebp</span><span class="p">,</span> <span class="no">esp</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483e7</span>      <span class="mi">83</span><span class="no">ec18</span>         <span class="no">sub</span> <span class="no">esp</span><span class="p">,</span> <span class="mi">0x18</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483ea</span>      <span class="mi">83</span><span class="no">e4f0</span>         <span class="no">and</span> <span class="no">esp</span><span class="p">,</span> <span class="mi">0xfffffff0</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483ed</span>      <span class="no">b800000000</span>     <span class="no">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">0</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483f2</span>      <span class="mi">83</span><span class="no">c00f</span>         <span class="no">add</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">0xf</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483f5</span>      <span class="mi">83</span><span class="no">c00f</span>         <span class="no">add</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">0xf</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483f8</span>      <span class="no">c1e804</span>         <span class="no">shr</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">4</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483fb</span>      <span class="no">c1e004</span>         <span class="no">shl</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">4</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x080483fe</span>      <span class="mi">29</span><span class="no">c4</span>           <span class="no">sub</span> <span class="no">esp</span><span class="p">,</span> <span class="no">eax</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048400</span>      <span class="no">c70424288504.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="no">str.IOLI_Crackme_Level_0x01_n</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048407</span>      <span class="no">e810ffffff</span>     <span class="no">call</span> <span class="no">sym.imp.printf</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804840c</span>      <span class="no">c70424418504.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="no">str.Password</span><span class="p">:</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048413</span>      <span class="no">e804ffffff</span>     <span class="no">call</span> <span class="no">sym.imp.printf</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048418</span>      <span class="mi">8</span><span class="no">d45fc</span>         <span class="no">lea</span> <span class="no">eax</span><span class="p">,</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">local_4h</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804841b</span>      <span class="mi">89442404</span>       <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span> <span class="err">+</span> <span class="mi">4</span><span class="err">]</span><span class="p">,</span> <span class="no">eax</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804841f</span>      <span class="no">c704244c8504.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="mi">0x804854c</span>  <span class="err">;</span> <span class="err">&quot;</span><span class="nv">%d</span><span class="err">&quot;</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048426</span>      <span class="no">e8e1feffff</span>     <span class="no">call</span> <span class="no">sym.imp.scanf</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804842b</span>      <span class="mi">817</span><span class="no">dfc9a1400.</span>  <span class="no">cmp</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">local_4h</span><span class="err">]</span><span class="p">,</span> <span class="mi">0x149a</span>
</span><span class="line"><span class="err">│</span>       <span class="err">┌─&lt;</span> <span class="err">0</span><span class="nf">x08048432</span>      <span class="mi">740</span><span class="no">e</span>           <span class="no">je</span> <span class="mi">0x8048442</span>
</span><span class="line"><span class="err">│</span>       <span class="err">│</span>   <span class="err">0</span><span class="nf">x08048434</span>      <span class="no">c704244f8504.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="no">str.Invalid_Password__n</span>
</span><span class="line"><span class="err">│</span>       <span class="err">│</span>   <span class="err">0</span><span class="nf">x0804843b</span>      <span class="no">e8dcfeffff</span>     <span class="no">call</span> <span class="no">sym.imp.printf</span>
</span><span class="line"><span class="err">│</span>      <span class="err">┌──&lt;</span> <span class="err">0</span><span class="nf">x08048440</span>      <span class="no">eb0c</span>           <span class="no">jmp</span> <span class="mi">0x804844e</span>
</span><span class="line"><span class="err">│</span>      <span class="err">│└─&gt;</span> <span class="err">0</span><span class="nf">x08048442</span>      <span class="no">c70424628504.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="no">str.Password_OK_</span><span class="p">:</span><span class="no">__n</span>
</span><span class="line"><span class="err">│</span>      <span class="err">│</span>    <span class="err">0</span><span class="nf">x08048449</span>      <span class="no">e8cefeffff</span>     <span class="no">call</span> <span class="no">sym.imp.printf</span>
</span><span class="line"><span class="err">│</span>      <span class="err">└──&gt;</span> <span class="err">0</span><span class="nf">x0804844e</span>      <span class="no">b800000000</span>     <span class="no">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">0</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048453</span>      <span class="no">c9</span>             <span class="no">leave</span>
</span><span class="line"><span class="err">╘</span>           <span class="err">0</span><span class="nf">x08048454</span>      <span class="no">c3</span>             <span class="no">ret</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So, woo, radare is the best.  It has added helpful identifiers for us rather
then make us look up a bunch of addresses.  For example <code>str.Invalid_Password__n</code> is an
identifier standing in for the address of the string `“Invalid Password\n”.</p>

<p>The assembly listing is easy to follow thanks to the analysis <code>radare2</code> has done,
and the symbols it has added for us, it even graphically shows branches and loops.</p>

<p>The first thing to know when you look at the assembly listing of a function created
by a compiler, is that there is going to be 3 main sections: the function prologue,
the body, and the function epilogue.  If you already know this, you will probably
want to skip down a little ways.</p>

<h2 id="the-function-prologue">The Function Prologue</h2>

<p>Like I mentioned before, the stack is an area of memory which in Linux begins at
<code>0xffffffff</code>, and grows upwards in memory, and the CPU register <code>esp</code> points
to the top of the stack.  To get this analogy you have to think of memory as
a something like a container that holds plates.  The bottom of the container is
<code>0xffffff</code>, the top of it is <code>0x000000</code>.  When you place plates onto the stack
over and over, the pile grows upwards.  That is pushing things onto the stack.</p>

<p>To remove things from the stack, you “pop” them off of it.  You can’t pop a
plate out of the middle or the bottom, you can only pop a plate off the top.
It is a LIFO stack, last in is first out.</p>

<p>An x86 CPU has <code>push</code> and <code>pop</code> instructions for this, and guess what, compilers
don’t use them very much, prefering to instead just do arithmetic
on <code>esp</code> or <code>ebp</code> in order to get values from the stack or manipulate its
size.</p>

<p>In a running program, we use the stack as a “function call stack”, which
is a sequence of “stack frames”, one per function called.</p>

<p>So let’s explain how that’s laid out so we can get back to the crackme. Take this
example nested function calls:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="kt">int</span> <span class="nf">h</span><span class="p">(</span><span class="n">c</span><span class="p">){</span>
</span><span class="line">  <span class="kt">int</span> <span class="n">d</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span><span class="line">  <span class="k">return</span> <span class="n">c</span> <span class="o">+</span> <span class="n">d</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="kt">int</span> <span class="nf">g</span><span class="p">(</span><span class="n">b</span><span class="p">){</span>
</span><span class="line">  <span class="k">return</span> <span class="n">h</span><span class="p">(</span><span class="n">b</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="kt">int</span> <span class="nf">f</span><span class="p">(</span><span class="n">a</span><span class="p">){</span>
</span><span class="line">  <span class="k">return</span> <span class="n">g</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line"><span class="n">f</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">|</span>      <span class="err">10</span>          <span class="err">|</span> <span class="nf">Local</span> <span class="no">variable</span> <span class="no">d</span>  <span class="p">(</span><span class="no">esp</span><span class="p">)</span> <span class="p">(</span><span class="no">ebp</span> <span class="p">-</span> <span class="mi">4</span><span class="p">)</span>
</span><span class="line"><span class="err">|</span>   <span class="err">0</span><span class="nf">xffffffef</span>     <span class="err">|</span> <span class="no">Saved</span> <span class="no">ebp</span> <span class="no">frame</span> <span class="no">pointer</span>
</span><span class="line"><span class="err">|</span> <span class="nf">h</span> <span class="no">Return</span> <span class="no">Address</span> <span class="err">|</span>
</span><span class="line"><span class="err">|</span>       <span class="err">2</span>          <span class="err">|</span> <span class="nf">Argument</span> <span class="no">to</span> <span class="no">h</span>
</span><span class="line"><span class="err">|</span>   <span class="err">0</span><span class="nf">xfffffff7</span>     <span class="err">|</span> <span class="no">Saved</span> <span class="no">ebp</span> <span class="no">frame</span> <span class="no">pointer</span>
</span><span class="line"><span class="err">|</span> <span class="nf">g</span> <span class="no">Return</span> <span class="no">Address</span> <span class="err">|</span>
</span><span class="line"><span class="err">|</span>       <span class="err">1</span>          <span class="err">|</span> <span class="nf">Argument</span> <span class="no">to</span> <span class="no">g</span>
</span><span class="line"><span class="err">|</span>   <span class="err">0</span><span class="nf">xffffffff</span>     <span class="err">|</span> <span class="no">Saved</span> <span class="no">ebp</span> <span class="no">frame</span> <span class="no">pointer</span>
</span><span class="line"><span class="err">|</span> <span class="nf">f</span> <span class="no">Return</span> <span class="no">Address</span> <span class="err">|</span>
</span><span class="line"><span class="err">|</span>       <span class="err">0</span>          <span class="err">|</span> <span class="nf">Argument</span> <span class="no">to</span> <span class="no">f</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The calling convention used here is called <code>cdecl</code>, to call a function we
put its arguments on the stack in reverse order, and use the <code>call</code> instruction.
<code>call</code> automatically pushes the address of the next instruction after it
onto the stack, so we will know where to return to after the function call ends.</p>

<p>Once inside the function, space is made to hold the local variables, usually
by subtracting the local variables size in bytes from esp, raising the stack
up higher, sometimes this size is aligned on a 16 byte boundry by using the
<code>and</code> instruction.  This is why there is junk data in uninitialized local variables,
they just hold whatever garbage happened to be on the stack.</p>

<p><code>main()</code> like any other function has a prologue.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">push</span> <span class="no">ebp</span>                 <span class="err">;</span> <span class="no">Push</span> <span class="no">the</span> <span class="no">previous</span> <span class="no">base</span> <span class="no">pointer</span> <span class="no">to</span> <span class="no">the</span> <span class="no">stack</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">ebp</span><span class="p">,</span> <span class="no">esp</span>             <span class="err">;</span> <span class="no">Make</span> <span class="no">our</span> <span class="no">new</span> <span class="no">base</span> <span class="no">pointer</span> <span class="no">the</span> <span class="no">top</span> <span class="no">of</span> <span class="no">the</span> <span class="no">stack.</span>
</span><span class="line"><span class="nf">sub</span> <span class="no">esp</span><span class="p">,</span> <span class="mi">0x18</span>            <span class="err">;</span> <span class="no">Increase</span> <span class="no">the</span> <span class="no">stack</span> <span class="no">space</span> <span class="no">by</span> <span class="mi">0x18</span> <span class="no">bytes</span>
</span><span class="line"><span class="nf">and</span> <span class="no">esp</span><span class="p">,</span> <span class="mi">0xfffffff0</span>      <span class="err">;</span> <span class="no">Align</span> <span class="no">the</span> <span class="no">stack</span> <span class="no">to</span> <span class="mi">16</span> <span class="no">byte</span> <span class="no">boundry.</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">0</span>               <span class="err">;</span> <span class="no">eax</span> <span class="err">=</span> <span class="mi">0</span>
</span><span class="line"><span class="nf">add</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">0xf</span>             <span class="err">;</span> <span class="no">eax</span> <span class="err">=</span> <span class="mi">0xf</span>
</span><span class="line"><span class="nf">add</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">0xf</span>             <span class="err">;</span> <span class="no">eax</span> <span class="err">=</span> <span class="mi">0x1e</span>
</span><span class="line"><span class="nf">shr</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">4</span>               <span class="err">;</span> <span class="no">eax</span> <span class="err">=</span> <span class="mi">0x1</span>
</span><span class="line"><span class="nf">shl</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">4</span>               <span class="err">;</span> <span class="no">eax</span> <span class="err">=</span> <span class="mi">0x10</span> <span class="no">A</span> <span class="no">shift</span> <span class="no">right</span> <span class="no">then</span> <span class="no">left</span> <span class="no">also</span> <span class="no">aligns</span>
</span><span class="line"><span class="nf">sub</span> <span class="no">esp</span><span class="p">,</span> <span class="no">eax</span>             <span class="err">;</span> <span class="no">Increase</span> <span class="no">stack</span> <span class="no">space</span> <span class="no">by</span> <span class="no">another</span> <span class="mi">0x10</span> <span class="no">bytes.</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So we save the old base pointer (base pointer, frame pointer, same thing) then
start subtracting from esp to increase the space for local variables.</p>

<p>It makes space twice, using two different methods for aligning it to a
16-byte boundry.  You could ask, why doesn’t it just do this all in
one subraction.  I have no idea why it does it this way, but I do know that
when you compile with optimizations off, the compiler often does redundant
things.  You might also ask why it reserves so much stack space for
the one 32-bit local variable that actually exists in this main function.</p>

<p>Your guess is as good as mine.  In the assembly listing we can see that
the only local variable used is called <code>local_4h</code>, which is the value at
<code>ebp - 0x4</code>, the <code>int</code> sized local variable that scanf parses our input
into.</p>

<h2 id="the-function-epilogue">The Function Epilogue</h2>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="mi">0</span>
</span><span class="line"><span class="nf">leave</span>
</span><span class="line"><span class="nf">ret</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>leave</code> instruction is the same as <code>mov esp, ebp</code> <code>pop ebp</code>.  This
effectively undoes all the stack resizing the prologue did, and then
restores the base pointer to what it was before <code>main</code> was called.  Yep,
there is another hidden function that calls <code>main()</code></p>

<p>There is a register called <code>eip</code> that holds the address of the current
instruction, but you can’t directly assign a value to it except to use
a branching instruction or <code>ret</code>.  After <code>leave</code> is executed the next
thing on the stack is the return address of the caller, <code>ret</code> pops that
address into the <code>eip</code> register and execution continues from there.</p>

<p>A function’s return value is always stored in the <code>eax</code> register, so
<code>mov eax, 0</code> is the same as <code>return 0</code> at the end of <code>main()</code>.</p>

<h2 id="back-to-scanf">Back to scanf</h2>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">lea</span> <span class="no">eax</span><span class="p">,</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">local_4h</span><span class="err">]</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span> <span class="err">+</span> <span class="mi">4</span><span class="err">]</span><span class="p">,</span> <span class="no">eax</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="mi">0x804854c</span>  <span class="err">;</span> <span class="err">&quot;</span><span class="nv">%d</span><span class="err">&quot;</span>
</span><span class="line"><span class="nf">call</span> <span class="no">sym.imp.scanf</span>
</span><span class="line"><span class="nf">cmp</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">local_4h</span><span class="err">]</span><span class="p">,</span> <span class="mi">0x149a</span>
</span><span class="line"><span class="nf">je</span> <span class="mi">0x8048442</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The first instruction, <code>lea</code> stands for load effective address, and is
good at doing pointer arithmetic, calculating the address of elements
inside arrays, and things like that.  <code>[ebp - 4]</code> is the address of the
local <code>int</code> sized value on the stack we want <code>scanf</code> to write to.</p>

<p><code>local_4h</code> is just a symbol radare uses to remind us what is in a memory
location, and it allows us to rename it if we want, it just equals <code>4</code> in
this case.</p>

<p><code>0x804854c</code> is the address of the constant string “%d” located in the
data section.  So this code is just moving the value <code>0x804854c</code> to
the top of the stack, and the address of our local variable 4 bytes after that
in reverse order that <code>scanf</code> takes them, then we <code>call</code> to <code>scanf</code>.</p>

<p>At this point whatever we wrote, if it was a number, will be located at
<code>[ebp - 4]</code>, and this value is compared with <code>0x149a</code>, if they are equal
we jump to the “you win” screen.</p>

<p>So that solves this crackme, all we need to type for a password is, in
decimal <code>5274</code>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">./crackme0x01
</span><span class="line">IOLI Crackme Level 0x01
</span><span class="line">Password: 5274
</span><span class="line">Password OK :<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="crackme0x02">Crackme0x02</h2>

<p>Ok, let’s hope they get a bit harder from here on, and this should go
a lot faster without needing to explain the stack, etc.</p>

<p>A quick run shows that <code>ltrace</code> is not going to help us this time, so
back into radare we go.  I’ve renamed some of the local variable so it will
be clearer what is happening after the <code>scanf</code>.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">call</span> <span class="no">sym.imp.scanf</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">a</span><span class="err">]</span><span class="p">,</span> <span class="mi">0x5a</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">b</span><span class="err">]</span><span class="p">,</span> <span class="mi">0x1ec</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">edx</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">b</span><span class="err">]</span>
</span><span class="line"><span class="nf">lea</span> <span class="no">eax</span><span class="p">,</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">a</span><span class="err">]</span>
</span><span class="line"><span class="nf">add</span> <span class="no">dword</span> <span class="err">[</span><span class="no">eax</span><span class="err">]</span><span class="p">,</span> <span class="no">edx</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">a</span><span class="err">]</span>
</span><span class="line"><span class="nf">imul</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">a</span><span class="err">]</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">b</span><span class="err">]</span><span class="p">,</span> <span class="no">eax</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">number_entered</span><span class="err">]</span>
</span><span class="line"><span class="nf">cmp</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">b</span><span class="err">]</span>
</span><span class="line"><span class="nf">jne</span> <span class="mi">0x8048461</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So we have 3 local variables, <code>number_entered</code>, <code>a</code>, and <code>b</code>.  Let’s translate
this to C psuedocode and check what the condition for winning is.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="C"><span class="line"><span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">number_entered</span><span class="p">);</span>
</span><span class="line"><span class="n">a</span> <span class="o">=</span> <span class="mh">0x5a</span><span class="p">;</span>
</span><span class="line"><span class="n">b</span> <span class="o">=</span> <span class="mh">0x1ec</span><span class="p">;</span>
</span><span class="line"><span class="n">edx</span> <span class="o">=</span> <span class="n">b</span><span class="p">;</span>
</span><span class="line"><span class="n">eax</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">;</span>
</span><span class="line"><span class="o">*</span><span class="n">a</span> <span class="o">=</span> <span class="o">*</span><span class="n">eax</span> <span class="o">+</span> <span class="n">edx</span>
</span><span class="line"><span class="n">eax</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>
</span><span class="line"><span class="n">eax</span> <span class="o">*=</span> <span class="n">a</span><span class="p">;</span>
</span><span class="line"><span class="n">b</span> <span class="o">=</span> <span class="n">eax</span><span class="p">;</span>
</span><span class="line"><span class="n">eax</span> <span class="o">=</span> <span class="n">number_entered</span><span class="p">;</span>
</span><span class="line"><span class="k">if</span><span class="p">(</span><span class="n">eax</span> <span class="o">==</span> <span class="n">b</span><span class="p">)</span> <span class="k">goto</span> <span class="n">win</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>After doing that arithmetic and register shuffling, it turns out <code>b = 338724</code>, which
is the password.</p>

<h2 id="crackme0x03">Crackme0x03</h2>

<p>In <code>crackme0x03</code> we have all the same stuff as in the previous, but now we’re calling
a function <code>test(number_entered, b)</code> which will test the password.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">b</span><span class="err">]</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span> <span class="err">+</span> <span class="mi">4</span><span class="err">]</span><span class="p">,</span> <span class="no">eax</span>   <span class="err">;</span> <span class="no">pass</span> <span class="no">b</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">number_entered</span><span class="err">]</span>
</span><span class="line"><span class="nf">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="no">eax</span>       <span class="err">;</span> <span class="no">pass</span> <span class="no">number_entered</span>
</span><span class="line"><span class="nf">call</span> <span class="no">sym.test</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So let’s have a look at this <code>test</code> function.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">╒</span> <span class="err">(</span><span class="nf">fcn</span><span class="p">)</span> <span class="no">sym.test</span> <span class="mi">42</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">arg</span> <span class="no">int</span> <span class="no">number_entered</span> <span class="err">@</span> <span class="no">ebp</span><span class="err">+</span><span class="mi">0x8</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">arg</span> <span class="no">int</span> <span class="no">b</span>            <span class="err">@</span> <span class="no">ebp</span><span class="err">+</span><span class="mi">0xc</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804846e</span>      <span class="mi">55</span>             <span class="no">push</span> <span class="no">ebp</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804846f</span>      <span class="mi">89</span><span class="no">e5</span>           <span class="no">mov</span> <span class="no">ebp</span><span class="p">,</span> <span class="no">esp</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048471</span>      <span class="mi">83</span><span class="no">ec08</span>         <span class="no">sub</span> <span class="no">esp</span><span class="p">,</span> <span class="mi">8</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048474</span>      <span class="mi">8</span><span class="no">b4508</span>         <span class="no">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span><span class="err">+</span><span class="no">number_entered</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048477</span>      <span class="mi">3</span><span class="no">b450c</span>         <span class="no">cmp</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span><span class="err">+</span><span class="no">b</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>       <span class="err">┌─&lt;</span> <span class="err">0</span><span class="nf">x0804847a</span>      <span class="mi">740</span><span class="no">e</span>           <span class="no">je</span> <span class="mi">0x804848a</span>
</span><span class="line"><span class="err">│</span>       <span class="err">│</span>   <span class="err">0</span><span class="nf">x0804847c</span>      <span class="no">c70424ec8504.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="no">str.Lqydolg_Sdvvzrug_</span>
</span><span class="line"><span class="err">│</span>       <span class="err">│</span>   <span class="err">0</span><span class="nf">x08048483</span>      <span class="no">e88cffffff</span>     <span class="no">call</span> <span class="no">sym.shift</span>
</span><span class="line"><span class="err">│</span>      <span class="err">┌──&lt;</span> <span class="err">0</span><span class="nf">x08048488</span>      <span class="no">eb0c</span>           <span class="no">jmp</span> <span class="mi">0x8048496</span>
</span><span class="line"><span class="err">│</span>      <span class="err">│└─&gt;</span> <span class="err">0</span><span class="nf">x0804848a</span>      <span class="no">c70424fe8504.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="no">str.Sdvvzrug_RN______</span>
</span><span class="line"><span class="err">│</span>      <span class="err">│</span>    <span class="err">0</span><span class="nf">x08048491</span>      <span class="no">e87effffff</span>     <span class="no">call</span> <span class="no">sym.shift</span>
</span><span class="line"><span class="err">│</span>      <span class="err">└──&gt;</span> <span class="err">0</span><span class="nf">x08048496</span>      <span class="no">c9</span>             <span class="no">leave</span>
</span><span class="line"><span class="err">╘</span>           <span class="err">0</span><span class="nf">x08048497</span>      <span class="no">c3</span>             <span class="no">ret</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Ok so what’s going on in here.  First thing I see is 8 bytes allocated on the stack and
then never used (for some reason), and I see our two arguments coming in at <code>epb + 0x8</code>
and <code>ebp + 0xc</code> which I’ve renamed to match the calling code.</p>

<p>We then compare <code>number_entered</code> and <code>b</code> for equality, which chooses one or another
string containing giberish to be passed to the function <code>shift()</code>.  In either case
the return value of <code>test()</code> is not checked, and we return from the <code>test()</code> function.</p>

<p>Let’s check the actual contents of these gibberish strings out in radare with the <code>ps</code>
command to print strings.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">ps @ str.Lqydolg_Sdvvzrug_
</span><span class="line">Lqydolg#Sdvvzrug<span class="err">$</span>
</span><span class="line">ps @ str.Sdvvzrug_RN______
</span><span class="line">Sdvvzrug#RN<span class="nv">$$$#=</span>,
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Let’s remember that, and have a look at the <code>shift()</code> function which I’m going to
guess is going to decrypt these strings somehow.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
</pre></td><td class="code"><pre><code class="asm"><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">arg</span> <span class="no">int</span> <span class="no">string</span>       <span class="err">@</span> <span class="no">ebp</span><span class="err">+</span><span class="mi">0x8</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">arg</span> <span class="no">int</span> <span class="no">arg_13h</span>      <span class="err">@</span> <span class="no">ebp</span><span class="err">+</span><span class="mi">0x13</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">var</span> <span class="no">int</span> <span class="no">decrypted</span>    <span class="err">@</span> <span class="no">ebp-0x78</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">var</span> <span class="no">int</span> <span class="no">counter</span>      <span class="err">@</span> <span class="no">ebp-0x7c</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">CALL</span> <span class="no">XREF</span> <span class="no">from</span> <span class="mi">0x08048491</span> <span class="p">(</span><span class="no">sym.shift</span><span class="p">)</span>
</span><span class="line"><span class="err">│</span>           <span class="err">;</span> <span class="nf">CALL</span> <span class="no">XREF</span> <span class="no">from</span> <span class="mi">0x08048483</span> <span class="p">(</span><span class="no">sym.shift</span><span class="p">)</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048414</span>      <span class="mi">55</span>             <span class="no">push</span> <span class="no">ebp</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048415</span>      <span class="mi">89</span><span class="no">e5</span>           <span class="no">mov</span> <span class="no">ebp</span><span class="p">,</span> <span class="no">esp</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048417</span>      <span class="mi">81</span><span class="no">ec98000000</span>   <span class="no">sub</span> <span class="no">esp</span><span class="p">,</span> <span class="mi">0x98</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804841d</span>      <span class="no">c74584000000.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">counter</span><span class="err">]</span><span class="p">,</span> <span class="mi">0</span>
</span><span class="line"><span class="err">│</span>       <span class="err">┌─&gt;</span> <span class="err">0</span><span class="nf">x08048424</span>      <span class="mi">8</span><span class="no">b4508</span>         <span class="no">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span><span class="err">+</span><span class="no">string</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>       <span class="err">│</span>   <span class="err">0</span><span class="nf">x08048427</span>      <span class="mi">890424</span>         <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="no">eax</span>
</span><span class="line"><span class="err">│</span>       <span class="err">│</span>   <span class="err">0</span><span class="nf">x0804842a</span>      <span class="no">e811ffffff</span>     <span class="no">call</span> <span class="no">sym.imp.strlen</span>
</span><span class="line"><span class="err">│</span>       <span class="err">│</span>   <span class="err">0</span><span class="nf">x0804842f</span>      <span class="mi">394584</span>         <span class="no">cmp</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">counter</span><span class="err">]</span><span class="p">,</span> <span class="no">eax</span>
</span><span class="line"><span class="err">│</span>      <span class="err">┌──&lt;</span> <span class="err">0</span><span class="nf">x08048432</span>      <span class="mi">731</span><span class="no">c</span>           <span class="no">jae</span> <span class="mi">0x8048450</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x08048434</span>      <span class="mi">8</span><span class="no">d4588</span>         <span class="no">lea</span> <span class="no">eax</span><span class="p">,</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">decrypted</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x08048437</span>      <span class="mi">89</span><span class="no">c2</span>           <span class="no">mov</span> <span class="no">edx</span><span class="p">,</span> <span class="no">eax</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x08048439</span>      <span class="mi">035584</span>         <span class="no">add</span> <span class="no">edx</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">counter</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x0804843c</span>      <span class="mi">8</span><span class="no">b4584</span>         <span class="no">mov</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">counter</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x0804843f</span>      <span class="mi">034508</span>         <span class="no">add</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span><span class="err">+</span><span class="no">string</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x08048442</span>      <span class="mi">0</span><span class="no">fb600</span>         <span class="no">movzx</span> <span class="no">eax</span><span class="p">,</span> <span class="no">byte</span> <span class="err">[</span><span class="no">eax</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x08048445</span>      <span class="mi">2</span><span class="no">c03</span>           <span class="no">sub</span> <span class="no">al</span><span class="p">,</span> <span class="mi">3</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x08048447</span>      <span class="mi">8802</span>           <span class="no">mov</span> <span class="no">byte</span> <span class="err">[</span><span class="no">edx</span><span class="err">]</span><span class="p">,</span> <span class="no">al</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x08048449</span>      <span class="mi">8</span><span class="no">d4584</span>         <span class="no">lea</span> <span class="no">eax</span><span class="p">,</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">counter</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>      <span class="err">││</span>   <span class="err">0</span><span class="nf">x0804844c</span>      <span class="no">ff00</span>           <span class="no">inc</span> <span class="no">dword</span> <span class="err">[</span><span class="no">eax</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>      <span class="err">│└─&lt;</span> <span class="err">0</span><span class="nf">x0804844e</span>      <span class="no">ebd4</span>           <span class="no">jmp</span> <span class="mi">0x8048424</span>
</span><span class="line"><span class="err">│</span>      <span class="err">└──&gt;</span> <span class="err">0</span><span class="nf">x08048450</span>      <span class="mi">8</span><span class="no">d4588</span>         <span class="no">lea</span> <span class="no">eax</span><span class="p">,</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">decrypted</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048453</span>      <span class="mi">034584</span>         <span class="no">add</span> <span class="no">eax</span><span class="p">,</span> <span class="no">dword</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">counter</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048456</span>      <span class="no">c60000</span>         <span class="no">mov</span> <span class="no">byte</span> <span class="err">[</span><span class="no">eax</span><span class="err">]</span><span class="p">,</span> <span class="mi">0</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048459</span>      <span class="mi">8</span><span class="no">d4588</span>         <span class="no">lea</span> <span class="no">eax</span><span class="p">,</span> <span class="err">[</span><span class="no">ebp</span> <span class="p">-</span> <span class="no">decrypted</span><span class="err">]</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804845c</span>      <span class="mi">89442404</span>       <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span> <span class="err">+</span> <span class="mi">4</span><span class="err">]</span><span class="p">,</span> <span class="no">eax</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048460</span>      <span class="no">c70424e88504.</span>  <span class="no">mov</span> <span class="no">dword</span> <span class="err">[</span><span class="no">esp</span><span class="err">]</span><span class="p">,</span> <span class="mi">0x80485e8</span>  <span class="err">;</span> <span class="err">&quot;</span><span class="nv">%s.</span><span class="err">&quot;</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x08048467</span>      <span class="no">e8e4feffff</span>     <span class="no">call</span> <span class="no">sym.imp.printf</span>
</span><span class="line"><span class="err">│</span>           <span class="err">0</span><span class="nf">x0804846c</span>      <span class="no">c9</span>             <span class="no">leave</span>
</span><span class="line"><span class="err">╘</span>           <span class="err">0</span><span class="nf">x0804846d</span>      <span class="no">c3</span>             <span class="no">ret</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>I’ve renamed the local stack variables to be what I believe their purpose is.
This is a bigger function than we’ve seen so far, this loop pattern we see
here is what a <code>for</code> loop looks like in assembly.  You can see how <code>counter</code>
is initialized to <code>0</code>, then a condition is checked which either processes
the body and increments <code>counter</code>, or it jumps out of the loop.</p>

<p>I guess is going to iterate over the string that was passed in, and probably
“decrypt” it.  Maybe it will help if we translate this back into C.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="kt">void</span> <span class="nf">shift</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">string</span><span class="p">){</span>
</span><span class="line">  <span class="kt">char</span> <span class="n">decrypted</span><span class="p">[</span><span class="mi">120</span><span class="p">];</span>
</span><span class="line">  <span class="kt">int</span> <span class="n">counter</span><span class="p">;</span>
</span><span class="line">  <span class="k">for</span><span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">strlen</span><span class="p">(</span><span class="n">string</span><span class="p">);</span> <span class="o">++</span><span class="n">i</span><span class="p">){</span>
</span><span class="line">    <span class="n">decrypted</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">string</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mi">3</span><span class="p">;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="n">decrypted</span><span class="p">[</span><span class="n">counter</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;\0&#39;</span><span class="p">;</span>
</span><span class="line">  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%s.&quot;</span><span class="p">,</span> <span class="n">decrypted</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>All it did was subtract <code>3</code> from the ascii code of the gibberish string, which
is why we say it is “decrypting” in quotes :)  Remember we still have not run
this binary yet, so let’s just write up a quick Ruby script to see what the
giberish decodes to.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="s2">&quot;Lqydolg#Sdvvzrug$&quot;</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">c</span><span class="o">|</span>
</span><span class="line">  <span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ord</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)</span><span class="o">.</span><span class="n">chr</span>
</span><span class="line"><span class="k">end</span><span class="o">.</span><span class="n">join</span>
</span><span class="line"> <span class="o">=&gt;</span> <span class="s2">&quot;Invalid Password!&quot;</span>
</span><span class="line"><span class="s2">&quot;Sdvvzrug#RN$$$#=,&quot;</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">c</span><span class="o">|</span>
</span><span class="line">  <span class="p">(</span><span class="n">c</span><span class="o">.</span><span class="n">ord</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)</span><span class="o">.</span><span class="n">chr</span><span class="p">}</span><span class="o">.</span><span class="n">join</span>
</span><span class="line"><span class="k">end</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="s2">&quot;Password OK!!! :)&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Ok so we’ve learned that if the password you enter is equal to the variable
calculated to <code>b</code>, we will select and decode the “Password Ok” string, and win,
that was pretty obvious from before even looking at this function, but we got
to make sure we got to the bottom of each function.  So if I remember right,
<code>b</code> was <code>338724</code>, the same password as last time, real sneaky guys.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line">./crackme0x03
</span><span class="line">IOLI Crackme Level 0x02
</span><span class="line">Password: 338724
</span><span class="line">Password OK :<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[GLSL Shaders With WebGL]]></title>
    <link href="http://irkenkitties.com/blog/2016/02/10/glsl-shaders-with-webgl/"/>
    <updated>2016-02-10T10:51:44-07:00</updated>
    <id>http://irkenkitties.com/blog/2016/02/10/glsl-shaders-with-webgl</id>
    <content type="html"><![CDATA[<div style="text-align: center;">
  <div id="moon_orb"></div>
</div>

<p>Here is a neat example of using shaders in WebGL, read on to see the GLSL shader code</p>

<!-- more -->

<h2 id="fragment-shader">Fragment Shader</h2>

<p>This is an example of Ray Marching using Distance Fields.  The <code>map</code> function given
here is for a sphere, it accepts a point <code>p</code> and returns the distance <code>p</code> is from
the surface of a sphere with radius <code>0.25</code> units.</p>

<p>By first manipulating <code>p</code> by calling <code>fract(p)</code> on it (basically mod 1), we get 
multiple equally spaced spheres.  <code>length()</code> performs the 3D pythagorean theorem
in order to see how far away <code>p</code> is.</p>

<p>The <code>trace()</code> function receives the origin <code>o</code> and the ray <code>r</code>, and casts the ray
outwards towards the object in the <code>map()</code> function by multiplying it by <code>t</code>.</p>

<p>This makes the <code>trace()</code> function search for the surface of an object iteratively,
here over a maximum of 32 iterations.  Each iteration it projects the ray half the 
distance remaining returned by the distance function, which zooms in safely until it finds
the shape’s boundary.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
</pre></td><td class="code"><pre><code class="glsl"><span class="line"><span class="k">uniform</span> <span class="k">float</span> <span class="n">time</span><span class="p">;</span>
</span><span class="line"><span class="k">uniform</span> <span class="k">vec2</span> <span class="n">resolution</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="k">const</span> <span class="k">float</span> <span class="n">pi</span> <span class="o">=</span> <span class="mf">3.14159265359</span><span class="p">;</span>
</span><span class="line"><span class="k">const</span> <span class="k">float</span> <span class="n">tau</span> <span class="o">=</span> <span class="mf">2.0</span> <span class="o">*</span> <span class="n">pi</span><span class="p">;</span>
</span><span class="line">
</span><span class="line"><span class="k">float</span> <span class="n">map</span><span class="p">(</span><span class="k">vec3</span> <span class="n">p</span><span class="p">){</span>
</span><span class="line">  <span class="k">vec3</span> <span class="n">q</span> <span class="o">=</span> <span class="n">fract</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="o">*</span> <span class="mf">2.0</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">;</span>
</span><span class="line">  <span class="k">return</span> <span class="n">length</span><span class="p">(</span><span class="n">q</span><span class="p">)</span> <span class="o">-</span> <span class="mf">0.25</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="k">float</span> <span class="n">trace</span><span class="p">(</span><span class="k">vec3</span> <span class="n">o</span><span class="p">,</span> <span class="k">vec3</span> <span class="n">r</span><span class="p">){</span>
</span><span class="line">  <span class="k">float</span> <span class="n">t</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
</span><span class="line">  <span class="k">for</span><span class="p">(</span><span class="k">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mo">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">32</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
</span><span class="line">    <span class="k">vec3</span> <span class="n">p</span> <span class="o">=</span> <span class="n">o</span> <span class="o">+</span> <span class="n">r</span> <span class="o">*</span> <span class="n">t</span><span class="p">;</span>
</span><span class="line">    <span class="k">float</span> <span class="n">d</span> <span class="o">=</span> <span class="n">map</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
</span><span class="line">    <span class="n">t</span> <span class="o">+=</span> <span class="n">d</span> <span class="o">*</span> <span class="mf">0.5</span><span class="p">;</span>
</span><span class="line">  <span class="p">}</span>
</span><span class="line">  <span class="k">return</span> <span class="n">t</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span>
</span><span class="line">
</span><span class="line"><span class="k">void</span> <span class="n">main</span><span class="p">(){</span>
</span><span class="line">  <span class="k">vec2</span> <span class="n">uv</span> <span class="o">=</span> <span class="n">gl_FragCoord</span><span class="p">.</span><span class="n">xy</span> <span class="o">/</span> <span class="n">resolution</span><span class="p">;</span>
</span><span class="line">  <span class="n">uv</span> <span class="o">=</span> <span class="n">uv</span> <span class="o">*</span> <span class="mf">2.0</span> <span class="o">-</span> <span class="mf">1.0</span><span class="p">;</span>
</span><span class="line">  <span class="n">uv</span><span class="p">.</span><span class="n">x</span> <span class="o">*=</span> <span class="n">resolution</span><span class="p">.</span><span class="n">x</span> <span class="o">/</span> <span class="n">resolution</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">  <span class="k">float</span> <span class="n">theta</span> <span class="o">=</span> <span class="n">time</span> <span class="o">*</span> <span class="mf">0.25</span><span class="p">;</span>
</span><span class="line">  <span class="k">vec3</span> <span class="n">r</span> <span class="o">=</span> <span class="n">normalize</span><span class="p">(</span><span class="k">vec3</span><span class="p">(</span><span class="n">uv</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">));</span>
</span><span class="line">  <span class="k">vec3</span> <span class="n">o</span> <span class="o">=</span> <span class="k">vec3</span><span class="p">(</span><span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">3.0</span><span class="p">)</span> <span class="o">*</span> <span class="n">time</span> <span class="o">*</span> <span class="o">-</span><span class="mf">0.5</span><span class="p">;</span>
</span><span class="line">  <span class="n">r</span><span class="p">.</span><span class="n">xy</span> <span class="o">*=</span> <span class="k">mat2</span><span class="p">(</span><span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">),</span> <span class="o">-</span><span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">),</span> <span class="n">sin</span><span class="p">(</span><span class="n">theta</span><span class="p">),</span> <span class="n">cos</span><span class="p">(</span><span class="n">theta</span><span class="p">));</span>
</span><span class="line">
</span><span class="line">  <span class="k">float</span> <span class="n">t</span> <span class="o">=</span> <span class="n">trace</span><span class="p">(</span><span class="n">o</span><span class="p">,</span> <span class="n">r</span><span class="p">);</span>
</span><span class="line">  <span class="k">float</span> <span class="n">fog</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="n">t</span> <span class="o">*</span> <span class="n">t</span> <span class="o">*</span> <span class="mf">0.1</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="k">vec3</span> <span class="n">fc</span> <span class="o">=</span> <span class="k">vec3</span><span class="p">(</span><span class="n">fog</span><span class="p">)</span> <span class="o">*</span> <span class="k">vec3</span><span class="p">(</span><span class="mf">0.4</span> <span class="o">*</span> <span class="n">sin</span><span class="p">(</span><span class="n">time</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="mf">0.4</span> <span class="o">*</span> <span class="n">cos</span><span class="p">(</span><span class="n">time</span><span class="p">)</span> <span class="o">*</span> <span class="mf">0.5</span> <span class="o">+</span> <span class="mf">1.0</span><span class="p">);</span>
</span><span class="line">
</span><span class="line">  <span class="n">gl_FragColor</span> <span class="o">=</span> <span class="k">vec4</span><span class="p">(</span><span class="n">fc</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The screen here is really a quad the same size as the viewport, so each fragment has a uv coordinate 
on that quad.</p>

<p>Next we expand the 2D uv coordinate into 3D called <code>r</code> for ray, and normalize it to unit length, and establish an origin.
together these make a ray that is cast through that point on the screen.  I adjust the z-coorindate 
by multiplying it by <code>time</code> which makes us seem to zoom through the scene.</p>

<p>The next thing I do is create a 2D rotation matrix, which I multiply by the ray’s <code>xy</code> vector, the 
angle of rotation <code>theta</code> is also adjusted over time.</p>

<p>Now I use <code>trace</code> to calculate the distance a ray travels into the scene before hitting something.  The 
value <code>fog</code> is trying to use an inverse square equation to make more distant points seem darker than nearby points.</p>

<p>Finally <code>fog</code> is used to compose an RGB color, mostly purple, but also modified by time to slowly change
the color of the spheres.  Finally the fragment color is returned.</p>

<h2 id="vertex-shader">Vertex Shader</h2>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="glsl"><span class="line"><span class="k">uniform</span> <span class="k">float</span> <span class="n">time</span><span class="p">;</span>
</span><span class="line"><span class="k">uniform</span> <span class="k">vec2</span> <span class="n">resolution</span><span class="p">;</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="k">void</span> <span class="n">main</span><span class="p">(){</span>
</span><span class="line">  <span class="n">gl_Position</span> <span class="o">=</span> <span class="n">projectionMatrix</span> <span class="o">*</span> <span class="n">modelViewMatrix</span> <span class="o">*</span> <span class="k">vec4</span><span class="p">(</span><span class="n">position</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">);</span>
</span><span class="line"><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Not much happening in the vertex shader, we apply the model and projection matrices, most importantly
we pass the <code>time</code> and <code>resolution</code> uniforms we receive from javascript along to the fragment shader.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Creating Sound on the NES]]></title>
    <link href="http://irkenkitties.com/blog/2015/03/29/creating-sound-on-the-nes/"/>
    <updated>2015-03-29T10:51:44-07:00</updated>
    <id>http://irkenkitties.com/blog/2015/03/29/creating-sound-on-the-nes</id>
    <content type="html"><![CDATA[<p>I am into all types of synthesizers, old and new, and recently I’ve taken to the sound of
older video game sound chips.  I recently desoldered the NES’s 2A03 processor off its mainboard
and have it in partial communication with an Arudino, but rewind, do I really know enough
about composing music on that chip?  Not yet.  So there’s only one thing to do about that.</p>

<h2 id="assembler">6502 Assembler</h2>

<p>The NES was programmed in 6502 assembly language, and lucky for me, it actually has a really
straight forward instruction set, but still, last month I was still not familiar with it 
enough to make anything.  Now, usually when I don’t understand something, I write a program
that somehow involves whatever topic I’m learning.  You can’t write a program like an assembler 
without understanding how the processor for that assembler works, so I wrote my own assembler 
for the NES called <a href="https://github.com/safiire/n65">n65</a>.</p>

<p>This is the assembler I will be using in this article, and to help me compose music on the NES.</p>

<p>You can easily install n65 through RubyGems.org:</p>

<pre><code>gem install n65
</code></pre>

<!-- more -->

<h2 id="programming-basics">Programming Basics</h2>

<p>Before we can get the NES to make any sounds, there are a few things to know about writing
programs for it.  The 6502 is an 8-bit processor, because most of its internal work registers
are 8 bits wide.  The general purpose registers you have direct control over are named 
<code>A</code>, <code>X</code>, and <code>Y</code>.   There are a few other 8 bit registers, such as the status register
and the stack pointer.  The <code>PC</code>, or program counter though, is 16 bits wide, which means
the processor can address memory from <code>$0000</code> to <code>$ffff</code>, a total of 65536 addressable bytes.</p>

<p>A NES does not have 64KB of actual RAM, the mainboard comes with 2KB of work RAM attached to
the CPU, and 2KB of video RAM attached to the Picture Processing Unit, or PPU, which is 
actually a separate processor entirely, both of these processors run independantly of one 
another, but they can communicate through memory mapped registers.</p>

<p>The Audio Processing Unit, or APU, is also very much like a separate processor, although it
is on the 2A03 chip, and is one of the things that makes a 2A03 different than other 6502s.
You also communicate with the APU by writing values to memory mapped registers.</p>

<p><img src="http://irkenkitties.com/images/NES-memory.png" alt="NES Memory Map" /></p>

<p><small>Image from <a href="http://www.jfbillingsley.com">www.jfbillingsley.com</a></small></p>

<p>Tiny, tiny amount of work RAM <code>$800</code> bytes or 2KB.  If you’ve never worked on anything
with such a small amount of RAM, well that’s actually the challenge here, that and having
no operating system is what makes it fun in my opinion :)</p>

<p>You don’t have to do everything yourself however, the PPU <em>is</em> a hardware tile and sprite
engine, and the APU <em>is</em> a synthesizer.  When the machine starts up, it is ready to 
display graphics and play sounds all by itself, all you need to do, and the majority
of what your code is about, is moving the right data into the right places, and the 
hardware does the rest.  This is typical of older generation consoles, and even newer
ones up to at least the Nintendo DS.</p>

<h2 id="program-skeleton">Program Skeleton</h2>

<p>Before we make our first beep, let’s set up a project skeleton that does the initialization
that all NES games need to do.  This involves setting the hardware into a known state,
setting up the stack pointer, and clearing the work RAM.</p>

<p>When we produce a binary from our assembly code listing, we are writing code located
in the cartridge ROM area, shown above starting at <code>$8000</code>.  The ROM binary we produce
would be written onto an actual ROM chip inside a NES cartridge, or more likely we’re
going to run this on an emulator, in which case <code>n65</code> is setup to produce iNES formatted
“roms”.</p>

<p>The iNES file format is simply a 32 byte header, followed by at least one 16KB PROG ROM, and
zero or more 8KB CHAR ROM sections.  For now we can forget about CHAR ROM, let’s just create
one PROG ROM section.  These sections are either PROG for code or CHAR for graphics data, 
and are numbered in banks.</p>

<p>One last thing, the cartridge program ROM section is shown to be mapped from <code>$8000 - $ffff</code>,
this is 32KB total, not 16KB.  If we specify 1 PROG ROM section in the header, that section
will be mirrored twice to cover that area of memory.  This is important because we must
remember to write an interrupt vector table to <code>$fffa</code>.  This is why we will assemble our
prog section bank 0 at <code>$C000</code>, because we are only using one bank of 16KB, it tends to
make more sense as far as addressing is concerned.</p>

<p>The interrupt vector is 3 16-bit addresses, that point to code for handling VBlank, Reset,
and IRQ respectively.  Every ROM must specify these, because the Reset vector points to
the beginning of our code, think of it like specifying your main() function in a C program.</p>

<p>Ok here is an NES project skeleton that just initializes the hardware:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
<span class="line-number">51</span>
<span class="line-number">52</span>
<span class="line-number">53</span>
<span class="line-number">54</span>
<span class="line-number">55</span>
<span class="line-number">56</span>
<span class="line-number">57</span>
<span class="line-number">58</span>
<span class="line-number">59</span>
<span class="line-number">60</span>
<span class="line-number">61</span>
<span class="line-number">62</span>
<span class="line-number">63</span>
<span class="line-number">64</span>
<span class="line-number">65</span>
<span class="line-number">66</span>
<span class="line-number">67</span>
<span class="line-number">68</span>
<span class="line-number">69</span>
<span class="line-number">70</span>
<span class="line-number">71</span>
<span class="line-number">72</span>
<span class="line-number">73</span>
<span class="line-number">74</span>
<span class="line-number">75</span>
<span class="line-number">76</span>
<span class="line-number">77</span>
<span class="line-number">78</span>
<span class="line-number">79</span>
<span class="line-number">80</span>
<span class="line-number">81</span>
<span class="line-number">82</span>
<span class="line-number">83</span>
<span class="line-number">84</span>
<span class="line-number">85</span>
<span class="line-number">86</span>
<span class="line-number">87</span>
<span class="line-number">88</span>
<span class="line-number">89</span>
<span class="line-number">90</span>
<span class="line-number">91</span>
<span class="line-number">92</span>
<span class="line-number">93</span>
<span class="line-number">94</span>
<span class="line-number">95</span>
<span class="line-number">96</span>
<span class="line-number">97</span>
<span class="line-number">98</span>
<span class="line-number">99</span>
<span class="line-number">100</span>
<span class="line-number">101</span>
<span class="line-number">102</span>
<span class="line-number">103</span>
</pre></td><td class="code"><pre><code class="ca65"><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Create an iNES header</span>
</span><span class="line"><span class="kp">.ines</span> <span class="err">{</span><span class="s">&quot;prog&quot;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">&quot;char&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s">&quot;mapper&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="s">&quot;mirror&quot;</span><span class="p">:</span> <span class="mi">0</span><span class="err">}</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Include all the symbols in the nes library</span>
</span><span class="line"><span class="kp">.inc</span> <span class="o">&lt;</span><span class="n">nes.sym</span><span class="o">&gt;</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Open the prog section bank 0</span>
</span><span class="line"><span class="kp">.segment</span> <span class="n">prog</span> <span class="mi">0</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Setup the interrupt vectors</span>
</span><span class="line"><span class="kp">.org</span> <span class="mh">$FFFA</span>
</span><span class="line"><span class="kp">.dw</span> <span class="n">vblank</span>
</span><span class="line"><span class="kp">.dw</span> <span class="n">reset</span>
</span><span class="line"><span class="kp">.dw</span> <span class="n">irq</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Here is our code entry point</span>
</span><span class="line"><span class="kp">.org</span> <span class="mh">$C000</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">reset</span>
</span><span class="line">  <span class="k">sei</span>                   <span class="c1">; SEt Interrupt (disables them)</span>
</span><span class="line">  <span class="k">cld</span>                   <span class="c1">; CLear Decimal Mode</span>
</span><span class="line">
</span><span class="line">  <span class="k">ldx</span> <span class="p">#</span><span class="mh">$ff</span>
</span><span class="line">  <span class="k">txs</span>                   <span class="c1">; Set the stack pointer</span>
</span><span class="line">
</span><span class="line">  <span class="k">ldx</span> <span class="p">#</span><span class="mh">$00</span>
</span><span class="line">  <span class="k">stx</span> <span class="n">nes.ppu.control</span>
</span><span class="line">  <span class="k">stx</span> <span class="n">nes.ppu.mask</span>      <span class="c1">; Disable Vblank &amp; Rendering</span>
</span><span class="line">
</span><span class="line">  <span class="k">jsr</span> <span class="n">zero_apu</span>          <span class="c1">; Zero all APU registers</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  We need to wait for at least 2 Vblanks to happen</span>
</span><span class="line">  <span class="c1">;  before we know the PPU has stabilized at startup</span>
</span><span class="line">  <span class="c1">;  Here we wait for the first one.</span>
</span><span class="line">  <span class="k">bit</span> <span class="n">nes.ppu.status</span>
</span><span class="line">  <span class="nl">wait_vblank1:</span>
</span><span class="line">    <span class="k">bit</span> <span class="n">nes.ppu.status</span>
</span><span class="line">    <span class="k">bpl</span> <span class="n">wait_vblank1</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  Before we wait for the second vblank, lets</span>
</span><span class="line">  <span class="c1">;  zero all of the working RAM $0 to $800</span>
</span><span class="line">  <span class="c1">;  The $200s are shadow sprite OAM, and should be set to $fe</span>
</span><span class="line">  <span class="nl">clear_ram:</span>
</span><span class="line">    <span class="k">lda</span> <span class="p">#</span><span class="mh">$00</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$00</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$100</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$300</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$400</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$500</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$600</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$700</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">lda</span> <span class="p">#</span><span class="mh">$fe</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$200</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">inx</span>
</span><span class="line">    <span class="k">bne</span> <span class="n">clear_ram</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  Now wait for the second vblank</span>
</span><span class="line">  <span class="nl">wait_vblank2:</span>
</span><span class="line">    <span class="k">bit</span> <span class="n">nes.ppu.status</span>
</span><span class="line">    <span class="k">bpl</span> <span class="n">wait_vblank2</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  Loop here forever</span>
</span><span class="line">  <span class="nl">forever:</span>
</span><span class="line">    <span class="k">jmp</span> <span class="n">forever</span>
</span><span class="line">
</span><span class="line">  <span class="k">rti</span>
</span><span class="line"><span class="p">.</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  VBlank is called 60 times per second</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">vblank</span>
</span><span class="line">  <span class="k">rti</span>
</span><span class="line"><span class="p">.</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  IRQ, we are not using</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">irq</span>
</span><span class="line">  <span class="k">rti</span>
</span><span class="line"><span class="p">.</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Zero all the APU registers</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">zero_apu</span>
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mh">$00</span>
</span><span class="line">  <span class="k">ldx</span> <span class="p">#</span><span class="mh">$00</span>
</span><span class="line">  <span class="nl">loop:</span>
</span><span class="line">    <span class="k">sta</span> <span class="mh">$4000</span><span class="p">,</span> <span class="n">x</span>
</span><span class="line">    <span class="k">inx</span>
</span><span class="line">    <span class="k">cpx</span> <span class="mh">$18</span>
</span><span class="line">    <span class="k">bne</span> <span class="n">loop</span>
</span><span class="line">  <span class="k">rts</span>
</span><span class="line"><span class="p">.</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So, let’s assemble this file using n65, and load it into an emulator.  This means running n65
in your terminal.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="bash"><span class="line"><span class="nv">$ </span>n65 program_skeleton.asm
</span><span class="line">
</span><span class="line">Building program_skeleton.asm
</span><span class="line">..................................................................................................
</span><span class="line">Second pass, resolving symbols... Done.
</span><span class="line">iNES Header
</span><span class="line">+ <span class="m">1</span> PROG ROM bank
</span><span class="line">+ <span class="m">0</span> CHAR ROM <span class="nv">banks</span>
</span><span class="line"><span class="o">=</span> Output ROM will be <span class="m">16400</span> bytes
</span><span class="line">All Done :<span class="o">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>I develop on OSX, though n65 works under Linux, and probably Windows if you have Ruby installed.</p>

<p>If you named your assembly file <code>program_skeleton.asm</code>,  by default you’re going to get a NES rom 
file with the name <code>program_skeleton.nes</code>.  The output filename can be changed to whatever you like
with the <code>-o</code> flag.</p>

<p>For an emulator, I am a fan of FCEUX because of its debugging and memory viewing
capabilities, but the native version of FCEUX for OSX does not seem to include those features.</p>

<p>So, for debugging on OSX, I’ve taken to running FCEUX under Wine, which works well enough for that
purpose.  With FCEUX under Wine I can use the debugger, and if you run this ROM and open the memory
hex editor you should see the first bit of RAM initialized like this:</p>

<p><img src="http://irkenkitties.com/images/initialized_ram.png" alt="Initialized RAM" /></p>

<p>So, why did we initialize <code>$200 - $2ff</code> to <code>$fe</code>?</p>

<p>That 256 byte page of memory is typically used as “shadow OAM”.  OAM is Object Attribute Memory,
and resides in the PPU’s video RAM, but rather than update it directly, most people keep 
a copy of it here in CPU RAM, and transfer this copy to the PPU once per frame.</p>

<p>Remember how I said the NES has a hardware tile and sprite engine built into the PPU that
just starts running on its own provided you put data in the right spots?</p>

<p>OAM has the <code>x</code> and <code>y</code> coordinates (among other attributes) of the 64 possible 
hardware sprites on the NES, each sprite OAM is 4 bytes, and <code>64 * 4 = 256</code>.  Shoving <code>$fe</code> into
that area, will have moved all the sprites offscreen, because it is possible we’d see a bunch of
garbage sprites if we turned on the PPU and started coppying it over, so shadow OAM is typically 
initialized with this value.</p>

<p>That’s enough about sprites and graphics though, since for now we are just interested in 
getting a simple sound out of the APU.  In fact this program skeleton has turned off the PPU, 
and VBlank for now, and so rendering is totally disabled.  We will turn it on again later
when we want a stable timer for our music.</p>

<h2 id="next-step">Next Step</h2>

<p>The next easiest step to keep us moving forward, we can get the NES to 
make a beep using its APU.  I’ve found a ton of good info on <a href="http://wiki.nesdev.com/w/index.php/APU_basics">NESDev</a>.</p>

<p>So here is a rundown of the parts of the APU:</p>

<ul>
  <li><code>$4000 - $4003</code> Pulse 1</li>
  <li><code>$4004 - $4007</code> Pulse 2</li>
  <li><code>$4008 - $400B</code> Triangle</li>
  <li><code>$400C - $400F</code> Noise</li>
  <li><code>$4010 - $4013</code> DCM</li>
  <li><code>$4015</code> Channel Enable</li>
</ul>

<p>We’re going to want to use one of the Pulse oscillators to make a beep, so let’s use Pulse1.</p>

<p>We want to use the channel enable to enable that oscillator, then write the correct values into
the area <code>$4000 - $4003</code>, to make a concert <code>A 440hz</code> note come out with the right duty cycle.</p>

<p>Here is what the four bytes that control Pulse 1 do, notice that many things are packed into 
one 8-bit byte.  Here is what each bit does:</p>

<pre><code>nes.apu.pulse1.control
$4000 DDLC VVVV
D : Duty cycle of the pulse wave 00 = 12.5% 01 = 25% 10 = 50% 11 = 75%
L : Length Counter Halt
C : Constant Volume
V : 4-bit volume

nes.apu.pulse1.ramp_control
$4001 EPPP NSSS
E : Enabled flag
P : Sweep Divider Period
N : Negate flag, inverts the sweep envelope
S : Shift count

nes.apu.pulse1.ft
$4002 TTTT TTTT
T : Low 8 bits of the timer that controls the frequency

nes.apu.pulse1.ct
$4003 LLLL LTTT
L : Length counter, if Length Counter Halt is 0, timer for note length
T : High 3 bits of timer that controls frequency
</code></pre>

<p>APU register <code>$4001</code> does pitch sweeps, so let’s ignore that for now, and set up enough registers
to get a beep at our desired frequency of <code>440hz</code>.  I’ve listed symbolic names for each of the
registers as well, you get these symbolic names by the assembler directive <code>.inc &lt;nes.sym&gt;</code> in 
the above code listing.</p>

<p>A pulse wave is a type of function generator that is either on or off, and the duty cycle parameter
tells the APU what percentage of the time the wave is on or high.</p>

<p><img src="http://irkenkitties.com/images/duty_cycle.jpg" alt="Duty Cycle" /></p>

<h2 id="setting-nesapupulse1control">Setting nes.apu.pulse1.control</h2>

<p>Setting this effects the timbre of the sound, let’s just set it to 50% for now, this is a 2-bit 
parameter and that corresponds to <code>%10</code> in binary.  The percentage sign prefix on a number means
binary, whereas the dollar sign means hexcidecimal, if you were wondering.</p>

<p>For volume, parameter V, we are allowed 4-bits of resolution, let’s play it as loud as possible,
<code>%1111</code>.  We should also set bit C to <code>%1</code>, to allow constant volume throughout the whole time the note is 
played, and set L to <code>%0</code>, because, we want to use the Length Counter, not halt it.</p>

<p>In the end, when we put all these parameters together into <code>nes.apu.pulse1.control</code> register, we
get the final value of <code>%10011111</code>, or <code>$9f</code> in hex.  I find it a lot clearer to write out registers
with composite values in binary rather than hexcidecimal though.</p>

<h2 id="setting-nesapupulse1ft">Setting nes.apu.pulse1.ft</h2>

<p>This register is for setting the frequency of the generated sound.  An oscillator generates a waveform
that resets itself periodically, and repeats a certain number of times per second.  We want the pulse
wave to reset at 440 times per second so we will get the note concert A, below middle C.</p>

<p>Internal to the APU is a counter which counts at a specific rate, related to the speed of the 2A03
processor, when it reaches the value we set to <code>T</code>, it will reset the period of the waveform, giving
us the right frequency.  But it turns out the size of a register, being 8-bit cannot count high enough
to give us the low notes we expect to be able to produce in music.</p>

<p>Frequency in hertz has an inverse relationship to time in seconds:</p>

<script type="math/tex; mode=display">t = 1/f \\
  f = 1/t</script>

<p>That means the lower the note in hertz, the longer the timer will have to count, and means the counter
has to be at least 11-bits, so the value T spans all of the 8 bits in <code>nes.apu.pulse1.ft</code> and the 
three extra high bits end up in <code>nes.apu.pulse1.ct</code></p>

<p>There is a formula for determining this 11-bit counter number <code>T</code> from frequency in hertz:</p>

<script type="math/tex; mode=display">T = (CPU / (16 \cdot f)) - 1</script>

<p>Where <code>CPU = 1789773.0</code>, which is the speed of an NTSC Nintendo’s processor in hertz.  This value
is different on a PAL NES, in that case <code>CPU = 1662607.0</code>.</p>

<p>Here is a Ruby function for determining the value of <code>T</code>:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line">  <span class="no">CPU</span> <span class="o">=</span> <span class="mi">1789773</span><span class="o">.</span><span class="mi">0</span>
</span><span class="line">
</span><span class="line">  <span class="c1">####</span>
</span><span class="line">  <span class="c1">##  Midi note to NES timer</span>
</span><span class="line">  <span class="k">def</span> <span class="nf">midi_note_to_nes_timer</span><span class="p">(</span><span class="n">frequency</span><span class="p">)</span>
</span><span class="line">    <span class="n">timer</span> <span class="o">=</span> <span class="p">(</span><span class="no">CPU</span> <span class="o">/</span> <span class="p">(</span><span class="mi">16</span> <span class="o">*</span> <span class="n">frequency</span><span class="p">))</span> <span class="o">-</span> <span class="mi">1</span>
</span><span class="line">    <span class="n">timer</span><span class="o">.</span><span class="n">round</span>
</span><span class="line">  <span class="k">end</span>
</span><span class="line">
</span><span class="line">  <span class="n">midi_note_to_nes_timer</span><span class="p">(</span><span class="mi">440</span><span class="o">.</span><span class="mi">0</span><span class="p">)</span>
</span><span class="line">   <span class="o">=&gt;</span> <span class="mi">253</span>
</span><span class="line">
</span><span class="line">  <span class="n">midi_note_to_nes_timer</span><span class="p">(</span><span class="mi">220</span><span class="o">.</span><span class="mi">0</span><span class="p">)</span>
</span><span class="line">   <span class="o">=&gt;</span> <span class="mi">507</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Hey, lucky us, the value <code>253</code> actually does fit within 8-bits.  But that’s cutting it pretty close,
very much lower in frequency that number would have been higher than <code>255</code>, and we would have needed
to put extra bits into <code>nes.apu.pulse1.ct</code>.</p>

<p>This gives me an idea, let’s allow both frequencies to be played.  Let’s create a NES ROM that plays 
a <code>220hz</code> note if the B button is pushed, and a <code>440hz</code> note if the A button is pushed.</p>

<p>So the 11-bit value of <code>T</code> for each frequency is then:</p>

<ul>
  <li><code>440hz = %000 11111101</code></li>
  <li><code>220hz = %001 11111011</code></li>
</ul>

<h2 id="setting-nesapupulse1ct">Setting nes.apu.pulse1.ct</h2>

<p>Like we just mentioned, <code>nes.apu.pulse1.ct</code> contains 5 bits of length counter, to control the duration
of our note, and the 3 high bits from <code>T</code> the frequency counter.</p>

<p>For now let’s set the note length counter to its highest value, <code>%11111</code></p>

<h2 id="reading-from-the-controller">Reading from the Controller</h2>

<p>Since we just decided to allow button B to make one note, and button A to make another, we need to 
learn how to read the NES’s controller buttons.  The best way to do this, is to create a subroutine
which reads each of the buttons we care about, and stores their states into the work RAM area.  This
way, we can detect when the button is first pressed, and not just held down.</p>

<p>Controller 1, like everything else, is a memory mapped device, and it is mapped to address <code>$4016</code>,
or, if we’re using my symbolic names, simply <code>nes.controller1</code>.</p>

<p>To tell the controller we want to read its button states, we have to “strobe” the controller, which
just means to write a <code>$01</code> and then a <code>$00</code> to it in succession.  Then bit 0 of the next eight bytes
that we read out of that location reveal the state of each button in the following order:</p>

<ul>
  <li>A</li>
  <li>B</li>
  <li>Select</li>
  <li>Start</li>
  <li>Up</li>
  <li>Down</li>
  <li>Left</li>
  <li>Right</li>
</ul>

<h2 id="putting-it-all-together">Putting it all together</h2>

<p>Here are some modifications and additions.  First we add an initialize subroutine to our reset 
which enables both pulse1 and pulse2, and turns the PPU back on so that we get VBlank interrupts again.</p>

<p>The VBlank is the portion of time when the screen is in-between drawing, and is a handy place you
can put code you would like run every frame, at 60 frames per second.  We use this to call our
<code>read_input</code> subroutine repeatedly.</p>

<p>The <code>read_input</code> subroutine strobes controller1 and reads the state of the <code>A</code> and <code>B</code> buttons,
and stores their state into <code>controller_state</code> as defined in RAM at address <code>$0000</code> in the zero
page.  The zero page is the first 256 bytes of RAM, which can be quickly accessed using only
an 8-bit address, when you see a <code>zp</code> suffix on an instruction, you are telling the assembler
it can use the quick zero page addressing mode.</p>

<p>We store the state of the <code>A</code> and <code>B</code> buttons in RAM so that we can tell when they are first
changing state, so that we only play our notes once per button press.</p>

<p>Then we’ve added two subroutines which load the values discussed above into the APU to get
our notes to play.  <code>nes.apu.pulse1</code> and <code>nes.apu.pulse2</code> both operate in the exact same way,
which is why we turned them both on, each button triggers one of the two pulse generators,
which means we can hear both sounds at once, overlapping if needed.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
<span class="line-number">51</span>
<span class="line-number">52</span>
<span class="line-number">53</span>
<span class="line-number">54</span>
<span class="line-number">55</span>
<span class="line-number">56</span>
<span class="line-number">57</span>
<span class="line-number">58</span>
<span class="line-number">59</span>
<span class="line-number">60</span>
<span class="line-number">61</span>
<span class="line-number">62</span>
<span class="line-number">63</span>
<span class="line-number">64</span>
<span class="line-number">65</span>
<span class="line-number">66</span>
<span class="line-number">67</span>
<span class="line-number">68</span>
<span class="line-number">69</span>
<span class="line-number">70</span>
<span class="line-number">71</span>
<span class="line-number">72</span>
<span class="line-number">73</span>
<span class="line-number">74</span>
<span class="line-number">75</span>
<span class="line-number">76</span>
<span class="line-number">77</span>
<span class="line-number">78</span>
<span class="line-number">79</span>
<span class="line-number">80</span>
<span class="line-number">81</span>
<span class="line-number">82</span>
<span class="line-number">83</span>
<span class="line-number">84</span>
<span class="line-number">85</span>
<span class="line-number">86</span>
<span class="line-number">87</span>
<span class="line-number">88</span>
<span class="line-number">89</span>
<span class="line-number">90</span>
<span class="line-number">91</span>
<span class="line-number">92</span>
<span class="line-number">93</span>
<span class="line-number">94</span>
<span class="line-number">95</span>
<span class="line-number">96</span>
<span class="line-number">97</span>
<span class="line-number">98</span>
<span class="line-number">99</span>
<span class="line-number">100</span>
<span class="line-number">101</span>
<span class="line-number">102</span>
<span class="line-number">103</span>
<span class="line-number">104</span>
<span class="line-number">105</span>
<span class="line-number">106</span>
<span class="line-number">107</span>
<span class="line-number">108</span>
<span class="line-number">109</span>
<span class="line-number">110</span>
<span class="line-number">111</span>
<span class="line-number">112</span>
<span class="line-number">113</span>
<span class="line-number">114</span>
<span class="line-number">115</span>
<span class="line-number">116</span>
<span class="line-number">117</span>
</pre></td><td class="code"><pre><code class="ca65"><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Structure to keep track of input</span>
</span><span class="line"><span class="c1">;  Add this before your reset subroutine</span>
</span><span class="line"><span class="kp">.org</span> <span class="mh">$0000</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">controller_state</span>
</span><span class="line">  <span class="kp">.space</span> <span class="n">b</span> <span class="mi">1</span>
</span><span class="line">  <span class="kp">.space</span> <span class="n">a</span> <span class="mi">1</span>
</span><span class="line"><span class="p">.</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Initialize everything</span>
</span><span class="line"><span class="c1">;  Call this subroutine before your infinite loop in reset</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">initialize</span>
</span><span class="line">  <span class="c1">;  Enable pulse1 and pulse2 in the APU</span>
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mb">%00000011</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.apu.channel_enable</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  Initialize the controller states</span>
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mh">$00</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">controller_state.a</span> <span class="n">zp</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">controller_state.b</span> <span class="n">zp</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  Reenable interrupts, Turn Vblank back on</span>
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mb">%10000000</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.ppu.control</span>
</span><span class="line">  <span class="k">cli</span>
</span><span class="line">  <span class="k">rts</span>
</span><span class="line"><span class="p">.</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  VBlank is called 60 times per second</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">vblank</span>
</span><span class="line">  <span class="k">jsr</span> <span class="n">read_input</span>
</span><span class="line">  <span class="k">rti</span>
</span><span class="line"><span class="p">.</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;  Read input from controller 1</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">read_input</span>
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mh">$01</span>                <span class="c1">; strobe joypad</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.controller1</span>
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mh">$00</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.controller1</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  Handle Button A</span>
</span><span class="line">  <span class="k">lda</span> <span class="n">nes.controller1</span>
</span><span class="line">  <span class="k">and</span> <span class="p">#</span><span class="mh">$01</span>
</span><span class="line">  <span class="k">beq</span> <span class="n">update_a_state</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  A is pressed, but did it just change to being pressed now?</span>
</span><span class="line">  <span class="k">ldx</span> <span class="n">controller_state.a</span> <span class="n">zp</span>
</span><span class="line">  <span class="k">bne</span> <span class="n">update_a_state</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  do the thing A does</span>
</span><span class="line">  <span class="k">jsr</span> <span class="n">play_a440</span>
</span><span class="line">
</span><span class="line">  <span class="nl">update_a_state:</span>
</span><span class="line">    <span class="k">sta</span> <span class="n">controller_state.a</span> <span class="n">zp</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  Handle Button B</span>
</span><span class="line">  <span class="k">lda</span> <span class="n">nes.controller1</span>
</span><span class="line">  <span class="k">and</span> <span class="p">#</span><span class="mh">$01</span>
</span><span class="line">  <span class="k">beq</span> <span class="n">update_b_state</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  B is pressed, but did it just change to being pressed now?</span>
</span><span class="line">  <span class="k">ldx</span> <span class="n">controller_state.b</span> <span class="n">zp</span>
</span><span class="line">  <span class="k">bne</span> <span class="n">update_b_state</span>
</span><span class="line">
</span><span class="line">  <span class="c1">;  Do the thing B does</span>
</span><span class="line">  <span class="k">jsr</span> <span class="n">play_a220</span>
</span><span class="line">
</span><span class="line">  <span class="nl">update_b_state:</span>
</span><span class="line">    <span class="k">sta</span> <span class="n">controller_state.b</span> <span class="n">zp</span>
</span><span class="line">
</span><span class="line">  <span class="k">rts</span>
</span><span class="line"><span class="p">.</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;;  This will play an A 220hz note</span>
</span><span class="line"><span class="c1">;;  On the pulse1 generator</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">play_a220</span>
</span><span class="line">  <span class="k">pha</span>
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mb">%10011111</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.apu.pulse1.control</span>
</span><span class="line">
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mb">%11111011</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.apu.pulse1.ft</span>
</span><span class="line">
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mb">%11111001</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.apu.pulse1.ct</span>
</span><span class="line">
</span><span class="line">  <span class="k">pla</span>
</span><span class="line">  <span class="k">rts</span>
</span><span class="line"><span class="p">.</span>
</span><span class="line">
</span><span class="line">
</span><span class="line"><span class="c1">;;;;</span>
</span><span class="line"><span class="c1">;;  This will play an A 440hz note</span>
</span><span class="line"><span class="c1">;;  On the pulse2 generator</span>
</span><span class="line"><span class="kp">.scope</span> <span class="n">play_a440</span>
</span><span class="line">  <span class="k">pha</span>
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mb">%10011111</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.apu.pulse2.control</span>
</span><span class="line">
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mb">%11111101</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.apu.pulse2.ft</span>
</span><span class="line">
</span><span class="line">  <span class="k">lda</span> <span class="p">#</span><span class="mb">%11111000</span>
</span><span class="line">  <span class="k">sta</span> <span class="n">nes.apu.pulse2.ct</span>
</span><span class="line">
</span><span class="line">  <span class="k">pla</span>
</span><span class="line">  <span class="k">rts</span>
</span><span class="line"><span class="p">.</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="conclusion">Conclusion</h2>

<p>So that’s it for our first attempts to get the NES to make sounds.  I have actually been working
on MIDI to NES converter, which converts a MIDI file into a byte stream that can be quickly written
to the APU registers at the correct tempo, which is almost complete.  That will be the topic of my
next post.</p>

<p>You can find n65, <a href="https://github.com/safiire/n65">my NES assembler here</a>.</p>

<p>And the source code for this <a href="https://gist.github.com/safiire/66746adc460abad3a429">NES sound example here</a></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Matrices as Linear Operators]]></title>
    <link href="http://irkenkitties.com/blog/2014/10/17/matrices-as-linear-operations/"/>
    <updated>2014-10-17T07:57:55+00:00</updated>
    <id>http://irkenkitties.com/blog/2014/10/17/matrices-as-linear-operations</id>
    <content type="html"><![CDATA[<p>Since they are my favourite, let’s learn something neat about matrices, something that can also
serve as the first post on this new blog of mine about math, programming, and DSP.</p>

<!-- more -->

<h2 id="matrix-multiplication-as-a-linear-operator">Matrix Multiplication as a Linear Operator</h2>

<p>It turns out that matrix multiplication can be used to perform any linear mathematical operation, and
a whole lot of interesting things are linear.  Geometrically speaking, scaling, rotation, and skewing 
are linear operations.</p>

<p>First let’s say we want to model multiplication of two complex numbers by matrices. First we need some
complex numbers to multiply, and I happen to like $(3 + 4i) \cdot i$.</p>

<p>So that is pretty easy it is just polynomial multiplication, so we distribute $i$ onto both terms.</p>

<p><img class="center" src="http://irkenkitties.com/images/math/complex_rotation.png" /></p>

<script type="math/tex; mode=display">(3 + 4i) \cdot i \\
  4i^2 + 3i \\
  4 \cdot (-1) + 3i \\
  -4 + 3i \\</script>

<p>Yep, multiplying by $i$ is a rotation $90^{\circ}$ counter clockwise. So anyways the thing I think is cool, 
is how it can be represented as a matrix multiply instead of looking like a polynomial multiply.</p>

<h2 id="identity-operation">Identity Operation</h2>

<p>The identiy matrix, the matrix that if you multiply by it, it is basically a no-op, why does it act like
that, and why is it shaped the way it is?  Say you have this matrix multiply:</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
\begin{bmatrix} 
  c & 0 \\ 
  0 & c 
\end{bmatrix}

\cdot

\begin{bmatrix} 
  a \\ 
  b 
\end{bmatrix}

= 

\begin{bmatrix} 
  c \cdot a + 0 \cdot b \\ 
  0 \cdot a + c \cdot b
\end{bmatrix}

= 

\begin{bmatrix} 
  ca  \\ 
  cb
\end{bmatrix} %]]&gt;</script>

<p>If $c = 1$ then there is your identity operation.  But did you ever think:</p>

<blockquote>
  <p>What are these rows and columns in a matrix really all about?</p>
</blockquote>

<p>Say you view that $2x2$ matrix as two unit length column vectors sitting side by side.</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
\begin{bmatrix} 
  1 & 0    \\ 
  0 & 1 
\end{bmatrix} %]]&gt;</script>

<p>The first column $\begin{bmatrix} 1 &amp; 0 \end{bmatrix}^{T}$ and the second column 
$\begin{bmatrix} 0 &amp; 1 \end{bmatrix}^{T}$ are exactly the basis vectors which define and span 
$\mathbb{R}^{2}$.  Otherwise known as either the x-y or real-imaginary axis.</p>

<h2 id="change-of-basis">Change of Basis</h2>

<p>So we saw that multiplication by the identity matrix performs no operation at all, because there
is just no change to the basis vectors for that space $\mathbb{R}^{2}$.  We also saw if we perform
a simple change of basis where we scale by $c$, it just scales everything by $c$. The
diagonal numbers don’t have to be the same as each other either, if they were different you would get a 
skewing operation instead of a scaling operation.</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
\begin{bmatrix} 
  2 & 0 \\ 
  0 & 4 
\end{bmatrix}

\cdot

\begin{bmatrix} 
  a \\ 
  b 
\end{bmatrix}

= 

\begin{bmatrix} 
  2 \cdot a + 0 \cdot b \\ 
  0 \cdot a + 4 \cdot b
\end{bmatrix}

= 

\begin{bmatrix} 
  2a  \\ 
  4b
\end{bmatrix} %]]&gt;</script>

<p>Great, so what do the other numbers on the opposite diagonal that have always been $0$ up to this
point do?  Those numbers let you perform rotations.</p>

<h2 id="time-to-define-the-i-matrix">Time to Define the $i$ Matrix</h2>

<p>If we take the two column matrices we are using as our basis, and rotate them counter clockwise 
by $90^{\circ}$, which should be easy because they are so simple, we should get the new basis we’re
looking for.</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
identity =
\begin{bmatrix} 
  1 & 0    \\ 
  0 & 1 
\end{bmatrix}

and, \\

i =
\begin{bmatrix} 
  0 & -1    \\ 
  1 & 0 
\end{bmatrix} %]]&gt;</script>

<p>You can see how the first column, instead of being a vector pointing horizontally, is now pointing vertically,
and how the second column, which used to, by chance be pointing vertically is now pointing horizontally but in
the negative direction, each vector is pointing $90^{\circ}$ counter clockwise to where it used to be pointing.</p>

<p>So what that means, is since we’ve rotated each component $90^{\circ}$ anything vector we multiply by $i$ will also 
rotate in the same way.</p>

<h2 id="square-root-of-negative-one">Square Root of Negative One</h2>

<p>This should totally be true of a matrix that we decide to name $i$, that is $i^2 = -1$, or well it should 
equal the matrix version of $-1$.</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
\begin{bmatrix} 
  0 & -1    \\ 
  1 & 0 
\end{bmatrix}

\cdot

\begin{bmatrix} 
  0 & -1    \\ 
  1 & 0 
\end{bmatrix}

= 

\begin{bmatrix} 
  -1 & 0    \\ 
  0 & -1 
\end{bmatrix} %]]&gt;</script>

<p>Further proof that this makes any sense:</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
\begin{bmatrix} 
  0 & -1    \\ 
  1 & 0 
\end{bmatrix}

\cdot

\begin{bmatrix} 
  3    \\ 
  4 
\end{bmatrix}

= 

\begin{bmatrix} 
  -4  \\ 
  3
\end{bmatrix} %]]&gt;</script>

<p>Just as the old “graph paper” example predicted.  So, I am pretty happy with my explaination of this phenomenon.
I have to admit I am <em>just</em> getting used to this Mathjax Latex formatting stuff.</p>

<p>Normally I am happy with a code example, so here is a Ruby example of the same thing:</p>

<h2 id="ruby-example">Ruby example</h2>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="nb">require</span> <span class="s1">&#39;matrix&#39;</span>
</span><span class="line">
</span><span class="line"><span class="n">v</span> <span class="o">=</span> <span class="no">Vector</span><span class="o">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="o">]</span>
</span><span class="line">
</span><span class="line"><span class="n">i</span> <span class="o">=</span> <span class="no">Matrix</span><span class="o">.</span><span class="n">columns</span><span class="p">(</span><span class="o">[[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="o">]</span><span class="p">,</span><span class="o">[-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="o">]]</span><span class="p">)</span>
</span><span class="line"><span class="n">i</span> <span class="o">*</span> <span class="no">Vector</span><span class="o">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="o">]</span>
</span><span class="line">
</span><span class="line"><span class="o">=&gt;</span> <span class="no">Vector</span><span class="o">[-</span><span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="o">]</span>
</span><span class="line">
</span><span class="line"><span class="n">i</span> <span class="o">*</span> <span class="n">i</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="no">Matrix</span><span class="o">[[-</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">]]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="other-rotations">Other Rotations</h2>

<p>We don’t alway want to rotate by $90^{\circ}$, but there is an equation that will let us create a matrix
for any arbitrary rotation by $\omega$ radians.  And that happens to look like this:</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
\begin{bmatrix} 
  cos(\omega) & -sin(\omega) \\
  sin(\omega) &  cos(\omega) \\
\end{bmatrix} %]]&gt;</script>

<p>Let’s write a Ruby method to create rotation matrices for us, just by passing an angle in radians.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="nb">require</span> <span class="s1">&#39;matrix&#39;</span>
</span><span class="line">
</span><span class="line"><span class="k">def</span> <span class="nf">create_rotation_matrix</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
</span><span class="line">  <span class="n">sin_w</span> <span class="o">=</span> <span class="no">Math</span><span class="o">.</span><span class="n">sin</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
</span><span class="line">  <span class="n">cos_w</span> <span class="o">=</span> <span class="no">Math</span><span class="o">.</span><span class="n">cos</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
</span><span class="line">  <span class="no">Matrix</span><span class="o">.</span><span class="n">columns</span><span class="p">(</span><span class="o">[</span>
</span><span class="line">      <span class="o">[</span><span class="n">cos_w</span><span class="p">,</span>  <span class="n">sin_w</span><span class="o">]</span><span class="p">,</span>
</span><span class="line">      <span class="o">[-</span><span class="n">sin_w</span><span class="p">,</span> <span class="n">cos_w</span><span class="o">]]</span>
</span><span class="line">  <span class="p">)</span>
</span><span class="line"><span class="k">end</span>
</span><span class="line">
</span><span class="line"><span class="n">w</span> <span class="o">=</span> <span class="no">Math</span><span class="o">::</span><span class="no">PI</span> <span class="o">/</span> <span class="mi">4</span><span class="o">.</span><span class="mi">0</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">0</span><span class="o">.</span><span class="mi">7853981633974483</span>
</span><span class="line">
</span><span class="line"><span class="n">forty_five</span> <span class="o">=</span> <span class="n">create_rotation_matrix</span><span class="p">(</span><span class="n">w</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="no">Matrix</span><span class="o">[[</span><span class="mi">0</span><span class="o">.</span><span class="mi">7071067811865476</span><span class="p">,</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">7071067811865475</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="mi">0</span><span class="o">.</span><span class="mi">7071067811865475</span><span class="p">,</span> <span class="mi">0</span><span class="o">.</span><span class="mi">7071067811865476</span><span class="o">]]</span>
</span><span class="line">
</span><span class="line"><span class="n">v</span> <span class="o">=</span> <span class="no">Vector</span><span class="o">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="o">]</span>
</span><span class="line">
</span><span class="line"><span class="n">forty_five</span> <span class="o">*</span> <span class="n">v</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="no">Vector</span><span class="o">[-</span><span class="mi">0</span><span class="o">.</span><span class="mi">707106781186547</span><span class="p">,</span> <span class="mi">4</span><span class="o">.</span><span class="mi">949747468305833</span><span class="o">]</span>
</span><span class="line">
</span><span class="line"><span class="c1">##  Nice, and rotate by 45 degrees twice?</span>
</span><span class="line"><span class="n">forty_five</span> <span class="o">*</span> <span class="n">forty_five</span> <span class="o">*</span> <span class="n">v</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="no">Vector</span><span class="o">[-</span><span class="mi">3</span><span class="o">.</span><span class="mi">999999999999999</span><span class="p">,</span> <span class="mi">3</span><span class="o">.</span><span class="mo">000000000000001</span><span class="o">]</span>
</span><span class="line">
</span><span class="line"><span class="c1">##  Now that&#39;s a &quot;computer close&quot; type of answer if I ever saw one :)</span>
</span><span class="line"><span class="c1">##  Very close to Vector[-4, 3]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="matrix-form">Matrix Form</h2>

<p>Now that we’ve established all that stuff about complex numbers and matrices works we sort of
have a formula for represeenting a complex number as a matrix.</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
3 + 4i = 

  \begin{bmatrix} 
    3 & -4 \\
    4 &  3
  \end{bmatrix} %]]&gt;</script>

<p>So what happens if we use some other sorta pattern besides that?   What if we use some other dimension besides
the imaginary dimension?  What if that dimension was infinitesimal.  Most people learn calculus by learning
about limits first, but for some reason I didn’t, I learned on my own, and the first calculus textbook that
made sense to me taught derivitives using infinitesimals, it’s really similar in some ways, but revolves around
the number $\varepsilon$</p>

<h2 id="derivitives">Derivitives</h2>

<p>Derivitives calculate the slope at one point on a curve, when it takes two actual points to calculate a slope,
“Rise over Run” style.  Usually you see a formula for derivitive using a variable $h$ or $\Delta x$, and take the limit as
it goes to 0</p>

<script type="math/tex; mode=display">f'(x) = \lim\limits_{\Delta x \to 0} \dfrac{f(x+\Delta x)-f(x)}{\Delta x}</script>

<p>…but in this “style” of calculus, instead of that, you use $\varepsilon$ where $\varepsilon^{2} = 0$.
In math, they say that if there is some positive integer $n$ where $x^n = 0$ then you would call $x$ a nilpotent number</p>

<p>So, example:</p>

<script type="math/tex; mode=display">f(x) = x^2    \\ \\

  f'(x) = \dfrac{f(x + \varepsilon) - f(x)}{\varepsilon}   \\ \\

  f'(x) = \dfrac{(x + \varepsilon)^{2} - x^{2}}{\varepsilon} \\ \\

  f'(x) = \dfrac{x^{2} + x\varepsilon + x\varepsilon + \varepsilon^{2} - x^{2}}{\varepsilon} \\ \\ 

  f'(x) = \dfrac{2x\varepsilon}{\varepsilon} \\ \\

  f'(x) = 2x</script>

<p>And that all worked out correctly, because $2x$ is totally the derivitive of $x^{2}$.  The key to that working
out was that we defined $\varepsilon^{2} = 0$, which is something that totally reminds me of defining $i^{2} = -1$.</p>

<h2 id="dual-numbers">Dual Numbers</h2>

<p>Like a complex number has the form $a + bi$, a dual number has the form $a + b\varepsilon$.  The imaginary number $i$
has magic powers, in that it can magically do rotations that you would normally have to use trigonometry for, but
a dual number, has the magic power that it can automatically calculate the derivitive of a function.</p>

<p>All you need to do to simultaneously calculate the value of a function, and its derivitive, is pass the function
a value of $x + \varepsilon$, that’s whatever $x$ happens to be + $1\varepsilon$.</p>

<p>Simple example again.</p>

<script type="math/tex; mode=display">f(x) = x^2    \\ \\

  f(x + \varepsilon) = (x + \varepsilon)^{2} \\ \\

  f(x + \varepsilon) = x^{2} + x\varepsilon + x\varepsilon + \varepsilon^{2} \\ \\

  f(x + \varepsilon) = x^{2} + 2x\varepsilon</script>

<p>The result of the function is another dual number, the real part of which is $x^{2}$, and the dual part is $2x$,
which the value and derivitive at $f(x)$ and $f’(x)$ respectively.</p>

<h2 id="dual-numbers-as-matrices">Dual Numbers as Matrices</h2>

<p>So just like we can encode a complex number into a 2x2 matrix, we can also encode a dual number in a similar way.</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
\varepsilon = 

  \begin{bmatrix} 
    0 &  1 \\
    0 &  0
  \end{bmatrix}  \\ \\ %]]&gt;</script>

<p>So if we multiply $\varepsilon \cdot \varepsilon$, we should get 0.</p>

<script type="math/tex; mode=display">% &lt;![CDATA[
\begin{bmatrix} 
    0 &  1 \\
    0 &  0
  \end{bmatrix} 

  \cdot

  \begin{bmatrix} 
    0 &  1 \\
    0 &  0
  \end{bmatrix} 

  = 

  \begin{bmatrix} 
    0 \cdot 0 + 1 \cdot 0 &  0 \cdot 1 + 1 \cdot 0 \\
    0 \cdot 0 + 0 \cdot 0 &  0 \cdot 1 + 0 \cdot 0
  \end{bmatrix} 

  =

  \begin{bmatrix} 
    
    0 &  0 \\
    0 &  0
  \end{bmatrix} %]]&gt;</script>

<h2 id="ruby-class-for-dual-numbers">Ruby Class for Dual Numbers</h2>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
<span class="line-number">21</span>
<span class="line-number">22</span>
<span class="line-number">23</span>
<span class="line-number">24</span>
<span class="line-number">25</span>
<span class="line-number">26</span>
<span class="line-number">27</span>
<span class="line-number">28</span>
<span class="line-number">29</span>
<span class="line-number">30</span>
<span class="line-number">31</span>
<span class="line-number">32</span>
<span class="line-number">33</span>
<span class="line-number">34</span>
<span class="line-number">35</span>
<span class="line-number">36</span>
<span class="line-number">37</span>
<span class="line-number">38</span>
<span class="line-number">39</span>
<span class="line-number">40</span>
<span class="line-number">41</span>
<span class="line-number">42</span>
<span class="line-number">43</span>
<span class="line-number">44</span>
<span class="line-number">45</span>
<span class="line-number">46</span>
<span class="line-number">47</span>
<span class="line-number">48</span>
<span class="line-number">49</span>
<span class="line-number">50</span>
<span class="line-number">51</span>
<span class="line-number">52</span>
<span class="line-number">53</span>
<span class="line-number">54</span>
<span class="line-number">55</span>
<span class="line-number">56</span>
<span class="line-number">57</span>
<span class="line-number">58</span>
<span class="line-number">59</span>
<span class="line-number">60</span>
<span class="line-number">61</span>
<span class="line-number">62</span>
<span class="line-number">63</span>
<span class="line-number">64</span>
<span class="line-number">65</span>
<span class="line-number">66</span>
<span class="line-number">67</span>
<span class="line-number">68</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="c1">####</span>
</span><span class="line"><span class="c1">##  Here is a class that implements Dual numbers, with addition,</span>
</span><span class="line"><span class="c1">##  multiplication, and exponentiation</span>
</span><span class="line"><span class="k">class</span> <span class="nc">Dual</span>
</span><span class="line">    <span class="kp">attr_accessor</span> <span class="ss">:matrix</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">real</span><span class="p">,</span> <span class="n">dual</span><span class="p">)</span>
</span><span class="line">        <span class="vi">@matrix</span> <span class="o">=</span> <span class="no">Matrix</span><span class="o">[[</span><span class="n">real</span><span class="p">,</span> <span class="n">dual</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="n">real</span><span class="o">]]</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">+</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
</span><span class="line">        <span class="n">result</span> <span class="o">=</span> <span class="vi">@matrix</span> <span class="o">+</span> <span class="n">other</span><span class="o">.</span><span class="n">matrix</span>
</span><span class="line">        <span class="no">Dual</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">result</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="o">]</span><span class="p">,</span> <span class="n">result</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="o">]</span><span class="p">)</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">*</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
</span><span class="line">        <span class="n">result</span> <span class="o">=</span> <span class="vi">@matrix</span> <span class="o">*</span> <span class="n">other</span><span class="o">.</span><span class="n">matrix</span>
</span><span class="line">        <span class="no">Dual</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">result</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="o">]</span><span class="p">,</span> <span class="n">result</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="o">]</span><span class="p">)</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">**</span><span class="p">(</span><span class="n">exponent</span><span class="p">)</span>
</span><span class="line">        <span class="n">result</span> <span class="o">=</span> <span class="vi">@matrix</span><span class="o">**</span><span class="n">exponent</span>
</span><span class="line">        <span class="no">Dual</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">result</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="o">]</span><span class="p">,</span> <span class="n">result</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="o">]</span><span class="p">)</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">to_s</span>
</span><span class="line">        <span class="s2">&quot;</span><span class="si">#{</span><span class="n">real</span><span class="si">}</span><span class="s2"> + </span><span class="si">#{</span><span class="n">dual</span><span class="si">}</span><span class="s2">ε&quot;</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">inspect</span>
</span><span class="line">        <span class="nb">to_s</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">real</span>
</span><span class="line">        <span class="vi">@matrix</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="o">]</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">dual</span>
</span><span class="line">        <span class="vi">@matrix</span><span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="o">]</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line"><span class="k">end</span>
</span><span class="line"><span class="c1">#</span>
</span><span class="line"><span class="c1">####</span>
</span><span class="line"><span class="c1">##  Now let&#39;s have f(x) = x**2</span>
</span><span class="line"><span class="k">def</span> <span class="nf">f</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
</span><span class="line">    <span class="n">x</span><span class="o">**</span><span class="mi">2</span>
</span><span class="line"><span class="k">end</span>
</span><span class="line"><span class="c1">####</span>
</span><span class="line"><span class="c1">##  Let&#39;s print a few values of this function</span>
</span><span class="line"><span class="nb">print</span> <span class="s2">&quot;f(x) = &quot;</span>
</span><span class="line"><span class="nb">p</span> <span class="p">(</span><span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="mi">15</span><span class="p">)</span><span class="o">.</span><span class="n">map</span><span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="p">}</span>
</span><span class="line"><span class="c1">## This prints:</span>
</span><span class="line"><span class="c1">## f(x) = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225]</span>
</span><span class="line"><span class="c1">#  </span>
</span><span class="line"><span class="c1">#  </span>
</span><span class="line"><span class="c1">####</span>
</span><span class="line"><span class="c1">##  Now lets run function f on a dual number, f(x + ε)</span>
</span><span class="line"><span class="nb">print</span> <span class="s2">&quot;f(x + ε) = &quot;</span>
</span><span class="line"><span class="nb">p</span> <span class="p">(</span><span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="mi">15</span><span class="p">)</span><span class="o">.</span><span class="n">map</span><span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">f</span><span class="p">(</span><span class="no">Dual</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="p">}</span>
</span><span class="line"><span class="c1"># </span>
</span><span class="line"><span class="c1"># </span>
</span><span class="line"><span class="c1">##  This prints</span>
</span><span class="line"><span class="c1">##  f(x + ε) = [0 + 0ε, 1 + 2ε, 4 + 4ε, 9 + 6ε, 16 + 8ε, 25 + 10ε, 36 + 12ε, </span>
</span><span class="line"><span class="c1">##              49 + 14ε, 64 + 16ε, 81 + 18ε, 100 + 20ε, 121 + 22ε, 144 + 24ε, </span>
</span><span class="line"><span class="c1">##              169 + 26ε, 196 + 28ε, 225 + 30ε]</span>
</span><span class="line"><span class="c1"># </span>
</span><span class="line"><span class="c1"># </span>
</span><span class="line"><span class="c1">##  The real part of the dual number in f(x + ε) is exactly the same as f(x)</span>
</span><span class="line"><span class="c1">##  Let&#39;s just print out the dual component instead</span>
</span><span class="line"><span class="c1"># </span>
</span><span class="line"><span class="nb">print</span> <span class="s2">&quot;Dual{f(x + ε)} = &quot;</span>
</span><span class="line"><span class="nb">p</span> <span class="p">(</span><span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="mi">15</span><span class="p">)</span><span class="o">.</span><span class="n">map</span><span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">f</span><span class="p">(</span><span class="no">Dual</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span><span class="o">.</span><span class="n">dual</span> <span class="p">}</span>
</span><span class="line"><span class="c1"># </span>
</span><span class="line"><span class="c1"># </span>
</span><span class="line"><span class="c1">##  This prints</span>
</span><span class="line"><span class="c1">##  Dual{f(x + ε)} = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="conclusion">Conclusion</h2>

<p>I dunno, thought that was pretty cool.  Actually the more I figure out about matrices
the more I am understanding how they can be used to implement any linear operator.  Actually the reasoning
behind me even caring about matrices or linear operators at all (or math really), is that works together
well with my obsession for digital audio filters.  Because a digital filter is usually a linear operation, yep,
matrices can be used to calculate filters :)  Hopefully I will get more into describing how filters work in
future blog posts.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building My Shruthi-1]]></title>
    <link href="http://irkenkitties.com/blog/2012/12/13/building-my-shruthi-1/"/>
    <updated>2012-12-13T17:54:00-08:00</updated>
    <id>http://irkenkitties.com/blog/2012/12/13/building-my-shruthi-1</id>
    <content type="html"><![CDATA[<p>Last year I built a small MIDI controlled polyphonic synthesizer called KittySynth using a <a href="http://leaflabs.com/devices/maple/">72MHz LeafLabs Maple</a> 
microcontroller board, an <a href="http://www.openmusiclabs.com/projects/codec-shield/">Audio Codec Shield</a> from Open Music Labs,
and some C++.  I had originally had some ideas to try to build something like this by abusing the timers and PWM duty cycles
on a 16MHz Arduino Mega I have, but quickly realized there was no way on earth I could build what I wanted to with the small
amount of resources on an Arduino.  The ARM based STM32 chip on the Maple had just enough resources available to create 
an 8-voice polyphonic wavetable synth, which I should write about sooner or later.</p>

<p>Anyway, while researching for that project I found out that someone actually has created a perfectly viable synthesizer
based around a 20MHz ATMega chip (as in the Arduino) called the <a href="http://mutable-instruments.net/">Shruthi-1</a>.  I thought this was a perfect
opportunity to go through the steps of actually building a proper synth of the sort I would someday like to design,
so I ordered the Shruth-1 4-Pole Mission Kit, and decided to put it together from scratch.</p>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_01.jpg" alt="The Parts Arrived" title="The Parts Arrive" /></p>

<!-- more -->

<p>Shruthies are only really offered as kits you put together, they’re about $180 Canadian, and come from France.  If you
want a real, working, and fun synth for not a lot of money and can use a soldering iron, it’s probably the way to go.</p>

<p>Olivier Gillet, the designer of the Shruthi, is pretty inspirational to me, but how did he design an awesome synth around
a little 20MHz ATMega chip?  First thing, is that the Shruth-1 4-Pole Mission is a hybrid digital-analog monosynth.  The synth
is divided into two PCBs, the top PCB is the digital control board, which contains the ATMega chip, LCD, knobs, and buttons.  It is 
running software responsible for handling MIDI, generating the digital wavetable oscillators, envelopes, LFOs, reading the
knobs.  There are 20 pins connecting it to the bottom PCB that primarily contains the analog filter, but also has the
power regulator, MIDI and audio inputs and outputs.</p>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_03.jpg" alt="Starting the Filter Board" title="Starting the Filter Board" /></p>

<p>Having an analog filter is a common cause for a synth to be monophonic, ie. only one voice or 
note at a time.  This is because in order to be polyphonic an analog synth would need separate circuitry
for oscillator, envelope, and filter for each possible voice that could sound at once, making it much
more expensive for each voice.  There are <a href="http://electronicmusic.wikia.com/wiki/Paraphonic">paraphonic</a> 
synthesizers which can assign a note to more than one oscillator and sound them simultaneously, but
uses only one envelope and one filter.  The Shruthi-1 does something similar with its duophony mode.
Since it has two oscillators it allows you to play two notes at once, the first is assigned to Osc1,
and the second to Osc2, however they are both enveloped and filtered together.</p>

<h1 id="digital-board">Digital Board</h1>

<p>Shruthi-1 has two 8-bit digital oscillators, and either a square or triangle sub oscillator, or a click generator to 
create nice transients during a note’s attack.  The main and sub oscillators have a vibrato setting, the main
oscs are also able to be detuned separately, and have a PWM control.</p>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_04.jpg" alt="Filter Board" title="Filter Board" /></p>

<p>Looking at the code, the Shruthi-1 generates its 8-bit oscillators in a few different ways, I can see code for rendering
pure wavetables with interpolation, some code where it is waveshaping a static wavetable, some for interpolating two wavetables
together, and some which outright generates a signal in real-time.</p>

<p>The sub osc or click/noise generator is sent straight to a digital mixer for summation, while the two main oscs 
enter a modulator first.  The modulator is where a significant amount of character is introduced in the synth.<br />
The default algorithm in the modulator is a simple balance control between the two oscillators, but there are 
many other algorithms such as:</p>

<ul>
  <li>Mixing with balance</li>
  <li>Syncing - Osc2’s phase resets when Osc1’s does</li>
  <li>Ring Modulation - Multiply and scales</li>
  <li>XOR - Combines the two Oscs with bitwise xor</li>
  <li>Fuzz - Osc1 &amp; 2 are shaped by tanh(), like a soft clipper</li>
  <li>4 or 8 bit sample rate reduction</li>
  <li>Bit Crusher</li>
  <li>Duo - Let’s Osc1 &amp; 2 play two different notes at once</li>
  <li>More I haven’t figured out :)</li>
</ul>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_06.jpg" alt="Filter Board" title="Filter Board" /></p>

<h1 id="analog-board">Analog Board</h1>

<p>Next in the signal chain, the output received in the digital mixer is converted to 10MHz/1-bit audio.  This means
the audio can be represented by a pulse width modulated square wave.  A PWM waveform is literally only ever on
or off, hence the 1-bit depth, but it can be used to represent any fractional voltage between 0GND and whatever
is your high voltage.  For example if you attach an LED to a PWM output and the square wave is at 100% duty cycle
it will shine the brightest it can, but if you alternate between turning it on and off for exactly half the time,
50% duty cycle, it will shine half as bright.  It is really turning on and off really fast, but that is imperceptable
to us most of the time.  Duty cycles from 0% to 100% can be created to represent the internal 8-bit digital 
values from 0-255, and in PWM form, the audio can be sent electrically to the filter board for processing.</p>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_07.jpg" alt="Digital Board" title="Digital Board" /></p>

<p>The filter board on my Shruthi-1 is a 4-pole ladder filter, which is essentially four 1-pole filters connected in
series.  The current is delayed in phase by 90° by each 1-pole component, usually caused by the reactance of a
capacitor in a simple RC filter, and I assume something similar must be going on here.  After going through
all four stages, the phase has gone around to 360°, and so is back where it started.  Variably mixing its output
back into the first pole’s input causes the sick resonance ladder filters are known for because the phase lines 
up again and reinforces frequencies in a loop at the filter’s cutoff frequency.</p>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_08.jpg" alt="Digital Board" title="Digital Board" /></p>

<p>Other synths using laddder filters are Moogs and the TB-303, though they are constructed differently.  The Shruthi
also let’s you use the output at 1,2, or 3 poles which affects the slope of the stop-band.  You can also use the
audio input in the back of the synth to apply the filter to whatever external sounds you want, provided you hold
the envelope open.</p>

<h2 id="building-it">Building it</h2>

<p>The kit was actually pretty easy to assemble, and I spent a few hours per day on it and had it done over a weekend.
Since I don’t have one of those fancy stands with clips to hold the boards for me, it was important to solder all
the components in order of height, which meant doing all the resistors first, etc.  That way when you flip it over
to solder the joint it will be held in place by resting on your work surface.</p>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_09.jpg" alt="Boards Connected" title="Boards Connected" /></p>

<p>I chose to do the filter board first, as it seemed like the hardest to do, but it was quite easy.  The digital board
was a little tricky with its LCD screen probably being the hardest part out of the whole project.  A found the case
kind of sucky, mine looked like it was cut out of the end of a huge piece of plastic, which had ugly green print on
some of it, luckily it was on the bottom, and it was missing a screw hole on the top face.</p>

<p>The 20 pins which connect the top and bottom boards are sort of haphhazardly connected, because they don’t reach
so well, but they are firmly together, even if not perfect, and I haven’t had a problem with it.</p>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_10.jpg" alt="Glowing In the Dark" title="Glowing in the Dark" /></p>

<h2 id="sound">Sound</h2>

<p>So far, I’ve found that the Shruthi-1 makes one crazy analog sounding bassline, so here is an example of the track
I wrote after I finished the build. :)  I used the Shruthi-1 for bass, and a few other parts here and there.</p>

<iframe width="100%" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/69901992&amp;auto_play=false&amp;hide_related=false&amp;show_comments=true&amp;show_user=true&amp;show_reposts=false&amp;visual=true"></iframe>

<h2 id="finished-pic">Finished Pic!</h2>

<p><img src="http://irkenkitties.com/images/shruthi/shruthi_11.jpg" alt="Finished and Working" title="Finished and Working" /></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recreating the Haskell List Part 6: The IO Monad]]></title>
    <link href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-6-the-io-monad/"/>
    <updated>2012-12-03T23:55:00-08:00</updated>
    <id>http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-6-the-io-monad</id>
    <content type="html"><![CDATA[<p>This is part 6 of a 6 part tutorial</p>

<h2 id="the-io-monad">The IO Monad</h2>

<p>In pure functional programming, all functions are supposed to be referentially
transparent, and that means that each time you call a function with the same
arguments, it should give you the exact same result.  When functions are
referentially transparent, you have a lot less worries about whether or not it
will always work correctly.</p>

<p>A mathematical function is never going to give you a different answer no matter
how many times you give it the same argument.  The reason for that is pretty
much that it cannot get any values from anywhere other than what you passed
it, so it can never be any different.</p>

<!-- more -->

<p>In an imperative programming language you could write a <code>sin(x)</code> function which
was completely evil and called <code>time()</code>, getting a value from somewhere besides
the <code>x</code> parameter.  If the time in seconds was even, it would add 1 to the result
it returns, and if not it wouldn’t.</p>

<p>This example is just plain evil, especially if every time you happen to test
the <code>sin()</code> function it happened to be an odd time in seconds, until one
important day a million astronauts burn to death in the depths of space because
it was run on an even second.  Silly example but that is the nature of many
bugs in the imperative programming world.</p>

<p>All of these problems involve IO.  If you say no functions can do any input
or output to the OS, then the problem is solved, except you can also never
interact with the program in any way.</p>

<p>The answer is to let some functions do IO, but do it inside a container called
the IO Monad from which you aren’t supposed to be able to escape.  The reason
you aren’t able to escape, is because the data constructor for IO is hidden
from use, by hiding it in the IO Module.  This means the type signature for
every function which does IO will be something like <code>main :: IO ()</code>.</p>

<p>Any function which calls another function that does IO, <code>getLine :: IO String</code>,
for example, must also return something wrapped in IO.  It can’t deconstruct
the return value from <code>getLine</code> into just a <code>String</code> using the IO data
constructor and return that.  It can pass the pure string to a pure function
though, by using bind.</p>

<p>Here is an example of doing IO to get a number to pass to the pure function sin.</p>

<h3 id="doing-some-io-in-the-io-monad">Doing some IO in the IO Monad</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="nf">getSin</span> <span class="ow">::</span> <span class="kt">IO</span> <span class="nb">()</span>
</span><span class="line"><span class="nf">getSin</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class="line">    <span class="n">valueStr</span> <span class="ow">&lt;-</span> <span class="n">getLine</span>
</span><span class="line">    <span class="kr">let</span> <span class="n">result</span> <span class="ow">=</span> <span class="n">sin</span> <span class="p">(</span><span class="n">read</span> <span class="n">valueStr</span> <span class="ow">::</span> <span class="kt">Float</span><span class="p">)</span>
</span><span class="line">    <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">&quot;sin(&quot;</span> <span class="o">++</span> <span class="n">valueStr</span> <span class="o">++</span> <span class="s">&quot;) = &quot;</span> <span class="o">++</span> <span class="p">(</span><span class="n">show</span> <span class="n">result</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This looks like imperative code, telling you which order to do things and
sharing the results of subsequent function calls.  <code>getLine</code> returns a type <code>IO String</code>,
remember this is like <code>Container String</code> from part 1.</p>

<p>The function <code>putStrLn</code> always returns <code>IO ()</code>, read IO null, and since it is the
last thing, that is returned from the entire function, as you would expect.</p>

<p>In reality, it is converted to this:</p>

<h3 id="explicitly-using-bind">Explicitly using bind</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="nf">getSin2</span> <span class="ow">::</span> <span class="kt">IO</span> <span class="nb">()</span>
</span><span class="line"><span class="nf">getSin2</span> <span class="ow">=</span>
</span><span class="line">    <span class="n">getLine</span> <span class="o">&gt;&gt;=</span>
</span><span class="line">        <span class="p">(</span><span class="nf">\</span><span class="n">valueStr</span> <span class="ow">-&gt;</span> <span class="kr">let</span> <span class="n">result</span> <span class="ow">=</span> <span class="n">sin</span> <span class="p">(</span><span class="n">read</span> <span class="n">valueStr</span> <span class="ow">::</span> <span class="kt">Float</span><span class="p">)</span> <span class="kr">in</span>
</span><span class="line">            <span class="n">putStrLn</span> <span class="o">$</span> <span class="s">&quot;sin(&quot;</span> <span class="o">++</span> <span class="n">valueStr</span> <span class="o">++</span> <span class="s">&quot;) = &quot;</span> <span class="o">++</span> <span class="p">(</span><span class="n">show</span> <span class="n">result</span><span class="p">))</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This is really one long expression, and not a recipe as it looks in do
notation.  Since haskell is lazy, it probably does not do any computation until
it reaches the <code>putStrLn</code> function, which I think is strict (evaluates it as soon as it sees it).</p>

<p>When <code>putStrLn</code> evaluates its argument it finds <code>valueStr</code> and finds that it
does’t have the value worked out yet.  It sees that it comes passed in through
the lambda and that forces it to call <code>getLine</code>, and the use enters their text.
Then it evaluates the let statement to find the result, has a complete
string, prints it out, and <code>putStrln</code> returns IO () from the lambda, and
according to the definition of bind, also returns <code>IO ()</code> from the bind
expression, and then the function <code>getSin2</code> itself.</p>

<ul>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-1/">Recreating the Haskell List Part 1</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-2-functors/">Recreating the Haskell List Part 2: Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-3-monoids/">Recreating the Haskell List Part 3: Monoids</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-4-applicative-functors/">Recreating the Haskell List Part 4: Applicative Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-5-monads/">Recreating the Haskell List Part 5: Monads</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-6-the-io-monad/">Recreating the Haskell List Part 6: The IO Monad</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recreating the Haskell List Part 5: Monads]]></title>
    <link href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-5-monads/"/>
    <updated>2012-12-03T23:55:00-08:00</updated>
    <id>http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-5-monads</id>
    <content type="html"><![CDATA[<p>This is part 5 of a 6 part tutorial</p>

<h2 id="monads">Monads</h2>

<p>The Haskell list type is also an instance of the <code>Monad</code> typeclass. There are four functions 
defined for a monad, but you only need to implement 2 of them: <code>&gt;&gt;=</code> (pronounced bind) and <code>return</code>.</p>

<h3 id="the-monad-typeclass">The Monad Typeclass</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">class</span> <span class="kt">Monad</span> <span class="n">m</span> <span class="kr">where</span>
</span><span class="line">    <span class="p">(</span><span class="o">&gt;&gt;=</span><span class="p">)</span> <span class="ow">::</span> <span class="n">m</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">m</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">m</span> <span class="n">b</span>
</span><span class="line">    <span class="p">(</span><span class="o">&gt;&gt;</span><span class="p">)</span> <span class="ow">::</span> <span class="n">m</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">m</span> <span class="n">b</span> <span class="ow">-&gt;</span> <span class="n">m</span> <span class="n">b</span>
</span><span class="line">    <span class="n">return</span> <span class="ow">::</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">m</span> <span class="n">a</span>
</span><span class="line">    <span class="n">fail</span> <span class="ow">::</span> <span class="kt">String</span> <span class="ow">-&gt;</span> <span class="n">m</span> <span class="n">a</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The easiest function is <code>return</code>.  It just wraps a value in the monad container, and it is exactly 
the same thing as <code>pure</code> from the Applicative class.  The bind function takes a monad holding a 
value of type <code>a</code>, and a function which can change an <code>a</code> into the same type of monad holding something of type <code>b</code>.</p>

<p>Before making <code>MyList</code> an instance of Monad, it might be easier to see what happens if we make 
something simpler like <code>Container</code> from part 1 an instance first.</p>

<h3 id="making-container-a-monad">Making Container a Monad</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">instance</span> <span class="kt">Monad</span> <span class="kt">Container</span> <span class="kr">where</span>
</span><span class="line">    <span class="p">(</span><span class="kt">Container</span> <span class="n">contents</span><span class="p">)</span> <span class="o">&gt;&gt;=</span> <span class="n">f</span> <span class="ow">=</span> <span class="n">f</span> <span class="n">contents</span>
</span><span class="line">    <span class="n">return</span> <span class="n">a</span> <span class="ow">=</span> <span class="kt">Container</span> <span class="n">a</span>
</span><span class="line"><span class="c1">-- binding a container to a function</span>
</span><span class="line"><span class="p">(</span><span class="kt">Container</span> <span class="mi">3</span><span class="p">)</span> <span class="o">&gt;&gt;=</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="ow">-&gt;</span> <span class="n">return</span> <span class="o">$</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="mi">5</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<!-- more -->

<p>The Container on the left hand side is a monad and holds a 3, the function
on the right hand side of bind always accepts one argument.  In this case the
implementation I wrote for bind just passes the inner value of Container to the
function.</p>

<p>The function we passed just adds 2 to the value and rewraps it using return. This implementation 
is the least exciting thing that a monad can do, because <code>Container</code> is now the identity monad.<br />
The identity monad performs just simple function application, and doesn’t employ any computational
strategy.  Making <code>MyList</code> into a monad is significantly more amazing.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">instance</span> <span class="kt">Monad</span> <span class="kt">MyList</span> <span class="kr">where</span>
</span><span class="line">    <span class="n">return</span> <span class="ow">=</span> <span class="n">pure</span>
</span><span class="line">    <span class="kt">Empty</span> <span class="o">&gt;&gt;=</span> <span class="kr">_</span> <span class="ow">=</span> <span class="kt">Empty</span>
</span><span class="line">    <span class="p">(</span><span class="kt">Cons</span> <span class="n">car</span> <span class="n">cdr</span><span class="p">)</span> <span class="o">&gt;&gt;=</span> <span class="n">f</span> <span class="ow">=</span> <span class="p">(</span><span class="n">f</span> <span class="n">car</span><span class="p">)</span> <span class="p">`</span><span class="n">mappend</span><span class="p">`</span> <span class="p">(</span><span class="n">cdr</span> <span class="o">&gt;&gt;=</span> <span class="n">f</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The above says that binding any function to an empty list just returns an empty list.  In the case
that we have list items, the head and tail of the list are pulled apart, the bound function is 
applied to the head of the list, and recursion is used to bind the function to the remaining
tail of the list.  These results are appended together using <code>mappend</code> from the <code>Monoid</code> typeclass, 
resulting in one list at the end.</p>

<p>Since the bound function <code>f</code> must return a wrapped value, each item it returns is a list with one 
item in it such as (Cons 1 Empty) or [1] where the item inside has been modified by the function.<br />
Then it appends all these lists into one list.</p>

<h3 id="simple-usage-of-bind">Simple usage of bind</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="c1">--  Just like fmap</span>
</span><span class="line"><span class="p">(</span><span class="kt">Cons</span> <span class="mi">1</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">2</span> <span class="kt">Empty</span><span class="p">))</span> <span class="o">&gt;&gt;=</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="ow">-&gt;</span> <span class="n">return</span> <span class="o">$</span> <span class="n">x</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Empty</span><span class="p">}}</span>
</span><span class="line"><span class="c1">--  Native list version</span>
</span><span class="line"><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span> <span class="o">&gt;&gt;=</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="ow">-&gt;</span> <span class="n">return</span> <span class="o">$</span> <span class="n">x</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This looks a lot like fmap, but the difference is that the function you apply has to return an 
already wrapped type, and so you can chain these together in an ever increasing closure, or enclosed 
scope inside lambdas.  This means that each new lambda closure brings its argument within scope of all the rest.</p>

<h3 id="nested-bind">Nested bind</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span> <span class="o">&gt;&gt;=</span>
</span><span class="line">    <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="ow">-&gt;</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span> <span class="o">&gt;&gt;=</span>
</span><span class="line">        <span class="p">(</span><span class="nf">\</span><span class="n">y</span> <span class="ow">-&gt;</span> <span class="p">[</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">]</span> <span class="o">&gt;&gt;=</span>
</span><span class="line">            <span class="p">(</span><span class="nf">\</span><span class="n">z</span> <span class="ow">-&gt;</span> <span class="n">return</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">))))</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">6</span><span class="p">)]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Because of the recursion in bind, this is basically 3 nested loops, giving you every combination of the 
3 lists.  The same thing will work on MyList, except it will look ugly for lack of pretty printing.</p>

<p>This is the basis for list comprehensions in languages like in Erlang, Python, and Haskell itself.  Haskell
provides 2 types of syntactic sugar for this, do-expressions for monads, and list comprehensions for the list
monad specifically.</p>

<h3 id="list-comprehension">List comprehension</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="p">[(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">)</span> <span class="o">|</span> <span class="n">x</span> <span class="ow">&lt;-</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">],</span> <span class="n">y</span> <span class="ow">&lt;-</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">],</span> <span class="n">z</span> <span class="ow">&lt;-</span> <span class="p">[</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">]]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">6</span><span class="p">)]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>In an imperative programming language you can write a list of things to do in a
function like a recipe.  When you make variables in a function scope
they are available to everything within that scope, but writing Haskell is not
like writing a todo list of what to do, and in what order, and carrying state
from one todo item to another.  It is like like declaring what something is in
one expression, and it doesn’t really let you say what order anything should be
evaluated.  Haskell evaluates things in the order that it needs to know the
value.</p>

<p>A monad can let you simulate sequence by nesting bind functions, because it
will cause evaluation in the order that you nest the bound functions.  It evaluates
in a specific order because nesting makes each closure rely on the value of the
previous outer closure.</p>

<p>It will also allow you to build scope that each function you bind can share, due to the
nested lambda expressions.</p>

<p>The people who created Haskell made something called a do-expression that is
syntactic sugar for monadic binding, and it sort of makes your code appear to
be an imperative programming language with sequence and imperative style scope.</p>

<h3 id="the-list-monad-with-do-notation">The List Monad with do-notation</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="nf">combos</span> <span class="ow">=</span> <span class="kr">do</span>
</span><span class="line">    <span class="n">x</span> <span class="ow">&lt;-</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span>
</span><span class="line">    <span class="n">y</span> <span class="ow">&lt;-</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span>
</span><span class="line">    <span class="n">z</span> <span class="ow">&lt;-</span> <span class="p">[</span><span class="mi">5</span><span class="p">,</span><span class="mi">6</span><span class="p">]</span>
</span><span class="line">    <span class="n">return</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">,</span><span class="n">z</span><span class="p">)</span>
</span><span class="line"><span class="nf">combos</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">6</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">),(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">6</span><span class="p">)]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<ul>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-1/">Recreating the Haskell List Part 1</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-2-functors/">Recreating the Haskell List Part 2: Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-3-monoids/">Recreating the Haskell List Part 3: Monoids</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-4-applicative-functors/">Recreating the Haskell List Part 4: Applicative Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-5-monads/">Recreating the Haskell List Part 5: Monads</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-6-the-io-monad/">Recreating the Haskell List Part 6: The IO Monad</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recreating the Haskell List Part 4: Applicative Functors]]></title>
    <link href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-4-applicative-functors/"/>
    <updated>2012-12-03T23:55:00-08:00</updated>
    <id>http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-4-applicative-functors</id>
    <content type="html"><![CDATA[<p>This is part 4 of a 6 part tutorial</p>

<h2 id="applicative-functors">Applicative Functors</h2>

<p>A Haskell list is also an Applicative Functor.  If we want to make <code>MyList</code> one too, we can 
look at the interface for the Applicative class, and implement the right functions.</p>

<h3 id="interface-for-the-applicative-typeclass">Interface for the Applicative Typeclass</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kt">:</span><span class="n">info</span> <span class="kt">Applicative</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kr">class</span> <span class="p">(</span><span class="kt">Functor</span> <span class="n">f</span><span class="p">)</span> <span class="ow">=&gt;</span> <span class="kt">Applicative</span> <span class="n">f</span> <span class="kr">where</span>
</span><span class="line">    <span class="n">pure</span> <span class="ow">::</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">a</span>
</span><span class="line">    <span class="p">(</span><span class="o">&lt;*&gt;</span><span class="p">)</span> <span class="ow">::</span> <span class="n">f</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So, it looks as though we need to implement the functions <code>pure</code> and <code>&lt;*&gt;</code> in order to be an 
instance of Applicative.  This also says that whatever is Applictaive has the prerequisite of 
also being a Functor.  The function <code>pure</code> must take any type <code>a</code> and wrap it in the container MyList.
This is also called lifting <code>a</code> into the Functor.  Implementing <code>pure</code> is easy enough, because it
is the same thing as our data constructor, <code>Cons</code>.</p>

<!-- more-->

<p>The function <code>&lt;*&gt;</code> has the type signature <code>(&lt;*&gt;) :: f (a -&gt; b) -&gt; f a -&gt; f b</code> and represents function
application for types that are wrapped in our data structure <code>f</code>, where the function is also wrapped in
the same data structure <code>f</code>.</p>

<p>Functions that represent applying functions is sort of weird concept, but I can think of three functions
offhand that do accomplish this in different ways.  The three are: <code>$</code>, <code>&lt;$&gt;</code>, and <code>&lt;*&gt;</code>, so let’s look
at their type signatures.</p>

<h3 id="function-application">Function Application</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="p">(</span><span class="o">$</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">(</span><span class="o">$</span><span class="p">)</span> <span class="ow">::</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span>
</span><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="p">(</span><span class="o">&lt;$&gt;</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">(</span><span class="o">&lt;$&gt;</span><span class="p">)</span> <span class="ow">::</span> <span class="p">(</span><span class="kt">Functor</span> <span class="n">f</span><span class="p">)</span> <span class="ow">=&gt;</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</span><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="p">(</span><span class="o">&lt;*&gt;</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">(</span><span class="o">&lt;*&gt;</span><span class="p">)</span> <span class="ow">::</span> <span class="p">(</span><span class="kt">Applicative</span> <span class="n">f</span><span class="p">)</span> <span class="ow">=&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>$</code> function takes a function <code>(a -&gt; b)</code> and applies to an <code>a</code>, not surprisingly
giving you a <code>b</code>.  This is regular function application like <code>odd 3</code> returning
True.  Here I show different ways to use <code>$</code>, implicitly, explicitly, and infix.</p>

<h3 id="functon-application-using-">Functon application using $</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="nf">odd</span> <span class="mi">3</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">True</span>
</span><span class="line"><span class="p">(</span><span class="o">$</span><span class="p">)</span> <span class="n">odd</span> <span class="mi">3</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">True</span>
</span><span class="line"><span class="nf">odd</span> <span class="o">$</span> <span class="mi">3</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">True</span>
</span><span class="line"><span class="c1">--  Precedence issue here</span>
</span><span class="line"><span class="c1">--  Haskell parses this as (Container 2) + 1</span>
</span><span class="line"><span class="kt">Container</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="o">&lt;</span><span class="n">interactive</span><span class="o">&gt;:</span><span class="mi">1</span><span class="kt">:</span><span class="mi">0</span><span class="kt">:</span>
</span><span class="line">    <span class="kt">No</span> <span class="kr">instance</span> <span class="n">for</span> <span class="p">(</span><span class="kt">Num</span> <span class="p">(</span><span class="kt">Container</span> <span class="n">t</span><span class="p">))</span>
</span><span class="line">        <span class="n">arising</span> <span class="n">from</span> <span class="n">a</span> <span class="n">use</span> <span class="kr">of</span> <span class="p">`</span><span class="o">+</span><span class="n">&#39;</span> <span class="n">at</span> <span class="o">&lt;</span><span class="n">interactive</span><span class="o">&gt;:</span><span class="mi">1</span><span class="kt">:</span><span class="mi">0</span><span class="o">-</span><span class="mi">14</span>
</span><span class="line">    <span class="kt">Possible</span> <span class="n">fix</span><span class="kt">:</span> <span class="n">add</span> <span class="n">an</span> <span class="kr">instance</span> <span class="n">declaration</span> <span class="n">for</span> <span class="p">(</span><span class="kt">Num</span> <span class="p">(</span><span class="kt">Container</span> <span class="n">t</span><span class="p">))</span>
</span><span class="line">        <span class="kt">In</span> <span class="n">the</span> <span class="n">expression</span><span class="kt">:</span> <span class="kt">Container</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line">        <span class="kt">In</span> <span class="n">the</span> <span class="n">definition</span> <span class="kr">of</span> <span class="p">`</span><span class="n">it&#39;</span><span class="kt">:</span> <span class="n">it</span> <span class="ow">=</span> <span class="kt">Container</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line"><span class="c1">--  Ways to fix this</span>
</span><span class="line"><span class="kt">Container</span> <span class="p">(</span><span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="mi">3</span>
</span><span class="line"><span class="kt">Container</span> <span class="o">$</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="mi">3</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>People generally use <code>$</code> when they want to change the precedence of an expression
without using a lot of parenthesis.</p>

<p>Look at the type signature of <code>&lt;$&gt;</code>, and the one for <code>fmap</code>.</p>

<h3 id="type-signatures-of--and-fmap">Type signatures of &lt;$&gt; and fmap</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="p">(</span><span class="o">&lt;$&gt;</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">(</span><span class="o">&lt;$&gt;</span><span class="p">)</span> <span class="ow">::</span> <span class="p">(</span><span class="kt">Functor</span> <span class="n">f</span><span class="p">)</span> <span class="ow">=&gt;</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</span><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="n">fmap</span>
</span><span class="line"><span class="ow">=&gt;</span>  <span class="n">fmap</span> <span class="ow">::</span> <span class="p">(</span><span class="kt">Functor</span> <span class="n">f</span><span class="p">)</span> <span class="ow">=&gt;</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The function <code>&lt;$&gt;</code> <em>is</em> <code>fmap</code>.  It is applying a function to the Functor <code>f a</code>
producing <code>f b</code>.  The angle brackets around the $ are indicating that this is
application inside a container.  This is called lifting the normal function <code>(a -&gt; b)</code> 
into the Functor.  What if the function itself is wrapped inside a Functor container?</p>

<p>The answer is that function <code>&lt;*&gt;</code> is used instead.  Why wrap a function in a container to
apply it to some value in the same type of container?  Why not just not have
anything in containers at all?  Remember that a list is a container and check
this out:</p>

<h3 id="the--function">The &lt;*&gt; function</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="c1">-- Type signature</span>
</span><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="p">(</span><span class="o">&lt;*&gt;</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">(</span><span class="o">&lt;*&gt;</span><span class="p">)</span> <span class="ow">::</span> <span class="p">(</span><span class="kt">Applicative</span> <span class="n">f</span><span class="p">)</span> <span class="ow">=&gt;</span> <span class="n">f</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</span><span class="line"><span class="c1">--  Applying a list of functions to a list of numbers</span>
</span><span class="line"><span class="p">[(</span><span class="o">+</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="o">*</span><span class="mi">2</span><span class="p">)]</span> <span class="o">&lt;*&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">6</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Since lists are applicative functors, you may combine a list of functions to a list of 
values and have it do the obvious thing, apply everything to everything, and then either <code>mconcat</code> or <code>mappend</code> 
the results into a single flat list.  This just happens to be how <code>&lt;*&gt;</code> is implemented for a Haskell 
list, because it is really the only way that makes sense to implement it.</p>

<h3 id="making-mylist-an-instance-of-applicative">Making MyList an Instance of Applicative</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">instance</span> <span class="kt">Applicative</span> <span class="kt">MyList</span> <span class="kr">where</span>
</span><span class="line">    <span class="n">pure</span> <span class="n">a</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="n">a</span> <span class="kt">Empty</span>  <span class="c1">-- like [a] for lists</span>
</span><span class="line">    <span class="kt">Empty</span> <span class="o">&lt;*&gt;</span> <span class="n">m</span> <span class="ow">=</span> <span class="kt">Empty</span>
</span><span class="line">    <span class="p">(</span><span class="kt">Cons</span> <span class="n">f</span> <span class="n">cdr</span><span class="p">)</span> <span class="o">&lt;*&gt;</span> <span class="n">m</span> <span class="ow">=</span> <span class="p">(</span><span class="n">fmap</span> <span class="n">f</span> <span class="n">m</span><span class="p">)</span> <span class="p">`</span><span class="n">mappend</span><span class="p">`</span> <span class="p">(</span><span class="n">cdr</span> <span class="o">&lt;*&gt;</span> <span class="n">m</span><span class="p">)</span>
</span><span class="line"><span class="c1">--  Make a list</span>
</span><span class="line"><span class="kr">let</span> <span class="n">list</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="mi">1</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">2</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">3</span> <span class="kt">Empty</span><span class="p">))</span>
</span><span class="line"><span class="c1">--  Make a list of functions</span>
</span><span class="line"><span class="kr">let</span> <span class="n">functions</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">(</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="p">(</span><span class="kt">Cons</span> <span class="p">(</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span> <span class="kt">Empty</span><span class="p">)</span>
</span><span class="line"><span class="c1">-- We get the same result with MyList</span>
</span><span class="line"><span class="nf">functions</span> <span class="o">&lt;*&gt;</span> <span class="n">list</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">5</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span>
</span><span class="line">   <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Empty</span><span class="p">}}}}}}</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The definition of <code>&lt;*&gt;</code> is just building on <code>fmap</code> and <code>mappend</code>.  Which is neat and shows how all 
of these things are related.  For a list, <code>&lt;*&gt;</code> just maps each function over each item in the 
list like a nested loop, and appends them together into one list.</p>

<ul>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-1/">Recreating the Haskell List Part 1</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-2-functors/">Recreating the Haskell List Part 2: Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-3-monoids/">Recreating the Haskell List Part 3: Monoids</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-4-applicative-functors/">Recreating the Haskell List Part 4: Applicative Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-5-monads/">Recreating the Haskell List Part 5: Monads</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-6-the-io-monad/">Recreating the Haskell List Part 6: The IO Monad</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recreating the Haskell List Part 3: Monoids]]></title>
    <link href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-3-monoids/"/>
    <updated>2012-12-03T23:55:00-08:00</updated>
    <id>http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-3-monoids</id>
    <content type="html"><![CDATA[<p>This is part 3 of a 6 part tutorial</p>

<h2 id="monoids">Monoids</h2>

<p>It turns out that cons lists can be more than just a Functor, it can be a Monoid.  A Monoid is
a object with a single associative binary operation, and an identity element.  This means that 
things like addition and multiplication form a monoid.</p>

<p>The identity element for addition is the number $0$, because $x + 0 = x$.  An identity element and any
other element, when operated on by the single associative binary operation, is one that does not
change the other element.  Basically you can add $0$ to any number and you just get the same number.
The identity element for multiplication is $1$, because $x \cdot 1 = x$ for every number.</p>

<p>The binary operation should be one which can combine two of the objects, and for a list that happens to be
appending them using the function <code>++</code>.</p>

<p><code>[1, 2, 3] ++ [4, 5, 6] == [1, 2, 3, 4, 5, 6]</code>  Easy enough, so that means the identity element, the
element you can combine with a list that will return the same list is: <code>[]</code>, the empty list.  <code>[1, 2] ++ [] == [1, 2]</code></p>

<p>The ghci command <code>:info</code> shows that to be an instance of a monoid you must implement the functions
<code>mempty</code> which returns the identity element, and either <code>mappend</code> or <code>mconcat</code>.  Typeclasses can
sometimes have default implementations for some functions, and it’s often the case that two functions 
are actually defined by default in terms of one another, meaning you only have to implement one of them
and the other will automatically work.  Here <code>mappend</code> and <code>mconcat</code> are defined in terms of each other
so we just decide to implement the easier of the two, <code>mappend</code></p>

<p>Looking at the type signatures below we can see <code>mappend :: a -&gt; a -&gt; a</code>,  where in our case <code>a</code> will
be the type <code>MyList</code>.  This means <code>mappend</code> receives two lists and returns a third in which they are 
combined.  For addition this would have been receiving two numbers that need to be combined, but for
a list it just means to stick them together end to end.</p>

<!-- more -->

<h3 id="making-mylist-a-monoid">Making MyList a Monoid</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">import</span> <span class="nn">Data.Monoid</span>
</span><span class="line"><span class="kt">:</span><span class="n">info</span> <span class="kt">Monoid</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kr">class</span> <span class="kt">Monoid</span> <span class="n">a</span> <span class="kr">where</span>
</span><span class="line">    <span class="n">mempty</span> <span class="ow">::</span> <span class="n">a</span>
</span><span class="line">    <span class="n">mappend</span> <span class="ow">::</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">a</span>
</span><span class="line">    <span class="n">mconcat</span> <span class="ow">::</span> <span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="ow">-&gt;</span> <span class="n">a</span>
</span><span class="line"><span class="kr">instance</span> <span class="kt">Monoid</span> <span class="p">(</span><span class="kt">MyList</span> <span class="n">b</span><span class="p">)</span> <span class="kr">where</span>
</span><span class="line">    <span class="n">mempty</span> <span class="ow">=</span> <span class="kt">Empty</span>
</span><span class="line">    <span class="n">mappend</span> <span class="n">xs</span> <span class="kt">Empty</span> <span class="ow">=</span> <span class="n">xs</span>
</span><span class="line">    <span class="n">mappend</span> <span class="kt">Empty</span> <span class="n">ys</span> <span class="ow">=</span> <span class="n">mappend</span> <span class="n">ys</span> <span class="kt">Empty</span>
</span><span class="line">    <span class="n">mappend</span> <span class="p">(</span><span class="kt">Cons</span> <span class="n">x</span> <span class="n">xs</span><span class="p">)</span> <span class="n">ys</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="n">x</span> <span class="o">$</span> <span class="n">mappend</span> <span class="n">xs</span> <span class="n">ys</span>
</span><span class="line"><span class="kr">let</span> <span class="n">list1</span> <span class="ow">=</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">1</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">2</span> <span class="kt">Empty</span><span class="p">))</span>
</span><span class="line"><span class="kr">let</span> <span class="n">list2</span> <span class="ow">=</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">3</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">4</span> <span class="kt">Empty</span><span class="p">))</span>
</span><span class="line"><span class="nf">list1</span> <span class="p">`</span><span class="n">mappend</span><span class="p">`</span> <span class="n">list2</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Empty</span><span class="p">}}}}</span>
</span><span class="line"><span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span> <span class="p">`</span><span class="n">mappend</span><span class="p">`</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]</span>
</span><span class="line"><span class="c1">-- mconcat is similar but it flattens a list of lists</span>
</span><span class="line"><span class="nf">mconcat</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Having MyList be an instance of Monoid makes it easier to write the implementation for the 
Applicative type-class, because <code>mappend</code> is used in its implementation.</p>

<ul>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-1/">Recreating the Haskell List Part 1</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-2-functors/">Recreating the Haskell List Part 2: Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-3-monoids/">Recreating the Haskell List Part 3: Monoids</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-4-applicative-functors/">Recreating the Haskell List Part 4: Applicative Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-5-monads/">Recreating the Haskell List Part 5: Monads</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-6-the-io-monad/">Recreating the Haskell List Part 6: The IO Monad</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recreating the Haskell List Part 2: Functors]]></title>
    <link href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-2-functors/"/>
    <updated>2012-12-03T23:54:00-08:00</updated>
    <id>http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-2-functors</id>
    <content type="html"><![CDATA[<p>This is part 2 of a 6 part tutorial</p>

<h2 id="functors">Functors</h2>

<p>How can we modify or transform a value or values that are contained in a data structure such as <code>Container</code>? Let’s
say we have a <code>Container</code> holding the integer 4, and we want to add 1 to it.  The problem is that
a <code>Container</code> doesn’t have addition defined for it, and really, it shouldn’t considering that any possible
type could be stored inside it, any number of which have no meaningful way to respond to addition.</p>

<p>Let’s look at a similar situation in C++:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="c++"><span class="line"><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span>
</span><span class="line"><span class="k">class</span> <span class="nc">Container</span> <span class="p">{</span>
</span><span class="line">   <span class="n">T</span> <span class="n">_value</span><span class="p">;</span>
</span><span class="line">   <span class="k">public</span><span class="o">:</span>
</span><span class="line">   <span class="n">Container</span><span class="p">(</span><span class="n">T</span> <span class="n">value</span><span class="p">)</span> <span class="o">:</span> <span class="n">_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class="line">   <span class="n">T</span> <span class="n">get_value</span><span class="p">()</span> <span class="p">{</span>
</span><span class="line">       <span class="k">return</span> <span class="n">_value</span><span class="p">;</span>
</span><span class="line">   <span class="p">}</span>
</span><span class="line">   <span class="kt">void</span> <span class="n">set_value</span><span class="p">(</span><span class="n">T</span> <span class="n">value</span><span class="p">){</span>
</span><span class="line">       <span class="n">_value</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
</span><span class="line">   <span class="p">}</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line"><span class="n">Container</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">container</span> <span class="o">=</span> <span class="n">Container</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>
</span><span class="line"><span class="c1">//  Of course, you can&#39;t do this to transform the value inside</span>
</span><span class="line"><span class="n">container</span> <span class="o">=</span> <span class="n">container</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line"><span class="c1">//  You must remove it, apply the transformation and put it back</span>
</span><span class="line"><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="n">container</span><span class="p">.</span><span class="n">get_value</span><span class="p">();</span>
</span><span class="line"><span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line"><span class="n">container</span><span class="p">.</span><span class="n">set_value</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The extreme generality of this C++ class means that it would be a mistake to define <code>operator+</code> on
it, as any number of types <code>T</code> also cannot meaningfully respond to addition.  Now we find ourselves
in a similar situation in Haskell:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">let</span> <span class="n">container</span> <span class="ow">=</span> <span class="kt">Container</span> <span class="mi">4</span>
</span><span class="line"><span class="kr">let</span> <span class="n">container&#39;</span> <span class="ow">=</span> <span class="n">container</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line"><span class="o">&lt;</span><span class="n">interactive</span><span class="o">&gt;:</span><span class="mi">3</span><span class="kt">:</span><span class="mi">28</span><span class="kt">:</span>
</span><span class="line">    <span class="kt">No</span> <span class="kr">instance</span> <span class="n">for</span> <span class="p">(</span><span class="kt">Num</span> <span class="p">(</span><span class="kt">Container</span> <span class="kt">Integer</span><span class="p">))</span>
</span><span class="line">        <span class="n">arising</span> <span class="n">from</span> <span class="n">a</span> <span class="n">use</span> <span class="kr">of</span> <span class="p">`</span><span class="o">+</span><span class="n">&#39;</span>
</span><span class="line">    <span class="kt">Possible</span> <span class="n">fix</span><span class="kt">:</span>
</span><span class="line">        <span class="n">add</span> <span class="n">an</span> <span class="kr">instance</span> <span class="n">declaration</span> <span class="n">for</span> <span class="p">(</span><span class="kt">Num</span> <span class="p">(</span><span class="kt">Container</span> <span class="kt">Integer</span><span class="p">))</span>
</span><span class="line">    <span class="kt">In</span> <span class="n">the</span> <span class="n">expression</span><span class="kt">:</span> <span class="n">container</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class="line">    <span class="kt">In</span> <span class="n">an</span> <span class="n">equation</span> <span class="n">for</span> <span class="n">container&#39;</span><span class="kt">:</span> <span class="n">container&#39;</span> <span class="ow">=</span> <span class="n">container</span> <span class="o">+</span> <span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<!-- more -->

<p>Haskell has an elegant solution to this problem called a Functor.  Ghci is able to print out the full 
interface for any typeclass with the <code>:info</code> command so let’s see what interface is required for a 
data type to become an instance of the <code>Functor</code> typeclass:</p>

<h3 id="using-ghcis-info-command">Using ghci’s :info command</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kt">:</span><span class="n">info</span> <span class="kt">Functor</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kr">class</span> <span class="kt">Functor</span> <span class="n">f</span> <span class="kr">where</span>
</span><span class="line">      <span class="n">fmap</span> <span class="ow">::</span> <span class="p">(</span><span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">b</span><span class="p">)</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="n">f</span> <span class="n">b</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This says there is a class named <code>Functor</code>, its instances will be referred to as <code>f</code>.  Instances must define a 
function called <code>fmap</code>.  The first parameter of <code>fmap</code>, is <code>(a -&gt; b)</code>. This means the first parameter is a 
function which accepts something of type <code>a</code>, and returns something of a possibly different type <code>b</code>.</p>

<p>The second parameter <code>f a</code> is a functor (such as <code>Container</code>) wrapping a type <code>a</code>.  The last thing in a type signature is the 
return value.  It returns <code>f b</code>, which means it returns the same sort of datatype, (Such as <code>Container</code>) wrapping something of type <code>b</code>.</p>

<p>That can be somewhat difficult to follow at first, but what it is essentially asking you to implement is
a way to take the data out of the data structure, apply a transformation function to it, and then put it back 
in the data structure.  Let’s make <code>Container</code> an instance of <code>Functor</code>.</p>

<h3 id="making-container-an-instance-of-functor">Making Container an Instance of Functor</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">instance</span> <span class="kt">Functor</span> <span class="kt">Container</span> <span class="kr">where</span>
</span><span class="line">    <span class="n">fmap</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Container</span> <span class="n">contents</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">Container</span> <span class="p">(</span><span class="n">f</span> <span class="n">contents</span><span class="p">)</span>
</span><span class="line"><span class="kr">let</span> <span class="n">container</span> <span class="ow">=</span> <span class="kt">Container</span> <span class="mi">4</span>
</span><span class="line"><span class="nf">container</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="mi">4</span>
</span><span class="line"><span class="nf">fmap</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="ow">-&gt;</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="n">container</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="mi">5</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>In the function fmap above, on the left hand side of the declaration, we are using Haskell’s pattern matching 
feature to deconstruct the container and remove the value from it.  When called <code>fmap f (Container contents) =</code> 
binds the function <code>(\x -&gt; x + 1)</code> to <code>f</code>, and in this case the integer <code>4</code> to <code>contents</code>.</p>

<p>This is because during pattern matching, the data constructor function <code>Container</code> acts to deconstruct the data
type into its components.  Later we’ll see data types that contain more than one value and see that it can be
used to access any number of data members.  Haskell is all about composite data structures and wrapping and
unwrapping the components inside them to do work.</p>

<p>On the right hand side of <code>fmap</code> the <code>Container</code> data constructor is again used to wrap up this value, but it
is first transformed by the function <code>f</code>.  We get the effect of being able to send any function inside the
container to be applied to its inner value.</p>

<p>You might be wondering, why wrap this integer in a data structure at all if it just makes it annoying to work
on it?  The answer is that unless you want to isolate a value or restrict operations that can be performed on
it, you probably wouldn’t want to do this if it only held one value.  This type of isolation is used in Haskell
to separate functions that work with IO and side effects from pure functional code.  The IO Monad hides
its data constructor so that you cannot create anything of type IO in ‘pure’ code, and you can’t deconstruct 
an IO and get its values out.  This causes you to always need to work with ‘impure’ IO stuff by sending functions
into or declaring them inside the IO container, and also serves as a marker for impurity.</p>

<p>The Maybe Monad is another type that can still do something interesting while wrapping only one value, but let’s
see an example of a functor working on multiple values first, a list!</p>

<h2 id="a-linked-list-as-a-functor">A Linked List as a Functor</h2>

<p>The native list type in Haskell is a linked list, and it is also a functor.  Let’s reimplement it from scratch
so that we can see how it works.  In functional languages a linked list is often called a Cons List, and is
a recursive data structure formed by cons cells in which each cell contains two elements, the first element
is called the head or car, and is one value in the list, and the second is called the tail or cdr (pronounced kooder) 
and is another Cons Cell, which in turn holds one value and another cons cell and so on.</p>

<p>The terms cons, car, and cdr come from Lisp, and they are the three main functions used in that language to work
with lists.  Cons constructs a list, car returns the head of the list, and cdr returns the tail of the list.<br />
In haskell, the car and cdr functions for lists are actually just named <code>head</code> and <code>tail</code>, but I am using 
the Lisp-named version here to avoid us getting confused by <code>head</code> and <code>tail</code> already defined in the ghci Prelude’s
namespace.</p>

<h3 id="a-cons-list">A Cons List</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">data</span> <span class="kt">MyList</span> <span class="n">a</span> <span class="ow">=</span>
</span><span class="line">    <span class="kt">Empty</span> <span class="o">|</span>
</span><span class="line">    <span class="kt">Cons</span> <span class="p">{</span>
</span><span class="line">        <span class="n">car</span> <span class="ow">::</span> <span class="n">a</span><span class="p">,</span>
</span><span class="line">        <span class="n">cdr</span> <span class="ow">::</span> <span class="kt">MyList</span> <span class="n">a</span>
</span><span class="line">    <span class="p">}</span> <span class="kr">deriving</span><span class="p">(</span><span class="kt">Show</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Above we define a type <code>MyList</code> to hold a parameterized “variable” type <code>a</code>.  This time you can see that there
are two data constructors, and that they don’t have to have the same name as the type itself as we chose in
the definition of <code>Container</code>.  Empty is the data constructor for constructing an empty list, and Cons is 
a data constructor of two arguments.  This could have been written <code>data MyList a = Empty | Cons a (MyList a) deriving(Show)</code>
but what we’ve used here is called record syntax.</p>

<p>You can see the first argument to Cons is something of type <code>a</code>, and the second is of type <code>MyList a</code>, record
syntax gives names to each argument, and also provides accessor functions by the same name to get at 
each data member.  This is a recursive data structure because <code>MyList</code> itelf is used on the right hand side
of the definition.  Let’s play with this for a moment, and construct some lists.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="c1">--  An empty list</span>
</span><span class="line"><span class="kt">Empty</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Empty</span>
</span><span class="line"><span class="c1">--  A list with one item in it</span>
</span><span class="line"><span class="kt">Cons</span> <span class="mi">1</span> <span class="kt">Empty</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Empty</span><span class="p">}</span>
</span><span class="line"><span class="c1">--  A list with three items in it</span>
</span><span class="line"><span class="kr">let</span> <span class="n">list</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="mi">1</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">2</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">3</span> <span class="kt">Empty</span><span class="p">))</span>
</span><span class="line"><span class="nf">list</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Empty</span><span class="p">}}}</span>
</span><span class="line"><span class="c1">--  Using the functions provided by record syntax</span>
</span><span class="line"><span class="nf">car</span> <span class="n">list</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="mi">1</span>
</span><span class="line"><span class="nf">cdr</span> <span class="n">list</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">3</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Empty</span><span class="p">}}</span>
</span><span class="line"><span class="nf">car</span> <span class="p">(</span><span class="n">cdr</span> <span class="n">list</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="mi">2</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>A similar C++ class might look like this:</p>

<h3 id="quick-c-linked-list">Quick C++ linked list</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
</pre></td><td class="code"><pre><code class="c++"><span class="line"><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span>
</span><span class="line"><span class="k">class</span> <span class="nc">Cons</span> <span class="p">{</span>
</span><span class="line">    <span class="n">T</span> <span class="n">_car</span><span class="p">;</span>
</span><span class="line">    <span class="n">Cons</span> <span class="o">*</span><span class="n">_cdr</span><span class="p">;</span>
</span><span class="line">    <span class="k">public</span><span class="o">:</span>
</span><span class="line">    <span class="n">Cons</span><span class="p">(</span><span class="n">T</span> <span class="n">car</span><span class="p">,</span> <span class="n">Cons</span> <span class="o">*</span><span class="n">cdr</span><span class="p">)</span> <span class="o">:</span>
</span><span class="line">        <span class="n">_car</span><span class="p">(</span><span class="n">car</span><span class="p">),</span>
</span><span class="line">        <span class="n">_cdr</span><span class="p">(</span><span class="n">cdr</span><span class="p">)</span> <span class="p">{}</span>
</span><span class="line">    <span class="kt">void</span> <span class="n">show</span><span class="p">(){</span>
</span><span class="line">        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">_car</span> <span class="o">&lt;&lt;</span> <span class="s">&quot; &quot;</span><span class="p">;</span>
</span><span class="line">        <span class="k">if</span><span class="p">(</span><span class="n">_cdr</span><span class="p">){</span>
</span><span class="line">            <span class="n">_cdr</span><span class="o">-&gt;</span><span class="n">show</span><span class="p">();</span>
</span><span class="line">        <span class="p">}</span>
</span><span class="line">    <span class="p">}</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line"><span class="k">typedef</span> <span class="n">Cons</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">ConsInt</span><span class="p">;</span>
</span><span class="line"><span class="n">ConsInt</span> <span class="n">list</span> <span class="o">=</span> <span class="n">ConsInt</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="k">new</span> <span class="n">ConsInt</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="k">new</span> <span class="n">ConsInt</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)));</span>
</span><span class="line"><span class="n">list</span><span class="p">.</span><span class="n">show</span><span class="p">();</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">1</span> <span class="mi">2</span> <span class="mi">3</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Haskell itself has a builtin list data type with some syntactic sugar.  The haskell
equivalent of the Cons data constructor is <code>:</code>, the Empty data constructor is <code>[]</code>,
while <code>car</code> and <code>cdr</code> are <code>head</code> and <code>tail</code>.  Haskell lists also have a pretty show function
defined for them.</p>

<h3 id="built-in-list-type">Built in List type</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="c1">--  An empty list</span>
</span><span class="line"><span class="kt">[]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">[]</span>
</span><span class="line"><span class="c1">--  A list with one item in it</span>
</span><span class="line"><span class="mi">1</span> <span class="kt">:</span> <span class="kt">[]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span class="line"><span class="c1">--  Syntactic Sugar</span>
</span><span class="line"><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span><span class="line"><span class="c1">--  A list with three items in it</span>
</span><span class="line"><span class="kr">let</span> <span class="n">list</span> <span class="ow">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span><span class="line"><span class="nf">list</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span><span class="line"><span class="c1">--  Using the functions provided List</span>
</span><span class="line"><span class="nf">head</span> <span class="n">list</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="mi">1</span>
</span><span class="line"><span class="nf">tail</span> <span class="n">list</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span><span class="line"><span class="nf">head</span> <span class="p">(</span><span class="n">tail</span> <span class="n">list</span><span class="p">)</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="mi">2</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>So <code>MyList</code> is now a perfectly functioning linked list, but one thing it is missing over the 
builtin list type is the fact that it is not yet an instance of <code>Functor</code>, but we can fix that.</p>

<p>Before, with <code>Container</code> the idea behind <code>fmap</code> was to unwrap a value, apply a given function to
it and wrap it back up again, and here the only difference is that there are two data members in a cons 
cell; the value, and another cons cell.  The recursive nature of a cons list gives us a clue that 
<code>fmap</code> will also be recursive.  We’re going to apply the given function to the value in the cell,
and then call fmap again on the cons cell containing the rest of the list so that each of its values
will be transformed as well.</p>

<h3 id="mylist-becomes-a-functor">MyList becomes a Functor</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">instance</span> <span class="kt">Functor</span> <span class="kt">MyList</span> <span class="kr">where</span>
</span><span class="line">    <span class="n">fmap</span> <span class="kr">_</span> <span class="kt">Empty</span> <span class="ow">=</span> <span class="kt">Empty</span>
</span><span class="line">    <span class="n">fmap</span> <span class="n">f</span> <span class="p">(</span><span class="kt">Cons</span> <span class="n">x</span> <span class="n">xs</span><span class="p">)</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">(</span><span class="n">f</span> <span class="n">x</span><span class="p">)</span> <span class="p">(</span><span class="n">fmap</span> <span class="n">f</span> <span class="n">xs</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Here <code>fmap</code> is defined twice.  Again we can see data constructors on the left hand side being used
to deconstruct our list for pattern matching.  If we try to fmap an empty list the first declaration
is matched and chosen, the function argument itself is thrown away and and Empty list is constructed
and returned.  Fmapping an empty list is an empty list.</p>

<p>If a cons cell is matched, the data constructor <code>Cons</code> is used to deconstruct the cell and bind its
two values to <code>x</code> and <code>xs</code>.  <code>xs</code> as in the plural of <code>x</code>  What this does is separates the head of the
list from the rest of it, you perform an operation on the head and send the rest for processing by
recalling the function recursively.  This is a common pattern you’ll see when writing recursive functions.</p>

<p>The base case is encountering the Empty cell at the end of the list, which stops the recursion.  The 
function only knows how to handle one element at a time, and relegates the rest of the work to itself
during future calls, and so on until it meets the base case and stops.</p>

<h3 id="transforming-a-whole-list">Transforming a whole list</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">let</span> <span class="n">list</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="mi">1</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">2</span> <span class="p">(</span><span class="kt">Cons</span> <span class="mi">3</span> <span class="kt">Empty</span><span class="p">))</span>
</span><span class="line"><span class="nf">fmap</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="ow">-&gt;</span> <span class="n">x</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> <span class="n">list</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">4</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Cons</span> <span class="p">{</span><span class="n">car</span> <span class="ow">=</span> <span class="mi">6</span><span class="p">,</span> <span class="n">cdr</span> <span class="ow">=</span> <span class="kt">Empty</span><span class="p">}}}</span>
</span><span class="line"><span class="c1">-- Same thing with the builtin list</span>
</span><span class="line"><span class="nf">fmap</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="ow">-&gt;</span> <span class="n">x</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">6</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>You’ve probably seen this before in other non-functional languages since many parts of the
functional paradigm are being adopted in imperative languages all the time.  Ruby and Python
both define <code>map</code> on their list types. Ruby passes a code block into its <code>map</code> method and 
that looks like this:</p>

<h3 id="rubys-map">Ruby’s map</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="o">].</span><span class="n">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span><span class="line">  <span class="n">x</span> <span class="o">*</span> <span class="mi">2</span>
</span><span class="line"><span class="k">end</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<ul>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-1/">Recreating the Haskell List Part 1</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-2-functors/">Recreating the Haskell List Part 2: Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-3-monoids/">Recreating the Haskell List Part 3: Monoids</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-4-applicative-functors/">Recreating the Haskell List Part 4: Applicative Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-5-monads/">Recreating the Haskell List Part 5: Monads</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-6-the-io-monad/">Recreating the Haskell List Part 6: The IO Monad</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Recreating the Haskell List Part 1]]></title>
    <link href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-1/"/>
    <updated>2012-12-03T23:54:00-08:00</updated>
    <id>http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-1</id>
    <content type="html"><![CDATA[<p>This is part 1 of a 6 part tutorial</p>

<h2 id="data-structures-as-containers">Data Structures as Containers</h2>

<p>In a language like C, you can think of data structures as containers which hold one or more objects.</p>

<h3 id="a-container">A Container</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
</pre></td><td class="code"><pre><code class="c"><span class="line"><span class="k">typedef</span> <span class="k">struct</span> <span class="kt">int_container_t</span> <span class="p">{</span>
</span><span class="line">    <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
</span><span class="line"><span class="p">}</span> <span class="kt">int_container_t</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The <code>int_container_t</code> type is now something which holds one int.  To make the same sort of data structure in Haskell you would
write:</p>

<h3 id="int-container-in-haskell">Int container in Haskell</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">data</span> <span class="kt">IntContainer</span> <span class="ow">=</span> <span class="kt">IntContainer</span> <span class="kt">Int</span> <span class="kr">deriving</span> <span class="kt">Show</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Ignoring for a moment the suffix <code>deriving Show</code>, this looks a lot like a function declaration, because that is essentially 
what it is.  The identifier <code>IntContainer</code> appears on both sides, but the two are actually in two different namespaces.  It is
not necessary for these two identifiers to have the same name, but people will often do this by convention.</p>

<p>The left hand side of this declaration names a new type <code>IntContainer</code>, and the right hand side is defining a data constructor
for this type, essentially a function named <code>IntContainer</code> which takes one <code>Int</code> as argument which it uses to create an instance of this type.</p>

<h3 id="using-the-data-constructor-in-ghci">Using the data constructor in ghci</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="c1">--  create an instance of IntContainer passing the value 4</span>
</span><span class="line"><span class="kt">IntContainer</span> <span class="mi">4</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">IntContainer</span> <span class="mi">4</span>
</span><span class="line"><span class="c1">--  Checking the type signature of the IntContainer data constructor function</span>
</span><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="kt">IntContainer</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">IntContainer</span> <span class="ow">::</span> <span class="kt">Int</span> <span class="ow">-&gt;</span> <span class="kt">IntContainer</span>
</span><span class="line"><span class="c1">--  checking the type of an instantiated IntContainer</span>
</span><span class="line"><span class="kr">let</span> <span class="n">i</span> <span class="ow">=</span> <span class="kt">IntContainer</span> <span class="mi">4</span>
</span><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="n">i</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="n">i</span> <span class="ow">::</span> <span class="kt">IntContainer</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>If I pass the data constructor a <code>4</code>, it returns something which is of type IntContainer.  The ghci command <code>:t</code> can be used
to get type information about just about anything in Haskell.  <code>IntContainer :: Int -&gt; IntContainer</code> is read “IntContainer is
a function which accepts an Int and returns an IntContainer”.  <code>i :: IntContainer</code> is read “i is of type IntContainer”.</p>

<!-- more -->

<h2 id="algebraic-type-system">Algebraic Type System</h2>

<p>In C++, we have a template system which allows us to create classes and methods where the types involved are variable.  If we
wanted to create a Container class in C++ which could hold not only an int but any type, we could write a class like this:</p>

<h3 id="c-templated-container">C++ Templated Container</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="c++"><span class="line"><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="o">&gt;</span>
</span><span class="line"><span class="k">class</span> <span class="nc">Container</span> <span class="p">{</span>
</span><span class="line">    <span class="n">T</span> <span class="n">_value</span><span class="p">;</span>
</span><span class="line">    <span class="k">public</span><span class="o">:</span>
</span><span class="line">    <span class="n">Container</span><span class="p">(</span><span class="n">T</span> <span class="n">value</span><span class="p">)</span> <span class="o">:</span> <span class="n">_value</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="p">{}</span>
</span><span class="line"><span class="p">};</span>
</span><span class="line"><span class="n">Container</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">container</span> <span class="o">=</span> <span class="n">Container</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">4</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Haskell has an algebraic type system which enables us to do what C++ does with its template system, but is far easier 
to use and debug.  Much of the simplicity comes from the lack of pointers in Haskell, and the fact that compound types
and functions are treated the same as primitives without needing to put much thought into copy constructors and memory management.</p>

<h3 id="haskell-container-which-can-contain-any-type">Haskell container which can contain any type</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
<span class="line-number">19</span>
<span class="line-number">20</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">data</span> <span class="kt">Container</span> <span class="n">t</span> <span class="ow">=</span> <span class="kt">Container</span> <span class="n">t</span> <span class="n">driving</span> <span class="kt">Show</span>
</span><span class="line"><span class="c1">--  ghci output</span>
</span><span class="line"><span class="kt">Container</span> <span class="mi">5</span>
</span><span class="line"><span class="ow">=&gt;</span>  <span class="kt">Container</span> <span class="mi">5</span>
</span><span class="line"><span class="kt">Container</span> <span class="mf">4.2</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="mf">4.2</span>
</span><span class="line"><span class="kt">Container</span> <span class="s">&quot;String&quot;</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="s">&quot;String&quot;</span>
</span><span class="line"><span class="kt">Container</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">]</span>
</span><span class="line"><span class="kr">let</span> <span class="n">x</span> <span class="ow">=</span> <span class="kt">Container</span> <span class="p">(</span><span class="nf">\</span><span class="n">x</span> <span class="ow">-&gt;</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span><span class="line"><span class="kt">:</span><span class="n">t</span> <span class="n">x</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="n">x</span> <span class="ow">::</span> <span class="kt">Container</span> <span class="p">(</span><span class="kt">Integer</span> <span class="ow">-&gt;</span> <span class="kt">Integer</span><span class="p">)</span>
</span><span class="line"><span class="nf">x</span>
</span><span class="line">  <span class="o">&lt;</span><span class="n">interactive</span><span class="o">&gt;:</span><span class="mi">1</span><span class="kt">:</span><span class="mi">0</span><span class="kt">:</span>
</span><span class="line">      <span class="kt">No</span> <span class="kr">instance</span> <span class="n">for</span> <span class="p">(</span><span class="kt">Show</span> <span class="p">(</span><span class="kt">Integer</span> <span class="ow">-&gt;</span> <span class="kt">Integer</span><span class="p">))</span>
</span><span class="line">      <span class="n">arising</span> <span class="n">from</span> <span class="n">a</span> <span class="n">use</span> <span class="kr">of</span> <span class="p">`</span><span class="n">print&#39;</span> <span class="n">at</span> <span class="o">&lt;</span><span class="n">interactive</span><span class="o">&gt;:</span><span class="mi">1</span><span class="kt">:</span><span class="mi">0</span>
</span><span class="line">      <span class="kt">Possible</span> <span class="n">fix</span><span class="kt">:</span>
</span><span class="line">      <span class="n">add</span> <span class="n">an</span> <span class="kr">instance</span> <span class="n">declaration</span> <span class="n">for</span> <span class="p">(</span><span class="kt">Show</span> <span class="p">(</span><span class="kt">Integer</span> <span class="ow">-&gt;</span> <span class="kt">Integer</span><span class="p">))</span>
</span><span class="line">      <span class="kt">In</span> <span class="n">a</span> <span class="n">stmt</span> <span class="kr">of</span> <span class="n">a</span> <span class="n">&#39;do&#39;</span> <span class="n">expression</span><span class="kt">:</span> <span class="n">print</span> <span class="n">it</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This time, the left hand side of the type declaration is parameterized with a variable type <code>t</code>, whereas 
in <code>IntContainer</code> it did not.  A type variable like <code>t</code> is a placeholder for a type, so on the right hand
side <code>t</code> can be replaced by any type, for example when you pass the data constructor a <code>String</code>, it is as
if you had declared <code>data Container = Container String deriving Show</code>.  In all, so far this is very much
like C++ templates.</p>

<p>In the above example it is shown this works with <code>Int</code>, <code>Float</code>, <code>String</code>, or even <code>[Int]</code> (a list of Ints).
It will even accept another function, as shown as I pass it the lambda <code>(\x -&gt; x + 1)</code>, because a function
is a typed value just like anything else.  This creates a value with the type signature <code>x :: Container (Integer -&gt; Integer)</code> 
meaning “x is a container holding a function which accepts an Integer and returns an Integer”.</p>

<p>Everything works fine until I type <code>x</code> and ghci’s read eval print loop tries to print a the function <code>(x -&gt; x + 1)</code>.
The other data types like <code>Int</code> and <code>String</code> have properly defined <code>Show</code> functions already, but a lambda 
does not have any meaningful way to display itself.  I have told Container to derive its show function 
where it is possible, but it was not possible when passed a lambda function, therefore we got an error.</p>

<h2 id="typeclasses-in-haskell">Typeclasses in Haskell</h2>

<p>A class in Haskell is not quite the same as in object oriented programming languages.  To define a class 
you essentially define only an interface, and it is not necessary to provide any implementation.  Any
type can be a member of a class if it declares that it supports the class’s interface.</p>

<p>Let’s define a funny example class:</p>

<h3 id="defining-a-class">Defining a class</h3>
<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="haskell"><span class="line"><span class="kr">class</span> <span class="kt">PikachuShow</span> <span class="n">a</span> <span class="kr">where</span>
</span><span class="line">  <span class="n">pikaShow</span> <span class="ow">::</span> <span class="n">a</span> <span class="ow">-&gt;</span> <span class="kt">String</span>
</span><span class="line"><span class="c1">--  Make Container an instance of PikaShow</span>
</span><span class="line"><span class="kr">instance</span> <span class="kt">PikachuShow</span> <span class="p">(</span><span class="kt">Container</span> <span class="n">t</span><span class="p">)</span> <span class="kr">where</span>
</span><span class="line">  <span class="n">pikaShow</span> <span class="kr">_</span> <span class="ow">=</span> <span class="s">&quot;Pika Pika!&quot;</span>
</span><span class="line"><span class="kr">let</span> <span class="n">x</span> <span class="ow">=</span> <span class="kt">Container</span> <span class="mi">1</span>
</span><span class="line"><span class="nf">x</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="kt">Container</span> <span class="mi">1</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="n">show</span> <span class="n">x</span>
</span><span class="line"><span class="kt">Container</span> <span class="mi">1</span>
</span><span class="line"><span class="nf">pikaShow</span> <span class="n">x</span>
</span><span class="line"><span class="ow">=&gt;</span> <span class="s">&quot;Pika Pika&quot;</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Now Container is an instance of Show and PikachuShow.</p>

<p><code>Container</code> derives its <code>show</code> function from its data members such as <code>String</code> or <code>Integer</code> which <em>are</em>
instances of <code>Show</code>.  <code>(Integer -&gt; Integer)</code> is not an instance of <code>Show</code> and container cannot find a <code>show</code> 
implementation for it.  <code>Container</code> is an instance of <code>PikachuShow</code> and has therefore implemented the pikaShow function</p>

<p>The <code>pikaShow</code> function ignores its argument, because of the _ in the function argument list, this is also
seen in languages such as Erlang, and to some extent in Ruby.  The argument, if you had bound it to a variable, 
would be the <code>Container</code> it was called with.</p>

<ul>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-1/">Recreating the Haskell List Part 1</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-2-functors/">Recreating the Haskell List Part 2: Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-3-monoids/">Recreating the Haskell List Part 3: Monoids</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-4-applicative-functors/">Recreating the Haskell List Part 4: Applicative Functors</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-5-monads/">Recreating the Haskell List Part 5: Monads</a></li>
  <li><a href="http://irkenkitties.com/blog/2012/12/03/recreating-the-haskell-list-part-6-the-io-monad/">Recreating the Haskell List Part 6: The IO Monad</a></li>
</ul>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Consonant Intervals and Orthogonality]]></title>
    <link href="http://irkenkitties.com/blog/2012/11/28/consonant-intervals-and-orthogonality/"/>
    <updated>2012-11-28T01:46:00-08:00</updated>
    <id>http://irkenkitties.com/blog/2012/11/28/consonant-intervals-and-orthogonality</id>
    <content type="html"><![CDATA[<p>In this article I am going to explore some factors which are involved in the perception of
consonance and dissonance of notes in the chromatic and major musical scales.  The distance 
between two notes is called an interval, and there are 12 notes in the western chromatic scale.
There are two common methods of calculating the frequencies of these notes.</p>

<h2 id="equal-temperment">Equal Temperment</h2>

<p>The most common method used in modern times is called Equal Temperment.  In this tuning, each
adjacent note is related by the ratio of a 12th root of 2 or:</p>

<script type="math/tex; mode=display">2^{1/12} = 1.0594630943592953...</script>

<p>Starting from <code>A 440hz</code> and calculating each of the 12 notes of the chromatic scale up to the
next A, looks like this:</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span>Equal Tempered Note Frequencies</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="n">r</span> <span class="o">=</span> <span class="mi">2</span><span class="o">.</span><span class="n">*</span><span class="o">*</span><span class="p">(</span><span class="mi">1</span><span class="o">/</span><span class="mi">12</span><span class="o">.</span><span class="mi">0</span><span class="p">)</span>
</span><span class="line"><span class="n">start_note</span> <span class="o">=</span> <span class="mi">440</span><span class="o">.</span><span class="mi">0</span>
</span><span class="line"><span class="mi">1</span><span class="o">.</span><span class="n">upto</span><span class="p">(</span><span class="mi">12</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">interval</span><span class="o">|</span> <span class="n">start_note</span> <span class="o">*=</span> <span class="n">r</span> <span class="p">}</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">466</span><span class="o">.</span><span class="mi">1637615180899</span><span class="p">,</span> <span class="mi">493</span><span class="o">.</span><span class="mi">8833012561241</span><span class="p">,</span> <span class="mi">523</span><span class="o">.</span><span class="mi">2511306011974</span><span class="p">,</span>
</span><span class="line">    <span class="mi">554</span><span class="o">.</span><span class="mi">3652619537443</span><span class="p">,</span> <span class="mi">587</span><span class="o">.</span><span class="mi">3295358348153</span><span class="p">,</span> <span class="mi">622</span><span class="o">.</span><span class="mi">253967444162</span><span class="p">,</span>
</span><span class="line">    <span class="mi">659</span><span class="o">.</span><span class="mi">2551138257401</span><span class="p">,</span> <span class="mi">698</span><span class="o">.</span><span class="mi">456462866008</span><span class="p">,</span> <span class="mi">739</span><span class="o">.</span><span class="mi">988845423269</span><span class="p">,</span>
</span><span class="line">    <span class="mi">783</span><span class="o">.</span><span class="mi">9908719634989</span><span class="p">,</span> <span class="mi">830</span><span class="o">.</span><span class="mi">6093951598906</span><span class="p">,</span> <span class="mi">880</span><span class="o">.</span><span class="mo">000000000000</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<!-- more -->

<p>This tuning has the benefit of being able to switch musical keys without retuning your instrument, 
and allowing different types of instruments to play together.  This is the way a guitar, MIDI synthesizer,
or piano is usually tuned.  The problems with it are that essentially every note frequency besides the Octave 
is slightly wrong, and when calculated this way even that is a bit wrong due to floating point error and 
cumulative error of multiplying irrational numbers.</p>

<p>The benefits usually outweigh its problems, but for the purposes of this article I will be using…</p>

<h2 id="just-intonation">Just Intonation</h2>

<p>The ratios in Just Intonation are not all equal, but are based on the harmonic series.  You find each
ratio by mutiplying the root note or tonic by increasing whole numbers, and then dividing by a denominator
that will bring the frequency back into the octave’s range.  Here is a data structure we can use to look
up the ratios and names for each degree in the chromatic scale.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span>Chromatic Scale Lookup Table</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
<span class="line-number">16</span>
<span class="line-number">17</span>
<span class="line-number">18</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="n">start_note</span> <span class="o">=</span> <span class="mi">440</span><span class="o">.</span><span class="mi">0</span>
</span><span class="line"><span class="no">Ratios</span><span class="o">=</span> <span class="o">[</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span>                   <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Unison&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span><span class="mi">24</span><span class="p">),</span>     <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Minor Second&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">9</span><span class="p">,</span><span class="mi">8</span><span class="p">),</span>       <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Major Second&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span>       <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Minor Third&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span>       <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Major Third&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span>       <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Perfect Fourth&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">45</span><span class="p">,</span><span class="mi">32</span><span class="p">),</span>     <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Diminished Fifth&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span>       <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Perfect Fifth&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span>       <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Minor Sixth&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span>       <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Major Sixth&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">9</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span>       <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Minor Seventh&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span><span class="mi">8</span><span class="p">),</span>      <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Major Seventh&#39;</span><span class="p">},</span>
</span><span class="line">        <span class="p">{</span><span class="ss">:ratio</span> <span class="o">=&gt;</span> <span class="mi">2</span><span class="p">,</span>                   <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s1">&#39;Octave&#39;</span><span class="p">}</span> <span class="o">]</span>
</span><span class="line"><span class="no">Ratios</span><span class="o">.</span><span class="n">map</span><span class="p">{</span><span class="o">|</span><span class="n">ratio</span><span class="o">|</span> <span class="n">start_note</span> <span class="o">*</span> <span class="n">ratio</span><span class="o">[</span><span class="ss">:ratio</span><span class="o">].</span><span class="n">to_f</span> <span class="p">}</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">440</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">458</span><span class="o">.</span><span class="mi">33333333333337</span><span class="p">,</span> <span class="mi">495</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">528</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">550</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">586</span><span class="o">.</span><span class="mi">6666666666666</span><span class="p">,</span>
</span><span class="line">    <span class="mi">618</span><span class="o">.</span><span class="mi">75</span><span class="p">,</span> <span class="mi">660</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">704</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">733</span><span class="o">.</span><span class="mi">3333333333334</span><span class="p">,</span> <span class="mi">792</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">825</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">880</span><span class="o">.</span><span class="mi">0</span><span class="o">]</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>This is already producing rational frequencies, and they are numbers I can work with mathematically
in this example.  So, what is going on when an A Major chord <code>A C♯ E</code> sounds consonant and pleasing to
people, and what causes a disonanant sound?</p>

<p>A broad answer, is that the smaller the whole numbers are which are involved in the ratio, the more pleasing 
(or even boring) two notes will sound in relation to one another. You can see for yourself that the ratio 
of a relatively dissonant interval like the Diminished Fifth, also called The Tritone or Devil’s note, 
has much higher whole numbers in the numerator and denominator with <code>45:32</code>.</p>

<p>This interval is so interesting sounding, hanging out on the verge of consonance and dissonance that it is also called 
the Blue Note, and plays a large part in the sound of Blues, Jazz, Rock, and Metal.</p>

<p>While I was playing with the math described on the excellent DSP website
<a href="http://www.katjaas.nl/complane/complexplane.html">A Trip on the Complex Plane</a>, I started playing with dot products 
and it was mentioned that a pure sine wave at frequency $f$ is orthogonal to a sine wave one octave higher at
$2f$.  I began to wonder what a dot product reveals about the orthogonality of other inervals besides the octave.</p>

<h2 id="orthogonality">Orthogonality</h2>

<p>One specific example of orthogonality that is easy to understand is on a 2D plane.  Visually you can see 
it as two points that are rotated $90^{\circ}$or equivilenly $\pi/2$ radians from one another. Like these points 
at  $(0, 0.5)$ and $(0.5, 0)$.</p>

<p>Here you can see points</p>

<p><img src="http://irkenkitties.com/images/polar_orthogonal.jpg" alt="Orthogonal points" title="Orthogonal Points" /></p>

<p>It’s easy to see in this image, but you can figure out if any two points are orthogonal using a dot product. This is
because the dot product of two vectors is equal to the cosine of the angle between them.  The cosine of $90^{\circ}$, or from now
on using radians, $\pi/2$, is $0$, therefore if the dot product of two vectors is $0$ they are orthogonal.</p>

<p>We can extend Ruby’s Array class to add some methods for working with orthogonality and dot products.  There is already a 
Vector class in Ruby which does this, but it will be easier to show what’s happening by adding methods to Array and using
it as a vector.</p>

<p>The formula for dot product is to multiply each element in the vector element-wise producing a third
vector, then all elements of this resulting vector are summed.</p>

<script type="math/tex; mode=display">\vec{v} \cdot \vec{u} = \sum\limits_{i=1}^n \vec{v}_i \vec{u}_i</script>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span>Dot Product</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
<span class="line-number">15</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="k">class</span> <span class="nc">Array</span>
</span><span class="line">    <span class="k">def</span> <span class="nf">dot_product</span><span class="p">(</span><span class="n">ary</span><span class="p">)</span>
</span><span class="line">        <span class="nb">self</span><span class="o">.</span><span class="n">zip</span><span class="p">(</span><span class="n">ary</span><span class="p">)</span><span class="o">.</span><span class="n">inject</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">sum</span><span class="p">,</span> <span class="n">pairs</span><span class="o">|</span>
</span><span class="line">            <span class="n">sum</span> <span class="o">+=</span> <span class="n">pairs</span><span class="o">.</span><span class="n">first</span> <span class="o">*</span> <span class="n">pairs</span><span class="o">.</span><span class="n">last</span> <span class="k">rescue</span> <span class="mi">0</span>
</span><span class="line">        <span class="k">end</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">
</span><span class="line">    <span class="k">def</span> <span class="nf">is_orthogonal?</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
</span><span class="line">        <span class="nb">self</span><span class="o">.</span><span class="n">dot_product</span><span class="p">(</span><span class="n">other</span><span class="p">)</span><span class="o">.</span><span class="n">abs</span> <span class="o">&lt;</span> <span class="no">Epsilon</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line"><span class="k">end</span>
</span><span class="line"><span class="n">p1</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="o">]</span>
</span><span class="line"><span class="n">p2</span> <span class="o">=</span> <span class="o">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="o">]</span>
</span><span class="line"><span class="n">p1</span><span class="o">.</span><span class="n">is_orthogonal?</span><span class="p">(</span><span class="n">p2</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="kp">true</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="audio-as-n-dimentional-vectors">Audio as N-Dimentional Vectors</h2>

<p>So it’s great to be able to calculate if 2D points are orthogonal and all, but what about audio and musical 
notes?  How can we prove that an <code>A 440hz</code> note is orthogonal to <code>A 880hz</code>, and what about the other notes in
the chromatic scale?</p>

<p>A pure note with no overtones being played is just air pressure oscillating back and forth at a specific number
of times per second, or frequency.  That can be modeled using a sinusoidal function like sine or cosine.  Generating
a cosine wave to represent <code>A 440hz</code> can be done with the equation $cos(2\pi \cdot 440 \cdot t)$ where $t$ is time in seconds.</p>

<p>In the computer we can represent this digitally by sampling the values that come out of the above equation at regular
time intervals, we can specify a ratio, number of cycles to generate, and a rate at which to sample the cosine function
with the following code.  This effectively makes our digital sampling the same as an N-dimentional vector, similar to
the 2 dimentional vectors shown above.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="k">def</span> <span class="nf">create_scale_degree</span><span class="p">(</span><span class="n">ratio</span><span class="p">,</span> <span class="n">num_cycles</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">sample_rate</span> <span class="o">=</span> <span class="mi">32</span><span class="p">)</span>
</span><span class="line">    <span class="n">degree</span> <span class="o">=</span> <span class="mi">0</span><span class="o">.</span><span class="n">step</span><span class="p">(</span><span class="n">num_cycles</span><span class="p">,</span> <span class="no">Rational</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">sample_rate</span><span class="p">))</span><span class="o">.</span><span class="n">map</span> <span class="k">do</span> <span class="o">|</span><span class="n">t</span><span class="o">|</span>
</span><span class="line">        <span class="no">Math</span><span class="o">::</span><span class="n">cos</span><span class="p">(</span><span class="n">ratio</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="no">Math</span><span class="o">::</span><span class="no">PI</span> <span class="o">*</span> <span class="n">t</span><span class="p">)</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line">    <span class="n">degree</span><span class="o">.</span><span class="n">pop</span> <span class="c1"># One sample too many</span>
</span><span class="line">    <span class="n">degree</span>
</span><span class="line"><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Instead of using <code>440hz</code> as the tonic, this code is just using <code>1hz</code> to simplify things.  It is also dropping
the last sample because that sample actually belongs to the beginning of the next period of the cosine. 
Now we should be able to prove what we already knew, two cosine waves that are in phase but an octave higher (double
the frequency) are orthogonal to each other.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span>Octaves are Orthogonal</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="n">p1</span> <span class="o">=</span> <span class="n">create_scale_degree</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">1</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="o">.</span><span class="mi">30901699437494745</span><span class="p">,</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">8090169943749473</span><span class="p">,</span>
</span><span class="line">    <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">8090169943749475</span><span class="p">,</span> <span class="mi">0</span><span class="o">.</span><span class="mi">30901699437494723</span><span class="o">]</span>
</span><span class="line"><span class="n">p2</span> <span class="o">=</span> <span class="n">create_scale_degree</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">[</span><span class="mi">1</span><span class="o">.</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">8090169943749473</span><span class="p">,</span> <span class="mi">0</span><span class="o">.</span><span class="mi">30901699437494723</span><span class="p">,</span>
</span><span class="line">    <span class="mi">0</span><span class="o">.</span><span class="mi">30901699437494773</span><span class="p">,</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">8090169943749477</span><span class="o">]</span>
</span><span class="line"><span class="n">p1</span><span class="o">.</span><span class="n">is_orthogonal?</span><span class="p">(</span><span class="n">p2</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="kp">true</span>
</span><span class="line"><span class="n">p1</span><span class="o">.</span><span class="n">is_orthogonal?</span><span class="p">(</span><span class="o">[</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">21</span><span class="p">,</span><span class="o">]</span><span class="p">)</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="kp">false</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>Above I am genrating 1 cycle of a <code>1hz</code> and a <code>2hz</code> cosine wave at a sample rate of 5 samples per second.  These results
can sometimes be hard to see due to floating point error, but we can unwind the dot product method and show it working
manually.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span>Manual Calculation showing orthogonality</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="mi">1</span><span class="o">.</span><span class="mi">0</span> <span class="o">*</span> <span class="mi">1</span><span class="o">.</span><span class="mi">0</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">1</span><span class="o">.</span><span class="mi">0</span>
</span><span class="line"><span class="mi">0</span><span class="o">.</span><span class="mi">30901699437494745</span> <span class="o">*</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">8090169943749473</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">25</span>
</span><span class="line"><span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">8090169943749473</span> <span class="o">*</span> <span class="mi">0</span><span class="o">.</span><span class="mi">30901699437494723</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">2499999999999998</span>
</span><span class="line"><span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">8090169943749475</span> <span class="o">*</span> <span class="mi">0</span><span class="o">.</span><span class="mi">30901699437494773</span> <span class="o">+</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">2500000000000003</span>
</span><span class="line"><span class="mi">0</span><span class="o">.</span><span class="mi">30901699437494723</span> <span class="o">*</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">8090169943749477</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="o">-</span><span class="mi">0</span><span class="o">.</span><span class="mi">24999999999999992</span>
</span><span class="line"><span class="mi">1</span><span class="o">.</span><span class="mi">0</span> <span class="o">-</span> <span class="mi">0</span><span class="o">.</span><span class="mi">25</span> <span class="o">-</span> <span class="mi">0</span><span class="o">.</span><span class="mi">2499999999999998</span> <span class="o">-</span> <span class="mi">0</span><span class="o">.</span><span class="mi">2500000000000003</span> <span class="o">-</span> <span class="mi">0</span><span class="o">.</span><span class="mi">24999999999999992</span>
</span><span class="line"><span class="o">=&gt;</span> <span class="mi">2</span><span class="o">.</span><span class="mi">7755575615628914</span><span class="n">e</span><span class="o">-</span><span class="mi">17</span>
</span><span class="line"><span class="c1">#  Without floating point error: 1.0 - 0.25 - 0.25 - 0.25 - 0.25 == 0.0</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The above floating point error is the reasoning behind <code>self.dot_product(other).abs &lt; Epsilon</code> in the method <code>is_orthogonal?</code>
Epsilon is just set to some very small number to deal with floting point comparisons.</p>

<h2 id="are-the-other-intervals-orthogonal-too">Are the other intervals orthogonal too?</h2>

<p>Using all this, we should be able to answer the original question, are the other intervals in the chromatic scale 
all orthogonal to each other?  The answer I found was no, not after only one cycle of the cosine waves.  But, if you
keep them running together for longer periods of time and more cycles, there is eventually a time when the waveform’s intervals
will match up in period and the full waveform up until that point will be completely orthogonal to each other.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span>Checking Each Interval for Orthogonality</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="no">MaxCycles</span> <span class="o">=</span> <span class="mi">200</span>
</span><span class="line"><span class="no">Ratios</span><span class="o">.</span><span class="n">each_with_index</span> <span class="k">do</span> <span class="o">|</span><span class="n">ratio</span><span class="p">,</span> <span class="n">i</span><span class="o">|</span>
</span><span class="line">    <span class="k">next</span> <span class="k">if</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span>   <span class="c1">#  Not orthogonal to itself!</span>
</span><span class="line">    <span class="mi">1</span><span class="o">.</span><span class="n">upto</span><span class="p">(</span><span class="no">MaxCycles</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">num_cycles</span><span class="o">|</span>
</span><span class="line">        <span class="n">tonic</span> <span class="o">=</span> <span class="n">create_scale_degree</span><span class="p">(</span><span class="no">Ratios</span><span class="o">.</span><span class="n">first</span><span class="o">[</span><span class="ss">:ratio</span><span class="o">]</span><span class="p">,</span> <span class="n">num_cycles</span><span class="p">)</span>
</span><span class="line">        <span class="n">note</span> <span class="o">=</span> <span class="n">create_scale_degree</span><span class="p">(</span><span class="n">ratio</span><span class="o">[</span><span class="ss">:ratio</span><span class="o">]</span><span class="p">,</span> <span class="n">num_cycles</span><span class="p">)</span>
</span><span class="line">        <span class="k">if</span> <span class="n">tonic</span><span class="o">.</span><span class="n">is_orthogonal?</span><span class="p">(</span><span class="n">note</span><span class="p">)</span>
</span><span class="line">            <span class="nb">puts</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">ratio</span><span class="o">[</span><span class="ss">:name</span><span class="o">]</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">ratio</span><span class="o">[</span><span class="ss">:ratio</span><span class="o">].</span><span class="n">inspect</span><span class="si">}</span><span class="s2"> is orthogonal to Unison after </span><span class="si">#{</span><span class="n">num_cycles</span><span class="si">}</span><span class="s2"> cycles&quot;</span>
</span><span class="line">            <span class="k">break</span><span class="p">;</span>
</span><span class="line">        <span class="k">end</span>
</span><span class="line">    <span class="k">end</span>
</span><span class="line"><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<h2 id="results">Results</h2>

<p>Below is a chart of the results sorted by how many cycles it takes for each interval to sync up and become
orthogonal, which they all do after few relatively few cycles.</p>

<div class="bogus-wrapper"><notextile><figure class="code"><figcaption><span>Results</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class="line-number">1</span>
<span class="line-number">2</span>
<span class="line-number">3</span>
<span class="line-number">4</span>
<span class="line-number">5</span>
<span class="line-number">6</span>
<span class="line-number">7</span>
<span class="line-number">8</span>
<span class="line-number">9</span>
<span class="line-number">10</span>
<span class="line-number">11</span>
<span class="line-number">12</span>
<span class="line-number">13</span>
<span class="line-number">14</span>
</pre></td><td class="code"><pre><code class="ruby"><span class="line"><span class="o">|</span> <span class="no">Cycles</span>   <span class="o">|</span> <span class="no">Ratio</span>    <span class="o">|</span>  <span class="no">Decimal</span>  <span class="o">|</span> <span class="no">Interval</span> <span class="no">Name</span>    <span class="o">|</span>
</span><span class="line"><span class="o">|</span> <span class="o">--------</span> <span class="o">|</span> <span class="o">--------</span> <span class="o">|</span> <span class="o">---------</span> <span class="o">|</span> <span class="o">----------------</span> <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">1</span>       <span class="o">|</span>  <span class="mi">2</span><span class="p">:</span><span class="mi">1</span>     <span class="o">|</span> <span class="mi">2</span><span class="o">.</span><span class="mi">0</span>       <span class="o">|</span> <span class="no">Octave</span>           <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">2</span>       <span class="o">|</span>  <span class="mi">3</span><span class="p">:</span><span class="mi">2</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">5</span>       <span class="o">|</span> <span class="no">Perfect</span> <span class="no">Fifth</span>    <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">3</span>       <span class="o">|</span>  <span class="mi">4</span><span class="p">:</span><span class="mi">3</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">3333333</span> <span class="o">|</span> <span class="no">Perfect</span> <span class="no">Fourth</span>   <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">3</span>       <span class="o">|</span>  <span class="mi">5</span><span class="p">:</span><span class="mi">3</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">6666667</span> <span class="o">|</span> <span class="no">Major</span> <span class="no">Sixth</span>      <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">4</span>       <span class="o">|</span>  <span class="mi">5</span><span class="p">:</span><span class="mi">4</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">25</span>      <span class="o">|</span> <span class="no">Major</span> <span class="no">Third</span>      <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">5</span>       <span class="o">|</span>  <span class="mi">6</span><span class="p">:</span><span class="mi">5</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">2</span>       <span class="o">|</span> <span class="no">Minor</span> <span class="no">Third</span>      <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">5</span>       <span class="o">|</span>  <span class="mi">8</span><span class="p">:</span><span class="mi">5</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">6</span>       <span class="o">|</span> <span class="no">Minor</span> <span class="no">Sixth</span>      <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">5</span>       <span class="o">|</span>  <span class="mi">9</span><span class="p">:</span><span class="mi">5</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">8</span>       <span class="o">|</span> <span class="no">Minor</span> <span class="no">Seventh</span>    <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">8</span>       <span class="o">|</span>  <span class="mi">9</span><span class="p">:</span><span class="mi">8</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">125</span>     <span class="o">|</span> <span class="no">Major</span> <span class="no">Second</span>     <span class="o">|</span>
</span><span class="line"><span class="o">|</span>  <span class="mi">8</span>       <span class="o">|</span> <span class="mi">15</span><span class="p">:</span><span class="mi">8</span>     <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">875</span>     <span class="o">|</span> <span class="no">Major</span> <span class="no">Seventh</span>    <span class="o">|</span>
</span><span class="line"><span class="o">|</span> <span class="mi">24</span>       <span class="o">|</span> <span class="mi">25</span><span class="p">:</span><span class="mi">24</span>    <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mo">0417</span>    <span class="o">|</span> <span class="no">Minor</span> <span class="no">Second</span>     <span class="o">|</span>
</span><span class="line"><span class="o">|</span> <span class="mi">32</span>       <span class="o">|</span> <span class="mi">45</span><span class="p">:</span><span class="mi">32</span>    <span class="o">|</span> <span class="mi">1</span><span class="o">.</span><span class="mi">40625</span>   <span class="o">|</span> <span class="no">Diminished</span> <span class="no">Fifth</span> <span class="o">|</span>
</span></code></pre></td></tr></table></div></figure></notextile></div>

<p>The first things I notice about the results are:</p>

<ul>
  <li>The number of cycles required is equal to the denominator</li>
  <li>The decimal value of the interval’s ratio doesn’t follow the number of cycles</li>
  <li>The Perfect Fifth is the quickest to sync up (Circle of fifths?)</li>
  <li>The Perfect Fourth is next</li>
  <li>When DJing you generally mix songs in keys which are perfect fourths and fifths</li>
  <li>My two favourite intervals take the longest to sync</li>
</ul>

<p>What I can take away from this experiment, is that the human brain is basing its perception
of consonance and dissonance on how long two frequencies or notes played together take 
until they match up in period and become orthogonal.  This probably gives those intervals
a feeling both of balance, but also temporary dissonance which resolves after a short period
of time.  Two sounds played at once which never resolve to orthogonality are considered 
noisey or out of tune.</p>

]]></content>
  </entry>
  
</feed>
