all repos — site @ d5d6f439720f3aa78a577962829a60f8e4cad778

source for my site, found at icyphox.sh

Initialize vite site

Signed-off-by: Anirudh <icyph0x@pm.me>
Anirudh icyph0x@pm.me
Thu, 21 Mar 2019 22:51:32 +0530
commit

d5d6f439720f3aa78a577962829a60f8e4cad778

parent

474c4d1df2bd5048c251e4bb75cce4612734c229

A .gitignore

@@ -0,0 +1,1 @@

+__pycache__
M 404.htmlpages/404.html

@@ -1,27 +1,28 @@

-<!DOCTYPE html> <html lang=en> <link rel="stylesheet" href="/static/style.css" type="text/css"> <link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> -<meta content="linux, infosec, open source." name=description> +<meta content="Memeing security since forever." name=description> <meta name="viewport" content="initial-scale=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> <meta name="HandheldFriendly" content="true"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:site" content="@icyphox"> <meta name="twitter:title" content="Anirudh"> -<meta name="twitter:description" content="linux, infosec, open source."> -<meta name="twitter:image" content="https://0x0.st/svQ1.png"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> <meta property="og:title" content="Anirudh"> <meta property="og:type" content="website"> -<meta property="og:description" content="linux, infosec, open source."> -<meta property="og:url" content="https://icy.ph0x.me"> -<meta property="og:image" content="https://0x0.st/svQ1.png"> - +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> <link rel="stylesheet" href="/static/style.css" type="text/css"> +<html> <div class="container"> <div class="introduction"> <p align="center"> <b>404</b> │ nothing like that here </p> </div> -</div> +</div> +</html>
D about/index.html

@@ -1,54 +0,0 @@

-<!DOCTYPE html> -<html lang=en> -<link rel="stylesheet" href="/static/style.css" type="text/css"> -<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> -<meta content="linux, infosec, open source." name=description> -<meta name="viewport" content="initial-scale=1"> -<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> -<meta content="#021012" name="theme-color"> -<meta name="HandheldFriendly" content="true"> -<meta name="twitter:card" content="summary_large_image"> -<meta name="twitter:site" content="@icyphox"> -<meta name="twitter:title" content="Anirudh"> -<meta name="twitter:description" content="Memeing security since forever."> -<meta name="twitter:image" content="/static/icyphox.png"> -<meta property="og:title" content="Anirudh"> -<meta property="og:type" content="website"> -<meta property="og:description" content="Memeing security since forever."> -<meta property="og:url" content="https://icyphox.sh"> -<meta property="og:image" content="/static/icyphox.png"> -<html> - <title> - Anirudh - </title> -<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> -<body class="noselect"> -<div class="container-text"> - <div class="header"> - <a href="/">icyphox.sh</a> - (<a href="https://github.com/icyphox/site">src</a>) - </div> - <div class="content"> - <div align="left"> - <h1>Hi, I’m Anirudh.</h1> - <p> I go by <a href="https://www.startpage.com/do/search?query=icyphox">icyphox</a> on the Internet. I’m doing my undergrad right now, majoring in CS. - My primary interest is computer security, and more specifically — <b>offensive security</b> and <b>digital forensics</b>. - I’m also a CTF player/security researcher at <a href=https://sector443.xyz>Sector443</a>, an infosec community at my University. - My <a href=https://medium.com/@icyphox>blog</a> has a few write-ups that you might want to check out. - </p> - <p> - In my free time (which I tend to have a lot of) I contribute to open-source projects like the <a href=https://nim-lang.org>Nim</a> programming language. - Take a look at my <a href=https://github.com/icyphox>GitHub</a> profile for more of my work. - </p> - <p>Atmospheric/electronic metal subgenres are my jam. If it djents, I like it. My <a href=https://last.fm/user/Icyphox>Last.fm</a> should be self-explanatory. - For those who didn’t click it: bands like <i>Oceans Ate Alaska</i>, <i>I See Stars</i>, <i>Invent Animate</i>, <i>Make Them Suffer</i>, <i>Ice Nine Kills</i>, etc. - </p> - <p> Want to <b> hire me</b>? I’m down for freelance security work. Here’s my <a href=https://x.icyphox.sh/resume.pdf>résumé</a>. - <h2> Contact </h2> - <p>My DMs on <a href=https://twitter.com/icyphox>Twitter</a> are open, so feel free to slide into them. - Don’t use Twitter? Shoot me an <a href=mailto:icyph0x@pm.me>email</a>. If it’s something secret, here’s my <a href=https://keybase.io/icyphox>Keybase</a>. - </p> - </div> - </div> -</body> -</html>
A build/404.html

@@ -0,0 +1,28 @@

+<html lang=en> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> +<meta content="Memeing security since forever." name=description> +<meta name="viewport" content="initial-scale=1"> +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> +<meta name="HandheldFriendly" content="true"> +<meta name="twitter:card" content="summary_large_image"> +<meta name="twitter:site" content="@icyphox"> +<meta name="twitter:title" content="Anirudh"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> +<meta property="og:title" content="Anirudh"> +<meta property="og:type" content="website"> +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<html> +<div class="container"> + <div class="introduction"> + <p align="center"> + <b>404</b> │ nothing like that here + </p> + </div> +</div> +</html>
A build/about/index.html

@@ -0,0 +1,49 @@

+<!DOCTYPE html> +<html lang=en> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> +<meta content="Memeing security since forever." name=description> +<meta name="viewport" content="initial-scale=1"> +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> +<meta name="HandheldFriendly" content="true"> +<meta name="twitter:card" content="summary_large_image"> +<meta name="twitter:site" content="@icyphox"> +<meta name="twitter:title" content="Anirudh"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> +<meta property="og:title" content="Anirudh"> +<meta property="og:type" content="website"> +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> +<html> + <title> + Anirudh + </title> +<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> +<div class="container-text"> + <header class="header"> + <a href="../">‹ back</a> + </header> +<body class="noselect"> + <div class="content"> + <div align="left"> + <h1>Hi, I’m Anirudh.</h1> + +<p>I go by <a href="https://www.startpage.com/do/search?query=icyphox">icyphox</a> on the Internet. I’m doing my undergrad right now, majoring in CS. My primary interest is computer security, and more specifically — <strong>offensive security</strong> and <strong>digital forensics</strong>. I’m also a CTF player/security researcher at <a href="https://sector443.xyz">Sector443</a>, an infosec community at my University. My <a href="https://medium.com/@icyphox">blog</a> has a few write-ups that you might want to check out.</p> + +<p>In my free time (which I tend to have a lot of) I contribute to open-source projects like the <a href="https://nim-lang.org">Nim</a> programming language. Take a look at my <a href="https://github.com/icyphox">GitHub</a> profile for more of my work.</p> + +<p>Atmospheric/electronic metal subgenres are my jam. If it djents, I like it. My <a href="https://last.fm/user/Icyphox">Last.fm</a> should be self-explanatory. For those who didn’t click it: bands like <em>Oceans Ate Alaska</em>, <em>I See Stars</em>, <em>Invent Animate</em>, <em>Make Them Suffer</em>, <em>Ice Nine Kills</em>, etc.</p> + +<p>Want to <strong>hire me</strong>? I’m down for freelance security work. Here’s my <a href="https://x.icyphox.sh/resume.pdf">résumé</a>.</p> + +<h2>Contact</h2> + +<p>My DMs on <a href="https://twitter.com/icyphox">Twitter</a> are open, so feel free to slide into them. Don’t use Twitter? Shoot me an <a href="mailto:icyph0x@pm.me">email</a>. If it’s something secret, here’s my <a href="https://keybase.io/icyphox">Keybase</a>.</p> + + </div> + </body> + </div> +</html>
A build/blog/index.html

@@ -0,0 +1,54 @@

+<!DOCTYPE html> +<html lang=en> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> +<meta content="Memeing security since forever." name=description> +<meta name="viewport" content="initial-scale=1"> +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> +<meta name="HandheldFriendly" content="true"> +<meta name="twitter:card" content="summary_large_image"> +<meta name="twitter:site" content="@icyphox"> +<meta name="twitter:title" content="Anirudh"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> +<meta property="og:title" content="Anirudh"> +<meta property="og:type" content="website"> +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> +<html> + <title> + Anirudh + </title> +<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> +<div class="container-text"> + <header class="header"> + <a href="../">‹ back</a> + </header> +<body class="noselect"> + <div class="content"> + <div align="left"> + <h1>Posts</h1> + +<p><a href="/blog/python-for-re-1/">Python for Reverse Engineering #1: ELF Binaries</a> <strong>Feb 2019</strong></p> + +<p><a href="/blog/break-the-ice/">Break the Ice — Hardware CTF</a> <strong>March 2019</strong></p> + + </div> + </body> + </div> + <div class="footer"> + <div class="left"> + &copy; 2019 — <a href="mailto:icyph0x@pm.me">icyph0x@pm.me</a> + </div> + + <div class="right"> + <a href="https://github.com/icyphox" target="_blank">GitHub</a> + <a href="https://twitter.com/icyphox" target="_blank">Twitter</a> + <a href="https://medium.com/@icyphox" target="_blank">Medium</a> + <a href="/about" target="_blank">About</a> + </div> + </body> + </div> +</html>
A build/blog/python-for-re-1/index.html

@@ -0,0 +1,319 @@

+<!DOCTYPE html> +<html lang=en> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> +<meta content="Memeing security since forever." name=description> +<meta name="viewport" content="initial-scale=1"> +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> +<meta name="HandheldFriendly" content="true"> +<meta name="twitter:card" content="summary_large_image"> +<meta name="twitter:site" content="@icyphox"> +<meta name="twitter:title" content="Anirudh"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> +<meta property="og:title" content="Anirudh"> +<meta property="og:type" content="website"> +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> +<html> + <title> + Anirudh + </title> +<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> +<div class="container-text"> + <header class="header"> + <a href="../">‹ back</a> + </header> +<body class="noselect"> + <div class="content"> + <div align="left"> + <h2>Python for Reverse Engineering 1: ELF Binaries</h2> + +<h3>Building your own disassembly tooling for — that’s right — fun and profit</h3> + +<p>While solving complex reversing challenges, we often use established tools like radare2 or IDA for disassembling and debugging. But there are times when you need to dig in a little deeper and understand how things work under the hood.</p> + +<p>Rolling your own disassembly scripts can be immensely helpful when it comes to automating certain processes, and eventually build your own homebrew reversing toolchain of sorts. At least, that’s what I’m attempting anyway.</p> + +<h2>Setup</h2> + +<p>As the title suggests, you’re going to need a Python 3 interpreter before +anything else. Once you’ve confirmed beyond reasonable doubt that you do, +in fact, have a Python 3 interpreter installed on your system, run</p> + +<div class="codehilite"><pre><span></span><code><span class="gp">$</span> pip install capstone pyelftools +</code></pre></div> + +<p>where <code>capstone</code> is the disassembly engine we’ll be scripting with and <code>pyelftools</code> to help parse ELF files.</p> + +<p>With that out of the way, let’s start with an example of a basic reversing +challenge.</p> + +<div class="codehilite"><pre><span></span><code><span class="cm">/* chall.c */</span> + +<span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span> +<span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp"></span> +<span class="cp">#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp"></span> + +<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> + <span class="kt">char</span> <span class="o">*</span><span class="n">pw</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="mi">9</span><span class="p">);</span> + <span class="n">pw</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;a&#39;</span><span class="p">;</span> + <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">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="mi">8</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span> + <span class="n">pw</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">pw</span><span class="p">[</span><span class="n">i</span> <span class="err">—</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span> + <span class="p">}</span> + <span class="n">pw</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;\0&#39;</span><span class="p">;</span> + <span class="kt">char</span> <span class="o">*</span><span class="n">in</span> <span class="o">=</span> <span class="n">malloc</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span> + <span class="n">printf</span><span class="p">(</span><span class="s">&quot;password: &quot;</span><span class="p">);</span> + <span class="n">fgets</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span> <span class="c1">// &#39;abcdefghi&#39;</span> + <span class="k">if</span><span class="p">(</span><span class="n">strcmp</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="n">pw</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> + <span class="n">printf</span><span class="p">(</span><span class="s">&quot;haha yes!</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> + <span class="p">}</span> + <span class="k">else</span> <span class="p">{</span> + <span class="n">printf</span><span class="p">(</span><span class="s">&quot;nah dude</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> + <span class="p">}</span> +<span class="p">}</span> +</code></pre></div> + +<p>Compile it with GCC/Clang:</p> + +<div class="codehilite"><pre><span></span><code><span class="gp">$</span> gcc chall.c -o chall.elf +</code></pre></div> + +<h2>Scripting</h2> + +<p>For starters, let’s look at the different sections present in the binary.</p> + +<div class="codehilite"><pre><span></span><code><span class="c1"># sections.py</span> + +<span class="kn">from</span> <span class="nn">elftools.elf.elffile</span> <span class="kn">import</span> <span class="n">ELFFile</span> + +<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;./chall.elf&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">e</span> <span class="o">=</span> <span class="n">ELFFile</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> + <span class="k">for</span> <span class="n">section</span> <span class="ow">in</span> <span class="n">e</span><span class="o">.</span><span class="n">iter_sections</span><span class="p">():</span> + <span class="k">print</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">section</span><span class="p">[</span><span class="err">’</span><span class="n">sh_addr</span><span class="err">’</span><span class="p">]),</span> <span class="n">section</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> +</code></pre></div> + +<p>This script iterates through all the sections and also shows us where it’s loaded. This will be pretty useful later. Running it gives us</p> + +<pre><code>› python sections.py +0x238 .interp +0x254 .note.ABI-tag +0x274 .note.gnu.build-id +0x298 .gnu.hash +0x2c0 .dynsym +0x3e0 .dynstr +0x484 .gnu.version +0x4a0 .gnu.version_r +0x4c0 .rela.dyn +0x598 .rela.plt +0x610 .init +0x630 .plt +0x690 .plt.got +0x6a0 .text +0x8f4 .fini +0x900 .rodata +0x924 .eh_frame_hdr +0x960 .eh_frame +0x200d98 .init_array +0x200da0 .fini_array +0x200da8 .dynamic +0x200f98 .got +0x201000 .data +0x201010 .bss +0x0 .comment +0x0 .symtab +0x0 .strtab +0x0 .shstrtab +</code></pre> + +<p>Most of these aren’t relevant to us, but a few sections here are to be noted. The <code>.text</code> section contains the instructions (opcodes) that we’re after. The <code>.data</code> section should have strings and constants initialized at compile time. Finally, the <code>.plt</code> which is the Procedure Linkage Table and the <code>.got</code>, the Global Offset Table. If you’re unsure about what these mean, read up on the ELF format and its internals.</p> + +<p>Since we know that the <code>.text</code> section has the opcodes, let’s disassemble the binary starting at that address.</p> + +<pre><code># disas1.py + +from elftools.elf.elffile import ELFFile +from capstone import * + +with open('./bin.elf', 'rb') as f: + elf = ELFFile(f) + code = elf.get_section_by_name('.text') + ops = code.data() + addr = code['sh_addr'] + md = Cs(CS_ARCH_X86, CS_MODE_64) + for i in md.disasm(ops, addr): + print(f'0x{i.address:x}:\t{i.mnemonic}\t{i.op_str}') +</code></pre> + +<p>The code is fairly straightforward (I think). We should be seeing this, on running</p> + +<pre><code>› python disas1.py | less +0x6a0: xor ebp, ebp +0x6a2: mov r9, rdx +0x6a5: pop rsi +0x6a6: mov rdx, rsp +0x6a9: and rsp, 0xfffffffffffffff0 +0x6ad: push rax +0x6ae: push rsp +0x6af: lea r8, [rip + 0x23a] +0x6b6: lea rcx, [rip + 0x1c3] +0x6bd: lea rdi, [rip + 0xe6] +**0x6c4: call qword ptr [rip + 0x200916]** +0x6ca: hlt +... snip ... +</code></pre> + +<p>The line in bold is fairly interesting to us. The address at <code>[rip + 0x200916]</code> is equivalent to <code>[0x6ca + 0x200916]</code>, which in turn evaluates to <code>0x200fe0</code>. The first <code>call</code> being made to a function at <code>0x200fe0</code>? What could this function be?</p> + +<p>For this, we will have to look at <strong>relocations</strong>. Quoting <a href="http://refspecs.linuxbase.org/elf/gabi4+/ch4.reloc.html">linuxbase.org</a></p> + +<blockquote> + <p>Relocation is the process of connecting symbolic references with symbolic definitions. For example, when a program calls a function, the associated call instruction must transfer control to the proper destination address at execution. Relocatable files must have “relocation entries’’ which are necessary because they contain information that describes how to modify their section contents, thus allowing executable and shared object files to hold the right information for a process’s program image.</p> +</blockquote> + +<p>To try and find these relocation entries, we write a third script.</p> + +<div class="codehilite"><pre><span></span><code><span class="c1"># relocations.py</span> + +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">from</span> <span class="nn">elftools.elf.elffile</span> <span class="kn">import</span> <span class="n">ELFFile</span> +<span class="kn">from</span> <span class="nn">elftools.elf.relocation</span> <span class="kn">import</span> <span class="n">RelocationSection</span> + +<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;./chall.elf&#39;</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span> + <span class="n">e</span> <span class="o">=</span> <span class="n">ELFFile</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> + <span class="k">for</span> <span class="n">section</span> <span class="ow">in</span> <span class="n">e</span><span class="o">.</span><span class="n">iter_sections</span><span class="p">():</span> + <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">section</span><span class="p">,</span> <span class="n">RelocationSection</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;{section.name}:&#39;</span><span class="p">)</span> + <span class="n">symbol_table</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">get_section</span><span class="p">(</span><span class="n">section</span><span class="p">[</span><span class="s1">&#39;sh_link&#39;</span><span class="p">])</span> + <span class="k">for</span> <span class="n">relocation</span> <span class="ow">in</span> <span class="n">section</span><span class="o">.</span><span class="n">iter_relocations</span><span class="p">():</span> + <span class="n">symbol</span> <span class="o">=</span> <span class="n">symbol_table</span><span class="o">.</span><span class="n">get_symbol</span><span class="p">(</span><span class="n">relocation</span><span class="p">[</span><span class="s1">&#39;r_info_sym&#39;</span><span class="p">])</span> + <span class="n">addr</span> <span class="o">=</span> <span class="nb">hex</span><span class="p">(</span><span class="n">relocation</span><span class="p">[</span><span class="s1">&#39;r_offset&#39;</span><span class="p">])</span> + <span class="k">print</span><span class="p">(</span><span class="n">f</span><span class="s1">&#39;{symbol.name} {addr}&#39;</span><span class="p">)</span> +</code></pre></div> + +<p>Let’s run through this code real quick. We first loop through the sections, and check if it’s of the type <code>RelocationSection</code>. We then iterate through the relocations from the symbol table for each section. Finally, running this gives us</p> + +<pre><code>› python relocations.py +.rela.dyn: + 0x200d98 + 0x200da0 + 0x201008 +_ITM_deregisterTMCloneTable 0x200fd8 +**__libc_start_main 0x200fe0** +__gmon_start__ 0x200fe8 +_ITM_registerTMCloneTable 0x200ff0 +__cxa_finalize 0x200ff8 +stdin 0x201010 +.rela.plt: +puts 0x200fb0 +printf 0x200fb8 +fgets 0x200fc0 +strcmp 0x200fc8 +malloc 0x200fd0 +</code></pre> + +<p>Remember the function call at <code>0x200fe0</code> from earlier? Yep, so that was a call to the well known <code>__libc_start_main</code>. Again, according to <a href="http://refspecs.linuxbase.org/LSB_3.1.0/LSB-generic/LSB-generic/baselib---libc-start-main-.html">linuxbase.org</a></p> + +<blockquote> + <p>The <code>__libc_start_main()</code> function shall perform any necessary initialization of the execution environment, call the <em>main</em> function with appropriate arguments, and handle the return from <code>main()</code>. If the <code>main()</code> function returns, the return value shall be passed to the <code>exit()</code> function.</p> +</blockquote> + +<p>And its definition is like so</p> + +<pre><code>int __libc_start_main(int *(main) (int, char * *, char * *), +int argc, char * * ubp_av, +void (*init) (void), +void (*fini) (void), +void (*rtld_fini) (void), +void (* stack_end)); +</code></pre> + +<p>Looking back at our disassembly</p> + +<pre><code>0x6a0: xor ebp, ebp +0x6a2: mov r9, rdx +0x6a5: pop rsi +0x6a6: mov rdx, rsp +0x6a9: and rsp, 0xfffffffffffffff0 +0x6ad: push rax +0x6ae: push rsp +0x6af: lea r8, [rip + 0x23a] +0x6b6: lea rcx, [rip + 0x1c3] +**0x6bd: lea rdi, [rip + 0xe6]** +0x6c4: call qword ptr [rip + 0x200916] +0x6ca: hlt +... snip ... +</code></pre> + +<p>but this time, at the <code>lea</code> or Load Effective Address instruction, which loads some address <code>[rip + 0xe6]</code> into the <code>rdi</code> register. <code>[rip + 0xe6]</code> evaluates to <code>0x7aa</code> which happens to be the address of our <code>main()</code> function! How do I know that? Because <code>__libc_start_main()</code>, after doing whatever it does, eventually jumps to the function at <code>rdi</code>, which is generally the <code>main()</code> function. It looks something like this</p> + +<p><img src="https://cdn-images-1.medium.com/max/800/0*oQA2MwHjhzosF8ZH.png" alt="" /></p> + +<p>To see the disassembly of <code>main</code>, seek to <code>0x7aa</code> in the output of the script we’d written earlier (<code>disas1.py</code>).</p> + +<p>From what we discovered earlier, each <code>call</code> instruction points to some function which we can see from the relocation entries. So following each <code>call</code> into their relocations gives us this</p> + +<pre><code>printf 0x650 +fgets 0x660 +strcmp 0x670 +malloc 0x680 +</code></pre> + +<p>Putting all this together, things start falling into place. Let me highlight the key sections of the disassembly here. It’s pretty self-explanatory.</p> + +<pre><code>0x7b2: mov edi, 0xa ; 10 +0x7b7: call 0x680 ; malloc +</code></pre> + +<p>The loop to populate the <code>*pw</code> string</p> + +<pre><code>0x7d0: mov eax, dword ptr [rbp - 0x14] +0x7d3: cdqe +0x7d5: lea rdx, [rax - 1] +0x7d9: mov rax, qword ptr [rbp - 0x10] +0x7dd: add rax, rdx +0x7e0: movzx eax, byte ptr [rax] +0x7e3: lea ecx, [rax + 1] +0x7e6: mov eax, dword ptr [rbp - 0x14] +0x7e9: movsxd rdx, eax +0x7ec: mov rax, qword ptr [rbp - 0x10] +0x7f0: add rax, rdx +0x7f3: mov edx, ecx +0x7f5: mov byte ptr [rax], dl +0x7f7: add dword ptr [rbp - 0x14], 1 +0x7fb: cmp dword ptr [rbp - 0x14], 8 +0x7ff: jle 0x7d0 +</code></pre> + +<p>And this looks like our <code>strcmp()</code></p> + +<pre><code>0x843: mov rdx, qword ptr [rbp - 0x10] ; *in +0x847: mov rax, qword ptr [rbp - 8] ; *pw +0x84b: mov rsi, rdx +0x84e: mov rdi, rax +0x851: call 0x670 ; strcmp +0x856: test eax, eax ; is = 0? +0x858: jne 0x868 ; no? jump to 0x868 +0x85a: lea rdi, [rip + 0xae] ; "haha yes!" +0x861: call 0x640 ; puts +0x866: jmp 0x874 +0x868: lea rdi, [rip + 0xaa] ; "nah dude" +0x86f: call 0x640 ; puts +</code></pre> + +<p>I’m not sure why it uses <code>puts</code> here? I might be missing something; perhaps <code>printf</code> calls <code>puts</code>. I could be wrong. I also confirmed with radare2 that those locations are actually the strings “haha yes!” and “nah dude”.</p> + +<h2>Conclusion</h2> + +<p>Wew, that took quite some time. But we’re done. If you’re a beginner, you might find this extremely confusing, or probably didn’t even understand what was going on. And that’s okay. Building an intuition for reading and grokking disassembly comes with practice. I’m no good at it either.</p> + +<p>All the code used in this post is here: <a href="https://github.com/icyphox/asdf/tree/master/reversing-elf">https://github.com/icyphox/asdf/tree/master/reversing-elf</a></p> + +<p>Ciao for now, and I’ll see ya in #2 of this series — PE binaries. Whenever that is.</p> + + </div> + </body> + </div> +</html>
A build/static/gpg.txt

@@ -0,0 +1,31 @@

+--BEGIN PGP PUBLIC KEY BLOCK-- + +mQENBFn8YdABCACtulcVqYEXUtib53uw1pBowkdWqxmMpKsh+CG+816xW/Sh6gCP +eotqFgBMkvQ83/9fvJ2HAkaelyVmT1g20WNprqVU61u0Ctw6FtNPu0Y+cBikEbYJ +GFcqXeMgUjQNqVyutTfbv5rfGz0/xzFB9P6edTC400Z3x7PfET8zOWYXxTcWMjfi +swv+psPX7MteYI/1gvgdGB3VN6efdCAe1GQNmE8KUBPt4exlHiH1kkCIAD/p33tk +MfWXL0etYweM7WHbwcAGMDYwtGSo+V+btshE081PsbGQj2C82BuQMZGaFk2JmzlK +udwqL0p6Y6VjbW0RQR7i2h1O0vAAmRHHFTYPABEBAAG0LEFuaXJ1ZGggT3BwaWxp +YXBwYW4gPGljeXBoMHhAcHJvdG9ubWFpbC5jb20+iQFUBBMBCAA+FiEE/huPz+bB +YiLxVxyOipP5b3jF1MQFAln8YdACGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwEC +HgECF4AACgkQipP5b3jF1MQNigf+LWBALgyeGAKWMBhqXtLcxE1/EA6jXO0ntEjb +WMCkd8fUmOqbJm5Asoiq5fK/g5mqt27pNSV98dT/evpFNLhSLPvAc1lgkyZM3dzM +5jK1l1QhfEkJj/mJxaPmGO1UUk6qEcs9s/SD47qfE+wxbpIA6QSo0ZyQ83PAb6kD +tQjhibF9x9kWp2xEm2OaBAdGOAHWLA/dRrYWCIQUn2X4ITs3pEQuKPwfH6LEOHlh +IV27CgSpGLzB2WUl0cRDjlgNSmQaM2YOpT7dqBxqHCAdr5jjR0Gqoi7ltP0W/V1P +znA/VSbwyzu8s9B9xMNEuXZoskxCV5F0l/XNDDC6cqtXS/Y6CLkBDQRZ/GHQAQgA +vZ423gfhwidyiQ+ybDfjjGfGPHcEkboPnn/tMvlWPTBPwHvxl5RkN0UIUw56Vx3e +vUGJS+u/iuop78BwntGlsu2IrPVwKmT0WJhSwFF6n2ygdAm/bL11M0VZRotoI8ID +xrmnJmeGc7AwV43HD6Nk7VQO8rL6wnmYLZ5ylMKYf82L/J8p01V2i1XyGU39CJDw +TAcAU6ravA5pIiSH/Bsvi4Xoj2k6fj8V9P6njsEn0FgnL2HHEWgWJXU5MvLK9ylf +qphY06MftmEVZWinrblB5AU1ogX/G5+yjbTR0oqYdsKetHAW4e0kUUhWWMHuRfBA +I3IQObMKxsuSIC9KrQ9QQwARAQABiQE8BBgBCAAmFiEE/huPz+bBYiLxVxyOipP5 +b3jF1MQFAln8YdACGwwFCQPCZwAACgkQipP5b3jF1MRvOwf/eU9jMKtvpfqHY473 +05YLccpY6WElPk49La9CJAbLIZETcfOm32V3C7XiMa/o5v/FP5YfkooaUI80gNLm +1UKwjclSfbwOg2cESCl18+LDLvwZq2vTfIgq1yZkps3ccKfYMRVa2exG1clOhkVS +uHSb1G2oi1rcWFz2XcXfduK4MGKf6Vz5+zMx73lWkwdKeOXtxrmB68isbyGzg2DZ +rj74ULW6+0neyf3eH2xMLQYkvTw39IySG2BpsCo5fDgwuRzsLAppvp73Ajn3lgHk +DwdlN2dsUo+DccxSZFh7AxGdTNiijcePfmb+U4QMC8CNvQ+DWiEkw3amRii5S1EV +fd/YcA== =zHye + +--END PGP PUBLIC KEY BLOCK--
A build/static/icynobg.svg

@@ -0,0 +1,4 @@

+<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="753px" height="528px" viewBox="0 0 753 528" enable-background="new 0 0 753 528" xml:space="preserve"> <image id="image0" width="753" height="528" x="0" y="0" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvEAAAIQCAYAAAAIIDHGAAAABGdBTUEAALGPC/xhBQAAACBjSFJN AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAA CXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4ggQETAm5552PgAAgABJREFUeNrs/WlwHOed5/t+ n8ysKqxV4E4CBAiQsiSatCxZlizJAL3MeNzd7rbb+0Ivbbc5M/eeiXsnYs6J6Rc3JmZenHtuzLn3 RExPu93d0z3udttabMsSJVuybO2rtXJfJJIiCa4gAQIEUABqyee5LxIFbVywV2XV7xPRMR09tpSo LX/55D9/j3HOISIiIiIi8eGV+wBERERERGRmFOJFRERERGJGIV5EREREJGYU4kVEREREYkYhXkRE REQkZhTiRURERERiRiFeRERERCRmFOJFRERERGJGIV5EREREJGYU4kVEREREYkYhXkREREQkZhTi RURERERiRiFeRERERCRmFOJFRERERGJGIV5EREREJGYU4kVEREREYkYhXkREREQkZhTiRURERERi RiFeRERERCRmFOJFRERERGJGIV5EREREJGYU4kVEREREYkYhXkREREQkZhTiRURERERiRiFeRERE RCRmFOJFRERERGImjiHelPsARERERKRmGaIMXdZMGrcQnwRagDoU5kVERERkcRmgGegAGiljHo1T iDfHYcUB+ARwM5BGQV5EREREFp4BfCAzCN2vwdeJgnzZsmhQ7ldkBoyFVXfDlz8O/sfhnw08A1wE XLkPTkRERESqUmn1ves4bPwJfO4mmKDMOTpWIb4Vkj50/BKuOwN1nwfq4VlgGLAozIuIiIjI/DFA Buh+Cbb+DK7PQfF98CPgLGXMnnEK8aSANuAcpJ+DntNgvgGNrbAPOA6MoCAvIiIiInPnAekC9DwI 2x6FbgONDbBzFRwEhihj7ozTTLwDsp3Qa2EshPQx2PLf4S92wH8EeoiulDQnLyIiIiKzZYhKVNov wCf/FrY9Bj0uKlfx28HWwzgQlvMg47QS74De9bDdwSZgUxGaL8Lmf4COP4T0p8ELojn50niNiIiI iMh0GaLylBsOwCfvgU+ehw+Gk4UqBmgHm6iAyY+4hfjR5dCbhuwwOAeeBd9By6+j8Rq+Bl4zvAAM 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 OjUwOjE5LTA3OjAwkRWtjAAAAABJRU5ErkJggg=="/> +</svg>
A build/static/style.css

@@ -0,0 +1,165 @@

+@font-face { + font-family: Inter; + src: url('fonts/Inter-Regular.woff2'); + font-size: 13px; +} + +html, +body { + font-family: Inter, sans-serif; + background: #021012; +} + +.container { + position: absolute; + overflow: hidden; + top: 0; + bottom: 0; + left: 0; + right: 0; + color: white; + + -webkit-animation: fadein 3s; + -moz-animation: fadein 3s; + -ms-animation: fadein 3s; + -o-animation: fadein 3s; + animation: fadein 3s; +} + +.container-text { + position: absolute; + overflow-y: auto; + overflow-x: hidden; + top: 0; + bottom: 0; + left: 0; + right: 0; + color: white; + + -webkit-animation: fadein 3s; + -moz-animation: fadein 3s; + -ms-animation: fadein 3s; + -o-animation: fadein 3s; + animation: fadein 3s; +} + +@keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +@-moz-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +@-webkit-keyframes fadein { + from { opacity: 0; } + to { opacity: 1; } +} + +.introduction { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 100%; +} + +.content { + position: absolute; + font-size: 17px; + top: 10%; + left: 20%; + right: 20%; + width: 60%; + line-height: 170%; +} + +.logo { + width: 220px; +} + +.footer { + color: gray; + bottom: 20px; + position: absolute; + width: 100%; + text-align: center; + margin-bottom: 20px; +} + +.header { + color: cyan; + top: 20px; + position: absolute; + width: 100%; + text-align: left; + margin: 20px; +} + +a { + color: gray; + margin: 0; + transition: all 200ms; + text-decoration: none; +} + +a:hover { + color: #021012; + background: cyan; +} + +.left { + display: inline-block; + margin-bottom: 30px; + margin-left: 0; + margin-right: 30px; +} + +.right { + display: inline-block; +} + +.right a { + display: inline-block; + margin-right: 30px; +} + +.noselect{ + -webkit-touch-callout:none; + -webkit-user-select:none; + -khtml-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none +} + +@media only screen and (max-width: 100em) { + .left { + display: block; + margin-right: 0; + } + .right { + display: block; + } + .right a:last-child { + margin-right: 0; + } + + .container-text { + overflow-y: auto; + } + + .content { + top: 10%; + left: 10%; + bottom: 3%; + font-size: 18px; + line-height: 150%; + width: 70%; + } + + .logo { + width: 180px; + } +}
A config.py

@@ -0,0 +1,8 @@

+# config.py - Vite's configuration script + +title = 'Anirudh' +author = '' +header = '<a href="/">icyphox.sh</a> (<a href="https://github.com/icyphox/site">src</a>)' +footer = '' +template = 'index.html' # default is index.html +
M index.htmlbuild/index.html

@@ -2,7 +2,7 @@ <!DOCTYPE html>

<html lang=en> <link rel="stylesheet" href="/static/style.css" type="text/css"> <link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> -<meta content="linux, infosec, open source." name=description> +<meta content="Memeing security since forever." name=description> <meta name="viewport" content="initial-scale=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta content="#021012" name="theme-color">

@@ -22,16 +22,15 @@ <title>

Anirudh </title> <script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> -<body class="noselect"> <div class="container"> - <div class="header"> - <a href="/">icyphox.sh</a> - (<a href="https://github.com/icyphox/site">src</a>) - </div> + <header class="header"> + <a href="/">icyphox.sh</a> (<a href="https://github.com/icyphox/site">src</a>) + </header> +<body class="noselect"> <div class="introduction"> <h1 align="center"> - <!-- logo credits: Akshay Oppiliappan (@nerdypepper) --> - <img src="/static/icynobg.svg" class="logo"> + <p><img src="/static/icynobg.svg" class="logo"></p> + </h1> </div>

@@ -46,6 +45,6 @@ <a href="https://twitter.com/icyphox" target="_blank">Twitter</a>

<a href="https://medium.com/@icyphox" target="_blank">Medium</a> <a href="/about" target="_blank">About</a> </div> + </body> </div> -</body> -</html> +</html>
A pages/_index.md

@@ -0,0 +1,1 @@

+<img src="/static/icynobg.svg" class="logo">
A pages/about.md

@@ -0,0 +1,17 @@

+--- +template: text.html +--- + +# Hi, I’m Anirudh. + +I go by [icyphox](https://www.startpage.com/do/search?query=icyphox) on the Internet. I’m doing my undergrad right now, majoring in CS. My primary interest is computer security, and more specifically — **offensive security** and **digital forensics**. I’m also a CTF player/security researcher at [Sector443](https://sector443.xyz), an infosec community at my University. My [blog](https://medium.com/@icyphox) has a few write-ups that you might want to check out. + +In my free time (which I tend to have a lot of) I contribute to open-source projects like the [Nim](https://nim-lang.org) programming language. Take a look at my [GitHub](https://github.com/icyphox) profile for more of my work. + +Atmospheric/electronic metal subgenres are my jam. If it djents, I like it. My [Last.fm](https://last.fm/user/Icyphox) should be self-explanatory. For those who didn’t click it: bands like _Oceans Ate Alaska_, _I See Stars_, _Invent Animate_, _Make Them Suffer_, _Ice Nine Kills_, etc. + +Want to **hire me**? I’m down for freelance security work. Here’s my [résumé](https://x.icyphox.sh/resume.pdf). + +## Contact + +My DMs on [Twitter](https://twitter.com/icyphox) are open, so feel free to slide into them. Don’t use Twitter? Shoot me an [email](mailto:icyph0x@pm.me). If it’s something secret, here’s my [Keybase](https://keybase.io/icyphox).
A pages/blog/_index.md

@@ -0,0 +1,9 @@

+--- +template: blogindex.html +--- + +# Posts + +[Python for Reverse Engineering #1: ELF Binaries](/blog/python-for-re-1/) **Feb 2019** + +[Break the Ice — Hardware CTF](/blog/break-the-ice/) **March 2019**
A pages/blog/python-for-re-1.md

@@ -0,0 +1,310 @@

+--- +template: text.html +--- + +## Python for Reverse Engineering 1: ELF Binaries + +### Building your own disassembly tooling for — that’s right — fun and profit + +While solving complex reversing challenges, we often use established tools like radare2 or IDA for disassembling and debugging. But there are times when you need to dig in a little deeper and understand how things work under the hood. + +Rolling your own disassembly scripts can be immensely helpful when it comes to automating certain processes, and eventually build your own homebrew reversing toolchain of sorts. At least, that’s what I’m attempting anyway. + +## Setup + +As the title suggests, you’re going to need a Python 3 interpreter before +anything else. Once you’ve confirmed beyond reasonable doubt that you do, +in fact, have a Python 3 interpreter installed on your system, run + +```console +$ pip install capstone pyelftools +``` + +where `capstone` is the disassembly engine we’ll be scripting with and `pyelftools` to help parse ELF files. + +With that out of the way, let’s start with an example of a basic reversing +challenge. + +```c +/* chall.c */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int main() { + char *pw = malloc(9); + pw[0] = 'a'; + for(int i = 1; i <= 8; i++){ + pw[i] = pw[i — 1] + 1; + } + pw[9] = '\0'; + char *in = malloc(10); + printf("password: "); + fgets(in, 10, stdin); // 'abcdefghi' + if(strcmp(in, pw) == 0) { + printf("haha yes!\n"); + } + else { + printf("nah dude\n"); + } +} +``` + + +Compile it with GCC/Clang: + +```console +$ gcc chall.c -o chall.elf +``` + + +## Scripting + +For starters, let’s look at the different sections present in the binary. + +```python +# sections.py + +from elftools.elf.elffile import ELFFile + +with open('./chall.elf', 'rb') as f: + e = ELFFile(f) + for section in e.iter_sections(): + print(hex(section[’sh_addr’]), section.name) +``` + + +This script iterates through all the sections and also shows us where it’s loaded. This will be pretty useful later. Running it gives us + +``` +› python sections.py +0x238 .interp +0x254 .note.ABI-tag +0x274 .note.gnu.build-id +0x298 .gnu.hash +0x2c0 .dynsym +0x3e0 .dynstr +0x484 .gnu.version +0x4a0 .gnu.version_r +0x4c0 .rela.dyn +0x598 .rela.plt +0x610 .init +0x630 .plt +0x690 .plt.got +0x6a0 .text +0x8f4 .fini +0x900 .rodata +0x924 .eh_frame_hdr +0x960 .eh_frame +0x200d98 .init_array +0x200da0 .fini_array +0x200da8 .dynamic +0x200f98 .got +0x201000 .data +0x201010 .bss +0x0 .comment +0x0 .symtab +0x0 .strtab +0x0 .shstrtab +``` + + +Most of these aren’t relevant to us, but a few sections here are to be noted. The `.text` section contains the instructions (opcodes) that we’re after. The `.data` section should have strings and constants initialized at compile time. Finally, the `.plt` which is the Procedure Linkage Table and the `.got`, the Global Offset Table. If you’re unsure about what these mean, read up on the ELF format and its internals. + +Since we know that the `.text` section has the opcodes, let’s disassemble the binary starting at that address. + +``` +# disas1.py + +from elftools.elf.elffile import ELFFile +from capstone import * + +with open('./bin.elf', 'rb') as f: + elf = ELFFile(f) + code = elf.get_section_by_name('.text') + ops = code.data() + addr = code['sh_addr'] + md = Cs(CS_ARCH_X86, CS_MODE_64) + for i in md.disasm(ops, addr): + print(f'0x{i.address:x}:\t{i.mnemonic}\t{i.op_str}') +``` + + +The code is fairly straightforward (I think). We should be seeing this, on running + +``` +› python disas1.py | less +0x6a0: xor ebp, ebp +0x6a2: mov r9, rdx +0x6a5: pop rsi +0x6a6: mov rdx, rsp +0x6a9: and rsp, 0xfffffffffffffff0 +0x6ad: push rax +0x6ae: push rsp +0x6af: lea r8, [rip + 0x23a] +0x6b6: lea rcx, [rip + 0x1c3] +0x6bd: lea rdi, [rip + 0xe6] +**0x6c4: call qword ptr [rip + 0x200916]** +0x6ca: hlt +... snip ... +``` + + +The line in bold is fairly interesting to us. The address at `[rip + 0x200916]` is equivalent to `[0x6ca + 0x200916]`, which in turn evaluates to `0x200fe0`. The first `call` being made to a function at `0x200fe0`? What could this function be? + +For this, we will have to look at **relocations**. Quoting [linuxbase.org](http://refspecs.linuxbase.org/elf/gabi4+/ch4.reloc.html) +> Relocation is the process of connecting symbolic references with symbolic definitions. For example, when a program calls a function, the associated call instruction must transfer control to the proper destination address at execution. Relocatable files must have “relocation entries’’ which are necessary because they contain information that describes how to modify their section contents, thus allowing executable and shared object files to hold the right information for a process’s program image. + +To try and find these relocation entries, we write a third script. + +```python +# relocations.py + +import sys +from elftools.elf.elffile import ELFFile +from elftools.elf.relocation import RelocationSection + +with open('./chall.elf', 'rb') as f: + e = ELFFile(f) + for section in e.iter_sections(): + if isinstance(section, RelocationSection): + print(f'{section.name}:') + symbol_table = e.get_section(section['sh_link']) + for relocation in section.iter_relocations(): + symbol = symbol_table.get_symbol(relocation['r_info_sym']) + addr = hex(relocation['r_offset']) + print(f'{symbol.name} {addr}') +``` + + +Let’s run through this code real quick. We first loop through the sections, and check if it’s of the type `RelocationSection`. We then iterate through the relocations from the symbol table for each section. Finally, running this gives us + +``` +› python relocations.py +.rela.dyn: + 0x200d98 + 0x200da0 + 0x201008 +_ITM_deregisterTMCloneTable 0x200fd8 +**__libc_start_main 0x200fe0** +__gmon_start__ 0x200fe8 +_ITM_registerTMCloneTable 0x200ff0 +__cxa_finalize 0x200ff8 +stdin 0x201010 +.rela.plt: +puts 0x200fb0 +printf 0x200fb8 +fgets 0x200fc0 +strcmp 0x200fc8 +malloc 0x200fd0 +``` + + +Remember the function call at `0x200fe0` from earlier? Yep, so that was a call to the well known `__libc_start_main`. Again, according to [linuxbase.org](http://refspecs.linuxbase.org/LSB_3.1.0/LSB-generic/LSB-generic/baselib---libc-start-main-.html) +> The `__libc_start_main()` function shall perform any necessary initialization of the execution environment, call the *main* function with appropriate arguments, and handle the return from `main()`. If the `main()` function returns, the return value shall be passed to the `exit()` function. + +And its definition is like so + +``` +int __libc_start_main(int *(main) (int, char * *, char * *), +int argc, char * * ubp_av, +void (*init) (void), +void (*fini) (void), +void (*rtld_fini) (void), +void (* stack_end)); +``` + + +Looking back at our disassembly + +``` +0x6a0: xor ebp, ebp +0x6a2: mov r9, rdx +0x6a5: pop rsi +0x6a6: mov rdx, rsp +0x6a9: and rsp, 0xfffffffffffffff0 +0x6ad: push rax +0x6ae: push rsp +0x6af: lea r8, [rip + 0x23a] +0x6b6: lea rcx, [rip + 0x1c3] +**0x6bd: lea rdi, [rip + 0xe6]** +0x6c4: call qword ptr [rip + 0x200916] +0x6ca: hlt +... snip ... +``` + + +but this time, at the `lea` or Load Effective Address instruction, which loads some address `[rip + 0xe6]` into the `rdi` register. `[rip + 0xe6]` evaluates to `0x7aa` which happens to be the address of our `main()` function! How do I know that? Because `__libc_start_main()`, after doing whatever it does, eventually jumps to the function at `rdi`, which is generally the `main()` function. It looks something like this + +![](https://cdn-images-1.medium.com/max/800/0*oQA2MwHjhzosF8ZH.png) + +To see the disassembly of `main`, seek to `0x7aa` in the output of the script we’d written earlier (`disas1.py`). + +From what we discovered earlier, each `call` instruction points to some function which we can see from the relocation entries. So following each `call` into their relocations gives us this + +``` +printf 0x650 +fgets 0x660 +strcmp 0x670 +malloc 0x680 +``` + + +Putting all this together, things start falling into place. Let me highlight the key sections of the disassembly here. It’s pretty self-explanatory. + +``` +0x7b2: mov edi, 0xa ; 10 +0x7b7: call 0x680 ; malloc +``` + + +The loop to populate the `*pw` string + +``` +0x7d0: mov eax, dword ptr [rbp - 0x14] +0x7d3: cdqe +0x7d5: lea rdx, [rax - 1] +0x7d9: mov rax, qword ptr [rbp - 0x10] +0x7dd: add rax, rdx +0x7e0: movzx eax, byte ptr [rax] +0x7e3: lea ecx, [rax + 1] +0x7e6: mov eax, dword ptr [rbp - 0x14] +0x7e9: movsxd rdx, eax +0x7ec: mov rax, qword ptr [rbp - 0x10] +0x7f0: add rax, rdx +0x7f3: mov edx, ecx +0x7f5: mov byte ptr [rax], dl +0x7f7: add dword ptr [rbp - 0x14], 1 +0x7fb: cmp dword ptr [rbp - 0x14], 8 +0x7ff: jle 0x7d0 +``` + + +And this looks like our `strcmp()` + +``` +0x843: mov rdx, qword ptr [rbp - 0x10] ; *in +0x847: mov rax, qword ptr [rbp - 8] ; *pw +0x84b: mov rsi, rdx +0x84e: mov rdi, rax +0x851: call 0x670 ; strcmp +0x856: test eax, eax ; is = 0? +0x858: jne 0x868 ; no? jump to 0x868 +0x85a: lea rdi, [rip + 0xae] ; "haha yes!" +0x861: call 0x640 ; puts +0x866: jmp 0x874 +0x868: lea rdi, [rip + 0xaa] ; "nah dude" +0x86f: call 0x640 ; puts +``` + + +I’m not sure why it uses `puts` here? I might be missing something; perhaps `printf` calls `puts`. I could be wrong. I also confirmed with radare2 that those locations are actually the strings “haha yes!” and “nah dude”. + +## Conclusion + +Wew, that took quite some time. But we’re done. If you’re a beginner, you might find this extremely confusing, or probably didn’t even understand what was going on. And that’s okay. Building an intuition for reading and grokking disassembly comes with practice. I’m no good at it either. + +All the code used in this post is here: [https://github.com/icyphox/asdf/tree/master/reversing-elf](https://github.com/icyphox/asdf/tree/master/reversing-elf) + +Ciao for now, and I’ll see ya in #2 of this series — PE binaries. Whenever that is.
M readme.mdreadme.md

@@ -3,4 +3,6 @@ > my digital home

![scrot](https://x.icyphox.sh/site_scrot.png) +Built using my own homebrew static site generator — [vite](https://github.com/icyphox/vite). The [blog](https://icyphox.sh/blog) is a work in progress. + **logo credits**: Akshay Oppiliappan ([@nerdypepper](https://github.com/nerdypepper))
A static/keybase.txt

@@ -0,0 +1,57 @@

+================================================================== +https://keybase.io/icyphox +-------------------------------------------------------------------- + +I hereby claim: + + * I am an admin of https://icyphox.sh + * I am icyphox (https://keybase.io/icyphox) on keybase. + * I have a public key ASAn_qtRhls2hJsC-igg0S2q4qIxzIJ5RWZ0BVlKz-x3wQo + +To do so, I am signing this object: + +{ + "body": { + "key": { + "eldest_kid": "012027feab51865b36849b02fa2820d12daae2a231cc827945667405594acfec77c10a", + "host": "keybase.io", + "kid": "012027feab51865b36849b02fa2820d12daae2a231cc827945667405594acfec77c10a", + "uid": "f7be14ab4cc8533a0a43dff5d3e51319", + "username": "icyphox" + }, + "merkle_root": { + "ctime": 1552897560, + "hash": "f41d8bf8f831f5c1ab89c7dd1e67caa45bbc7306913c38c7bcbaec3a5226ce17648a1842f573c66142fa095e55d1c2c3b758533db0f6596f4b6bb648697a78da", + "hash_meta": "a5743f6b8bcca99bdf89176ba5ce3cf43fa24ad3c642dcbb03e914c640ea48fb", + "seqno": 4970806 + }, + "service": { + "entropy": "mqgwA8morWvkSMlJwKSAQwrh", + "hostname": "icyphox.sh", + "protocol": "https:" + }, + "type": "web_service_binding", + "version": 2 + }, + "client": { + "name": "keybase.io go client", + "version": "3.1.2" + }, + "ctime": 1552897582, + "expire_in": 504576000, + "prev": "f400202b6444e4b53c7022ff0e42b3b51880d38db865cadb297adbb9fc791623", + "seqno": 72, + "tag": "signature" +} + +which yields the signature: + +hKRib2R5hqhkZXRhY2hlZMOpaGFzaF90eXBlCqNrZXnEIwEgJ/6rUYZbNoSbAvooINEtquKiMcyCeUVmdAVZSs/sd8EKp3BheWxvYWTESpcCSMQg9AAgK2RE5LU8cCL/DkKztRiA0424ZcrbKXrbufx5FiPEIFaSn23helvlNVtf0SpODQMSl88gzRuwj7/SmRlUvCC8AgHCo3NpZ8RAfZQPi652b+jFQgGYUy+vz+dKxphgwrtClmzDVDaSEvjKBbT7lKc7kOASF6vsrKkc9FtL7K/vNdhALCio3zxSD6hzaWdfdHlwZSCkaGFzaIKkdHlwZQildmFsdWXEIN9DL08ZsNVJvonE9js40WDCmPGDhP1RIZBgKFn2+T41o3RhZ80CAqd2ZXJzaW9uAQ== + +And finally, I am proving ownership of this host by posting or +appending to this document. + +View my publicly-auditable identity here: https://keybase.io/icyphox + +================================================================== +
M static/style.cssstatic/style.css

@@ -28,7 +28,8 @@ }

.container-text { position: absolute; - overflow: hidden; + overflow-y: auto; + overflow-x: hidden; top: 0; bottom: 0; left: 0;

@@ -66,13 +67,12 @@ }

.content { position: absolute; - font-size: 17px; - top: 50%; - left: 30%; - right: 30%; - width: 40%; + font-size: 17px; + top: 10%; + left: 20%; + right: 20%; + width: 60%; line-height: 170%; - transform: translateY(-50%); } .logo {

@@ -151,12 +151,12 @@ overflow-y: auto;

} .content { - top: 40%; + top: 10%; left: 10%; bottom: 3%; font-size: 18px; line-height: 150%; - width: 80%; + width: 70%; } .logo {
A templates/404.html

@@ -0,0 +1,49 @@

+<!DOCTYPE html> +<html lang=en> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> +<meta content="Memeing security since forever." name=description> +<meta name="viewport" content="initial-scale=1"> +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> +<meta name="HandheldFriendly" content="true"> +<meta name="twitter:card" content="summary_large_image"> +<meta name="twitter:site" content="@icyphox"> +<meta name="twitter:title" content="Anirudh"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> +<meta property="og:title" content="Anirudh"> +<meta property="og:type" content="website"> +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> +<html> + <title> + {{ title }} + </title> +<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> +<div class="container"> + <header class="header"> + {{ header }} + </header> +<body class="noselect"> + <div class="introduction"> + <h1 align="center"> + {{ body }} + </h1> + </div> + + <div class="footer"> + <div class="left"> + &copy; 2019 — <a href="mailto:icyph0x@pm.me">icyph0x@pm.me</a> + </div> + + <div class="right"> + <a href="https://github.com/icyphox" target="_blank">GitHub</a> + <a href="https://twitter.com/icyphox" target="_blank">Twitter</a> + <a href="https://medium.com/@icyphox" target="_blank">Medium</a> + <a href="/about" target="_blank">About</a> + </div> + </body> + </div> +</html>
A templates/blogindex.html

@@ -0,0 +1,49 @@

+<!DOCTYPE html> +<html lang=en> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> +<meta content="Memeing security since forever." name=description> +<meta name="viewport" content="initial-scale=1"> +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> +<meta name="HandheldFriendly" content="true"> +<meta name="twitter:card" content="summary_large_image"> +<meta name="twitter:site" content="@icyphox"> +<meta name="twitter:title" content="Anirudh"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> +<meta property="og:title" content="Anirudh"> +<meta property="og:type" content="website"> +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> +<html> + <title> + {{ title }} + </title> +<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> +<div class="container-text"> + <header class="header"> + <a href="../">‹ back</a> + </header> +<body class="noselect"> + <div class="content"> + <div align="left"> + {{ body }} + </div> + </body> + </div> + <div class="footer"> + <div class="left"> + &copy; 2019 — <a href="mailto:icyph0x@pm.me">icyph0x@pm.me</a> + </div> + + <div class="right"> + <a href="https://github.com/icyphox" target="_blank">GitHub</a> + <a href="https://twitter.com/icyphox" target="_blank">Twitter</a> + <a href="https://medium.com/@icyphox" target="_blank">Medium</a> + <a href="/about" target="_blank">About</a> + </div> + </body> + </div> +</html>
A templates/index.html

@@ -0,0 +1,49 @@

+<!DOCTYPE html> +<html lang=en> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> +<meta content="Memeing security since forever." name=description> +<meta name="viewport" content="initial-scale=1"> +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> +<meta name="HandheldFriendly" content="true"> +<meta name="twitter:card" content="summary_large_image"> +<meta name="twitter:site" content="@icyphox"> +<meta name="twitter:title" content="Anirudh"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> +<meta property="og:title" content="Anirudh"> +<meta property="og:type" content="website"> +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> +<html> + <title> + {{ title }} + </title> +<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> +<div class="container"> + <header class="header"> + {{ header }} + </header> +<body class="noselect"> + <div class="introduction"> + <h1 align="center"> + {{ body }} + </h1> + </div> + + <div class="footer"> + <div class="left"> + &copy; 2019 — <a href="mailto:icyph0x@pm.me">icyph0x@pm.me</a> + </div> + + <div class="right"> + <a href="https://github.com/icyphox" target="_blank">GitHub</a> + <a href="https://twitter.com/icyphox" target="_blank">Twitter</a> + <a href="https://medium.com/@icyphox" target="_blank">Medium</a> + <a href="/about" target="_blank">About</a> + </div> + </body> + </div> +</html>
A templates/text.html

@@ -0,0 +1,36 @@

+<!DOCTYPE html> +<html lang=en> +<link rel="stylesheet" href="/static/style.css" type="text/css"> +<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico"> +<meta content="Memeing security since forever." name=description> +<meta name="viewport" content="initial-scale=1"> +<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> +<meta content="#021012" name="theme-color"> +<meta name="HandheldFriendly" content="true"> +<meta name="twitter:card" content="summary_large_image"> +<meta name="twitter:site" content="@icyphox"> +<meta name="twitter:title" content="Anirudh"> +<meta name="twitter:description" content="Memeing security since forever."> +<meta name="twitter:image" content="/static/icyphox.png"> +<meta property="og:title" content="Anirudh"> +<meta property="og:type" content="website"> +<meta property="og:description" content="Memeing security since forever."> +<meta property="og:url" content="https://icyphox.sh"> +<meta property="og:image" content="/static/icyphox.png"> +<html> + <title> + {{ title }} + </title> +<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script> +<div class="container-text"> + <header class="header"> + <a href="../">‹ back</a> + </header> +<body class="noselect"> + <div class="content"> + <div align="left"> + {{ body }} + </div> + </body> + </div> +</html>