<?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-1546617459093993319</id><updated>2011-12-05T16:03:38.559-05:00</updated><category term='reversing'/><category term='crackme'/><category term='math'/><category term='crackme solution'/><category term='keygenme'/><category term='dlp'/><category term='godaddy sucks'/><category term='coding'/><title type='text'>RCE junk</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>andrewl</name><uri>http://www.blogger.com/profile/15585896448040772484</uri><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>68</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-5928612314589265769</id><published>2011-04-06T23:41:00.029-04:00</published><updated>2011-04-09T02:20:24.524-04:00</updated><title type='text'>Shmoocon 2011 Crypto Pack Solved! And Pairings And SAGE!</title><content type='html'>I'm happy to announce a thorough and impressive solution to all the Shmoocon 2011 cryptography challenges by crackmes.de denizen Dcoder.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-KjP_VbQWzB4/TZ6y5gvaMTI/AAAAAAAAAA8/GtEe14FqUcU/s1600/dcoder_sol_screenshot.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://1.bp.blogspot.com/-KjP_VbQWzB4/TZ6y5gvaMTI/AAAAAAAAAA8/GtEe14FqUcU/s400/dcoder_sol_screenshot.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5593104488351805746" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 219px; " /&gt;&lt;/a&gt;&lt;div&gt;&lt;a href="http://1.bp.blogspot.com/-KjP_VbQWzB4/TZ6y5gvaMTI/AAAAAAAAAA8/GtEe14FqUcU/s1600/dcoder_sol_screenshot.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;br /&gt;Not long after Dcoder's solve, user ged_ posted valid serials for his name, but sadly never supplied an explanation of his methods.&lt;br /&gt;&lt;br /&gt;Like stated previously, the choice of python and the simplicity of the first few challenges were intended to entice contenders into actually doing the challenges. The 4'th and 5'th challenge were to inject some new material into the keygenme problem space and that's what I'll discuss here.&lt;br /&gt;&lt;br /&gt;Challenge 4 is a large rational function calculating the "multiply-by-m" map of a point on an elliptic curve. Formulas exist to add and double points, so it's sensible that they may be composed to derive formulas for multiplication by a given coefficient. This is just a giant formula for multiplying by 13. No way could you take care of the algebra by hand: I used SAGE's EllipticCurve function multiplication_by_m() which Dcoder independently used when he suggests recreating the map for verification. A guessing game wasn't intended: the degree of the polynomial being 169 (13&lt;sup&gt;2&lt;/sup&gt;) is a clue. Blackboxing the function is even feasible.&lt;br /&gt;&lt;br /&gt;Challenge 5 is the BLS short signature scheme using pairings on elliptic curves. Pairings are freaking magic and here I'll try to explain why. We'll have the typical mapping from an elliptic curve group (where the group operation is written as addition and thus repeated operations are written as multiplication) to the multiplicative group of an extension field (where repeated operations are written as exponentiation). Thus we write the bilinear property as:&lt;br /&gt;&lt;br /&gt;e(a&lt;b&gt;P&lt;/b&gt;, b&lt;b&gt;Q&lt;/b&gt;) = e(&lt;b&gt;P&lt;/b&gt;,&lt;b&gt;Q&lt;/b&gt;)&lt;sup&gt;ab&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;So the map doesn't care if you first multiply the points and then ask for output, or if you ask for the output and then exponentiate the result. Why is a mapping with this property useful?&lt;br /&gt;&lt;br /&gt;Recall the computational DH problem (CDH) by thinking of the eavesdropper's perspective of an DH key exchange. Eve views &lt;b&gt;P&lt;/b&gt;, a&lt;b&gt;P&lt;/b&gt;, and b&lt;b&gt;P&lt;/b&gt;, but cannot compute the shared secret ab&lt;b&gt;P&lt;/b&gt;. But if Eve were handed the shared secret among a thousand other random group elements, could she discern ab&lt;b&gt;P&lt;/b&gt; from the decoys? This is called the decision DH problem (DDH) and is solvable if the group is equipped with a pairing. How? Given (&lt;b&gt;P&lt;/b&gt;, a&lt;b&gt;P&lt;/b&gt;, b&lt;b&gt;P&lt;/b&gt;, ab&lt;b&gt;P&lt;/b&gt;) Eve tests e(&lt;b&gt;P&lt;/b&gt;, ab&lt;b&gt;P&lt;/b&gt;) = e(a&lt;b&gt;P&lt;/b&gt;, b&lt;b&gt;P&lt;/b&gt;) = e(&lt;b&gt;P&lt;/b&gt;,&lt;b&gt;P&lt;/b&gt;)&lt;sup&gt;ab&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;Now look at it from a public-key standpoint. Suppose I publish &lt;b&gt;E&lt;/b&gt;=&amp;lt;&lt;b&gt;G&lt;/b&gt;&amp;gt;, x&lt;b&gt;G&lt;/b&gt; but keep x secret. You could challenge my claim of knowing x by asking me to multiply it on a new point &lt;b&gt;P&lt;/b&gt;. I'd return x&lt;b&gt;P&lt;/b&gt;, just not x. You'd then have (&lt;b&gt;G&lt;/b&gt;, x&lt;b&gt;G&lt;/b&gt;, &lt;b&gt;P&lt;/b&gt;, x&lt;b&gt;P&lt;/b&gt;) and could verify e(&lt;b&gt;G&lt;/b&gt;, x&lt;b&gt;P&lt;/b&gt;) = e(x&lt;b&gt;G&lt;/b&gt;, &lt;b&gt;P&lt;/b&gt;) = e(&lt;b&gt;G&lt;/b&gt;,&lt;b&gt;P&lt;/b&gt;)&lt;sup&gt;x&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;If this isn't magic enough, think now how you can operate on e(&lt;b&gt;G&lt;/b&gt;,&lt;b&gt;P&lt;/b&gt;)&lt;sup&gt;x&lt;/sup&gt; without knowing x. The pairing kind of exposes the x for involvement in future computations without explicitly revealing its value. Three-party key agreement is the clearest use of this property. When the three parties {A,B,C} compute respectively {e(b&lt;b&gt;G&lt;/b&gt;,c&lt;b&gt;G&lt;/b&gt;)&lt;sup&gt;a&lt;/sup&gt;, e(a&lt;b&gt;G&lt;/b&gt;,c&lt;b&gt;G&lt;/b&gt;)&lt;sup&gt;b&lt;/sup&gt;, e(a&lt;b&gt;G&lt;/b&gt;,b&lt;b&gt;G&lt;/b&gt;)&lt;sup&gt;c&lt;/sup&gt;}, everybody arrives at e(&lt;b&gt;G&lt;/b&gt;,&lt;b&gt;G&lt;/b&gt;)&lt;sup&gt;abc&lt;/sup&gt;, yet each party knows only the value of their own {a,b,c}.&lt;br /&gt;&lt;br /&gt;The BLS signature scheme is is exactly the same as the first example with DDH above, except that the challenge point &lt;b&gt;P&lt;/b&gt; is the message mapped to a point, and the x&lt;b&gt;P&lt;/b&gt; is renamed the signature &lt;b&gt;S&lt;/b&gt;. Verifying the signature is verifying the tuple (&lt;b&gt;G&lt;/b&gt;, x&lt;b&gt;G&lt;/b&gt;, &lt;b&gt;P&lt;/b&gt;, &lt;b&gt;S&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;There are a few pairings now, but the Weil pairing is seemed like the "hello world" of pairings and still it was very difficult to get working. I owe mostly to &lt;a href="http://cs.stanford.edu/~blynn/"&gt;Ben Lynn&lt;/a&gt; for writing his &lt;a href="http://crypto.stanford.edu/pbc/thesis.html"&gt;thesis&lt;/a&gt; in a clear, explanatory fashion and not being too "math leet" to include worked examples. Also, I had a bug when evaluating points on lines that went through infinity and couldn't have figured it out without &lt;a href="http://www.mollerhansen.com/"&gt;David Hanson&lt;/a&gt;'s Weil pairing implementation in SAGE.&lt;br /&gt;&lt;br /&gt;Producing curve parameters is an entirely separate problem. The &lt;a href="http://www.cryptojedi.org/papers/pfcpo.pdf"&gt;paper on BN (Barreto, Naehrig) curves&lt;/a&gt; had an algorithm that wasn't too difficult to type out and test. Here's the &lt;a href="http://andrewl.dreamhosters.com/archive/20412991.txt"&gt;implementation&lt;/a&gt; in SAGE. Finally crypto5 can be constructed:&lt;br /&gt;&lt;pre&gt;sage: [E,g1] = search_embed_12(64)&lt;br /&gt;Elliptic Curve defined by y^2 = x^3 + 13 over Finite Field of size 9524793152874449521&lt;br /&gt;(1 : 4577206343548535956 : 1)&lt;br /&gt;sage: r = E.order()&lt;br /&gt;sage: is_prime(r)&lt;br /&gt;True&lt;br /&gt;&lt;/pre&gt;As expected from the BN curve algorithm, we have a prime order curve. This means that r=#&lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt; and every point is in the r-torsion &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt;[r]. This r-torsion's definition is a subgroup whose elements' orders divide r, but here every elements' order is exactly r. Call this group by a new name G1 = &amp;lt;&lt;b&gt;g1&lt;/b&gt;&amp;gt; to detach it from &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt; since we'll be moving &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt; over larger fields.&lt;br /&gt;&lt;br /&gt;Over increasingly extended fields, #&lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt; grows, fast. Not until extension 12 (the embedding degree) does the group &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt;(F&lt;sub&gt;p&lt;sup&gt;12&lt;/sup&gt;&lt;/sub&gt;) contain &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt;[r&lt;sup&gt;2&lt;/sup&gt;]. &lt;/div&gt;&lt;div&gt;&lt;pre&gt;sage: E=EllipticCurve(GF(9524793152874449521^12,'a'),[0,0,0,0,13])&lt;br /&gt;sage: E.order()&lt;br /&gt;557527939388338455999335177184553128648411435525495183120877629267756649506692825601416365268161565197227820626524244139422343537066988585815195692298420149498809296111861768128843274828063908967761768686256781963953791177011200&lt;br /&gt;&lt;/pre&gt;That's a lot of points! &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt;[r&lt;sup&gt;2&lt;/sup&gt;] is the direct product of &lt;b&gt;G1&lt;/b&gt; and some other r-sized subgroup in &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; we'll call G2&lt;/span&gt;&lt;/b&gt;. To find G2, we take a random point and multiply by #&lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt;/r&lt;sup&gt;2&lt;/sup&gt;.&lt;br /&gt;&lt;pre&gt;sage: g2=E.random_point() * Integer(E.order()/r^2)&lt;br /&gt;sage: g2.order()&lt;br /&gt;9524793149788155121&lt;br /&gt;sage: g2&lt;br /&gt;(28930072329430674*a^11 + 3476916985694553167*a^10 + 7416446501236864153*a^9 + 1546806533803993509*a^8 + 9258625410126221791*a^7 + 3946459769382694037*a^6 + 9082757750092742366*a^5 + 4925994372571715422*a^4 + 9356115311475410715*a^3 + 3239246275650681784*a^2 + 2530023797852594208*a + 2582477270547956977 : 4569041207989982512*a^11 + 392122047555439583*a^10 + 53398003196643395*a^9 + 2471082114350274565*a^8 + 3769727620341931341*a^7 + 2253879482993753613*a^6 + 7323759157123465679*a^5 + 1956558743620835276*a^4 + 1065433853209237195*a^3 + 8009494946720473686*a^2 + 8874621118513866374*a + 544373368025887171 : 1)&lt;br /&gt;&lt;/pre&gt;We see that &lt;b&gt;g2&lt;/b&gt; is not in G1 and its order is the prime r so G2 = &amp;lt;&lt;b&gt;g2&lt;/b&gt;&amp;gt;. Now, &lt;b&gt;g1&lt;/b&gt; and &lt;b&gt;g2&lt;/b&gt; together form a sort of basis by which all of &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt;[r&lt;sup&gt;2&lt;/sup&gt;] can be generated; every element in &lt;b&gt;&lt;i&gt;E&lt;/i&gt;&lt;/b&gt;[r&lt;sup&gt;2&lt;/sup&gt;] can be written as a*&lt;b&gt;g1&lt;/b&gt; + b*&lt;b&gt;g2&lt;/b&gt; where a,b from Z&lt;sub&gt;r&lt;/sub&gt;.&lt;br /&gt;&lt;br /&gt;We'll have the pairing map G1 x G2 -&amp;gt; F&lt;sub&gt;p&lt;sup&gt;12&lt;/sup&gt;&lt;/sub&gt;. The input groups must be different, otherwise the points will be linearly dependent and the pairing will become degenerate. G1's members' coordinates have a nice compact representation of a single ground field element while each of G2's members's coordinates require 12 ground field elements. The public key &lt;b&gt;P&lt;/b&gt; should then live in G2 while the signature &lt;b&gt;S&lt;/b&gt; lives in G1. Choose private key x and compute:&lt;br /&gt;&lt;pre&gt;sage: x = 1223334444333221111&lt;br /&gt;sage: P = g2*x&lt;br /&gt;sage: P&lt;br /&gt;(9234041514029458289*a^11 + 7779915664763212307*a^10 + 6346523241154805362*a^9 + 5513000999900352828*a^8 + 7183243026634094341*a^7 + 6887819078187130363*a^6 + 5522347192587339249*a^5 + 832499822664426562*a^4 + 1305341026780126317*a^3 + 5936146128578535690*a^2 + 474243480778556212*a + 6400173802196845754 : 4965553112357672903*a^11 + 3816268899954016796*a^10 + 359467867455554913*a^9 + 212427926173001815*a^8 + 5152204995298522178*a^7 + 915090504523216963*a^6 + 8111126461946895687*a^5 + 318194623178172360*a^4 + 8053089739653482422*a^3 + 171210160812342620*a^2 + 6985863117841018225*a + 122495515023342804 : 1)&lt;/pre&gt;To convert a message (the user name input to the crackme) to a point in G1, we just convert the name to a number and multiply generator &lt;b&gt;g1&lt;/b&gt;. Suppose the name converts to 123456, then the signature is simply:&lt;br /&gt;&lt;pre&gt;sage: M = 123456*g1&lt;br /&gt;sage: M&lt;br /&gt;(5525487180627916384 : 8968938521026939071 : 1)&lt;br /&gt;sage: S = x*M&lt;br /&gt;sage: S&lt;br /&gt;(7298443986699715260 : 507887173084537875 : 1)&lt;/pre&gt;You can store just one of the coordinates and a bit to distinguish candidate roots when solving the other coordinate. Despite sections in the BN paper specifically aimed at helping the reader compress points by solving cube roots, I failed to understand and implement this in time and the crackme had to be supplied with both coordinates :( You can hardly call this a short signature. Anyways, verifying the signature now is verifying the DH tuple (&lt;b&gt;g2&lt;/b&gt;, &lt;b&gt;P&lt;/b&gt;, &lt;b&gt;M&lt;/b&gt;, &lt;b&gt;S&lt;/b&gt;) = (&lt;b&gt;g2&lt;/b&gt;, x*&lt;b&gt;g2&lt;/b&gt;, 123456&lt;b&gt;g1&lt;/b&gt;, 123456x*&lt;b&gt;g1&lt;/b&gt;). We compare e(x*&lt;b&gt;g2&lt;/b&gt;, &lt;b&gt;M&lt;/b&gt;) with e(&lt;b&gt;g2&lt;/b&gt;, 123456x*&lt;b&gt;g1&lt;/b&gt;) and hopefully get e(&lt;b&gt;g2&lt;/b&gt;,&lt;b&gt;g1&lt;/b&gt;)&lt;sup&gt;123456x&lt;/sup&gt;:&lt;br /&gt;&lt;pre&gt;sage: g2.weil_pairing(S,r)&lt;br /&gt;3636921704439622827*a^11 + 7161351127997094877*a^10 + 7731397384313800342*a^9 + 2976376815617375612*a^8 + 6846986400478961310*a^7 + 7580008168259595715*a^6 + 715697510382978485*a^5 + 5707351599709597252*a^4 + 7748158347504684570*a^3 + 9039946616134562331*a^2 + 2408156042808436778*a + 72829371319520371&lt;br /&gt;sage: P.weil_pairing(M,r)&lt;br /&gt;3636921704439622827*a^11 + 7161351127997094877*a^10 + 7731397384313800342*a^9 + 2976376815617375612*a^8 + 6846986400478961310*a^7 + 7580008168259595715*a^6 + 715697510382978485*a^5 + 5707351599709597252*a^4 + 7748158347504684570*a^3 + 9039946616134562331*a^2 + 2408156042808436778*a + 72829371319520371&lt;br /&gt;sage: g2.weil_pairing(g1,r) ^ (123456*x)&lt;br /&gt;3636921704439622827*a^11 + 7161351127997094877*a^10 + 7731397384313800342*a^9 + 2976376815617375612*a^8 + 6846986400478961310*a^7 + 7580008168259595715*a^6 + 715697510382978485*a^5 + 5707351599709597252*a^4 + 7748158347504684570*a^3 + 9039946616134562331*a^2 + 2408156042808436778*a + 72829371319520371&lt;/pre&gt;All the same result! Sanity check passed! Here's an attempt to diagram the entire process. Please don't trust this for correctness:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-9vp1fQ_W0SY/TZ6xN3Kb4fI/AAAAAAAAAA0/GZiC2qCzZkI/s1600/pairing2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img src="http://3.bp.blogspot.com/-9vp1fQ_W0SY/TZ6xN3Kb4fI/AAAAAAAAAA0/GZiC2qCzZkI/s400/pairing2.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5593102638944870898" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 400px; height: 300px; " /&gt;&lt;/a&gt;&lt;div&gt;&lt;g1&gt;&lt;a href="http://3.bp.blogspot.com/-9vp1fQ_W0SY/TZ6xN3Kb4fI/AAAAAAAAAA0/GZiC2qCzZkI/s1600/pairing2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;/a&gt;&lt;br /&gt;To forge signatures... well that's the cracker's job. Read Dcoder's solution to learn how, along with quick ways to destroy the other challenges. Thanks and congratulations again to him, a clear champion among keygenners!&lt;/g1&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;g1&gt;&lt;br /&gt;&lt;/g1&gt;&lt;/div&gt;&lt;div&gt;&lt;g1&gt;&lt;a href="http://crackmes.de/users/andrewl.us/shmoocon_2011_crypto_challenge_pack/solution/dcoder"&gt;http://crackmes.de/users/andrewl.us/shmoocon_2011_crypto_challenge_pack/solution/dcoder&lt;/a&gt;&lt;/g1&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-5928612314589265769?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/5928612314589265769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2011/04/shmoocon-2011-crypto-pack-solved.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5928612314589265769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5928612314589265769'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2011/04/shmoocon-2011-crypto-pack-solved.html' title='Shmoocon 2011 Crypto Pack Solved! And Pairings And SAGE!'/><author><name>andrewl</name><uri>http://www.blogger.com/profile/15585896448040772484</uri><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://1.bp.blogspot.com/-KjP_VbQWzB4/TZ6y5gvaMTI/AAAAAAAAAA8/GtEe14FqUcU/s72-c/dcoder_sol_screenshot.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-3217141422659868923</id><published>2011-04-06T22:11:00.007-04:00</published><updated>2011-04-06T22:32:46.942-04:00</updated><title type='text'>[HBK]'s "Indiana Jones and the Wizard of Oz"</title><content type='html'>&lt;p&gt;[difficulty: 2][protection: Stone Temple Puzzle]&lt;/p&gt;&lt;div style="margin-left: auto; margin-right: auto"&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/-BWIktXvn-wk/TZ0eYnO36cI/AAAAAAAAAAs/T9a7bFy36ps/s320/indiana.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;[HBK]'s first submissions is a fun and creative crackme. Don't let the difficulty fool you! "...to gain access to the cave, all the letter 'tablets' must be 'pushed' hmm.. no problem for indiana !!!" :)&lt;/p&gt;&lt;a href="http://crackmes.de/users/hbk/indiana_jones_si_vrajitorul_din_oz/"&gt;http://crackmes.de/users/hbk/indiana_jones_si_vrajitorul_din_oz/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-3217141422659868923?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/3217141422659868923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2011/04/hbks-indiana-jones-and-wizard-of-oz.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3217141422659868923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3217141422659868923'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2011/04/hbks-indiana-jones-and-wizard-of-oz.html' title='[HBK]&apos;s &quot;Indiana Jones and the Wizard of Oz&quot;'/><author><name>andrewl</name><uri>http://www.blogger.com/profile/15585896448040772484</uri><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://1.bp.blogspot.com/-BWIktXvn-wk/TZ0eYnO36cI/AAAAAAAAAAs/T9a7bFy36ps/s72-c/indiana.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-5505619794734336068</id><published>2011-03-16T12:03:00.016-04:00</published><updated>2011-03-22T01:47:55.381-04:00</updated><title type='text'>Wireshark as 010 Editor Alternative?</title><content type='html'>&lt;p&gt;Why couldn't Wireshark's packet dissection capabilities be used as an open-source alternative to 010 Editor's binary template feature?&lt;/p&gt;&lt;p&gt;Pros:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;free, open source&lt;/li&gt;&lt;li&gt;C &gt; 010's BT language&lt;/li&gt;&lt;li&gt;python support?&lt;/li&gt;&lt;/ul&gt;Cons:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;much harder to write&lt;/li&gt;&lt;li&gt;no editor, just viewer&lt;/li&gt;&lt;li&gt;extra preparation step&lt;/li&gt;&lt;li&gt;bugs&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;To prepare a file for Wireshark's consumption, we must make it look like a PCAP capture file. Luckily &lt;a href="http://wiki.wireshark.org/Development/LibpcapFileFormat"&gt;the PCAP format&lt;/a&gt; is not too complicated. Data link type is chosen as DLT_USER0 which is supposedly reserved for private use. The rest of the details are implemented in this tool:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s1600/asdf"&gt;&lt;img src="http://2.bp.blogspot.com/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s320/asdf" border="0" alt="" id="BLOGGER_PHOTO_ID_5586775365116218978" style="float: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; cursor: pointer; width: 16px; height: 16px; " /&gt;&lt;/a&gt;&lt;a href="http://andrewl.dreamhosters.com/archive/46757124.c"&gt;pcap-wrap.c&lt;/a&gt; - wrap files in pcap capture format&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The easiest way to setup an environment for building plugins is to &lt;a href="http://www.wireshark.org/download.html"&gt;download the Wireshark source&lt;/a&gt; (version 1.4.4 used here) and build it. It works very well being built in its source directory. Autogen, configure with --with-ssl, and make. In the root of the source tree will be the Wireshark executable and config.h which you will include in your plugin source to define preprocessor variables which are read in the other Wireshark includes. Plugins are just shared objects that are read (among other places) from ~/.wireshark/plugins/.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Writing plugins is a real pain at first. See docs/README.developer. Each subtree must be described before its used. Each field, too, must be described in excruciating detail via an hf_register_info struct. I think the whole mess is justified by this line from the docs: "By strictly defining (or "typing") the data that can be attached to a proto tree, searching and filtering becomes possible." It's never fully explained that "items" are both the little data fields themselves, but also required for attachment by subtrees. A subtree cannot have subtree directly; it must have an item which can then have a subtree.&lt;br /&gt;&lt;br /&gt;Much code can be generated (will show in a future blog post) and in fact, some of the example plugins shown from epan/dissectors/* are generated. See packet-rrc.c which weights in at over 7MB! Anyways, as a proof of concept, I made a dissector for the &lt;a href="https://ccrma.stanford.edu/courses/422/projects/WaveFormat/"&gt;canonical WAV file format&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s1600/asdf"&gt;&lt;img src="http://2.bp.blogspot.com/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s320/asdf" border="0" alt="" id="BLOGGER_PHOTO_ID_5586775365116218978" style="float: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; cursor: pointer; width: 16px; height: 16px; " /&gt;&lt;/a&gt;&lt;a href="http://andrewl.dreamhosters.com/archive/38116878.c"&gt;packet-wav.c&lt;/a&gt; - dissector for canonical WAV files&lt;br /&gt;&lt;br /&gt;Nearly every rule in the coding style / compatibility section was broken in this code and there's probably leaks and security problems; just a disclaimer. So what does it look like?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;img src="http://andrewl.dreamhosters.com/archive/78542498.png" /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can click fields in the tree struct and the hex view will highlight the corresponding bytes and visa-versa.&lt;br /&gt;&lt;br /&gt;Now can we simplify things? If we forfeit the ability to do the advanced filter expressions, we can declare just one "dummy" field and subtree, and use its handle every time we add a field and subtree. Instead of relying on Wireshark to format the data for us (and using its complicated string lookup and bitfield mechanisms), we add most things with field type FT_NONE and with *_format() functions, supplying our own strings. Often you can just tack on additional data to an item via proto_item_append_text(). Here's take two:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s1600/asdf"&gt;&lt;img src="http://2.bp.blogspot.com/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s320/asdf" border="0" alt="" id="BLOGGER_PHOTO_ID_5586775365116218978" style="float: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; cursor: pointer; width: 16px; height: 16px; " /&gt;&lt;/a&gt;&lt;a href="http://andrewl.dreamhosters.com/archive/59388721.c"&gt;packet-wav-new.c&lt;/a&gt; - a clearer dissector for canonical WAV files&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;You'll also need:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s1600/asdf"&gt;&lt;img src="http://2.bp.blogspot.com/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s320/asdf" border="0" alt="" id="BLOGGER_PHOTO_ID_5586775365116218978" style="float: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; cursor: pointer; width: 16px; height: 16px; " /&gt;&lt;/a&gt;&lt;div&gt;&lt;a href="http://andrewl.dreamhosters.com/archive/48312620."&gt;Makefile&lt;/a&gt; - for GNU make to build pcap-wrap utility and wav dissectors&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;A WAV file is almost a disappointing example, but again it was just for POC. Here's Wireshark chewing on something a little more complicated:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://andrewl.dreamhosters.com/archive/54585568.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A bug exists in wireshark where if more than one dissector for "wtap_encap" exists in the plugins directory, plugin tests will not continue after the first, even if the first plugin answers "no" (returning 0) from its dissect() function.&lt;/div&gt;&lt;div&gt;packet-whatever.c: dissect() (returns 0)&lt;br /&gt;wireshark/epan/packet.c: call_dissector_work() (returns 0)&lt;br /&gt;wireshark/epan/packet.c: dissector_try_port_new() (returns FALSE)&lt;br /&gt;wireshark/epan/packet.c: dissector_try_port() (returns FALSE)&lt;br /&gt;wireshark/epan/dissectors/packet-frame.c: dissect_frame() (doesn't try other dissectors in sub_dissectors)&lt;br /&gt;&lt;br /&gt;I don't have the wireshark know-how to make a proper fix/patch and &lt;a href="https://bugs.wireshark.org/"&gt;Wireshark bug database&lt;/a&gt; is down at the moment. It sucks but for now I make sure just one of these plugins are present to wireshark at a time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So do you think this practical? Or is it just not the right tool for the job?&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-5505619794734336068?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/5505619794734336068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2011/03/wireshark-as-010-editor-alternative.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5505619794734336068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5505619794734336068'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2011/03/wireshark-as-010-editor-alternative.html' title='Wireshark as 010 Editor Alternative?'/><author><name>andrewl</name><uri>http://www.blogger.com/profile/15585896448040772484</uri><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/-7q-kI4dgkps/TYg2mDWnzmI/AAAAAAAAAAk/0GEyNJsuJc8/s72-c/asdf' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-1573577106267630188</id><published>2011-02-15T17:00:00.007-05:00</published><updated>2011-02-15T17:07:46.013-05:00</updated><title type='text'>Waganono's "Root Me #1"</title><content type='html'>[difficulty: 5][protection: ???]&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/-QtqcyTF6wUs/TVr4ovOFKQI/AAAAAAAAAAc/nsOAD1IiJD4/s320/waganono.PNG" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;Waganono appears to be back! After solving CHAAK's maze crackme "Keygenme #1" earlier this month, he's submitted a new keygenme. It's not too hard and not too easy! Check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1573577106267630188?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1573577106267630188/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2011/02/waganonos-root-me-1.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1573577106267630188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1573577106267630188'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2011/02/waganonos-root-me-1.html' title='Waganono&apos;s &quot;Root Me #1&quot;'/><author><name>andrewl</name><uri>http://www.blogger.com/profile/15585896448040772484</uri><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://4.bp.blogspot.com/-QtqcyTF6wUs/TVr4ovOFKQI/AAAAAAAAAAc/nsOAD1IiJD4/s72-c/waganono.PNG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-4927807134815856458</id><published>2011-02-02T13:35:00.007-05:00</published><updated>2011-02-02T13:46:55.931-05:00</updated><title type='text'>Shmoocon 2011 Crypto Challenge Pack</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;img src="http://3.bp.blogspot.com/_RKOvgf9kD3s/TUmkKXX2kuI/AAAAAAAAAAM/2qFPXZkMaTQ/s320/pairing1.png" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;The Ghost In The Shellcode organizers gave me the privilege again this year to write some challenges for their CTF event. Here are the contents of the README:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Shmoocon 2011 Cryptography Challenge Pack&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: courier new;" href="http://www.ghostintheshellcode.com/"&gt;http://www.ghostintheshellcode.com/&lt;/a&gt;&lt;br /&gt;&lt;a style="font-family: courier new;" href="https://www.shmoocon.org/ghost_in_the_shellcode"&gt;https://www.shmoocon.org/ghost_in_the_shellcode&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;These are the cryptography challenges submitted to the Shmoocon 2011 "Ghost In&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;The Shellcode" organizers for potential use in the CTF event and December&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;qualifier.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Challenges were made with a few features to facilitate analysis:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1) open source (skip the disassembly-&gt;algorithm translation phase)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;2) calculations, input, output are all in decimal, allowing easy entry of&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;values between external tools&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Python?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;1) seems program logic is easy to understand even without knowing Python&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;2) debugger is easy to use (python -mpdb chall1.py) but you probably won't need&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;it&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;3) installs nearly everywhere&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;4) tested with 2.6.5&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;-------------------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;I hope you find these algorithms easy to understand, interesting, but&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;challenging to keygen. Chall4 and Chall5 are exceptions :)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://crackmes.de/users/andrewl.us/shmoocon_2011_crypto_challenge_pack/"&gt;http://crackmes.de/users/andrewl.us/shmoocon_2011_crypto_challenge_pack/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4927807134815856458?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4927807134815856458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2011/02/shmoocon-2011-crypto-challenge-pack.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4927807134815856458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4927807134815856458'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2011/02/shmoocon-2011-crypto-challenge-pack.html' title='Shmoocon 2011 Crypto Challenge Pack'/><author><name>andrewl</name><uri>http://www.blogger.com/profile/15585896448040772484</uri><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/_RKOvgf9kD3s/TUmkKXX2kuI/AAAAAAAAAAM/2qFPXZkMaTQ/s72-c/pairing1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-1561335885929911894</id><published>2011-01-10T00:56:00.001-05:00</published><updated>2011-01-10T00:57:06.135-05:00</updated><title type='text'>2011 Shmoocon CTF Warmup Results</title><content type='html'>The 2011 Shmoocon Ghost In The Shellcode CTF warmup event went well this weekend. There were three challenges: an image puzzle riddle thing, a cryptography challenge, and an exploit challenge. See for yourself at &lt;a href="http://ghostintheshellcode.com/2011/"&gt;http://ghostintheshellcode.com/2011/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Unfortunately the crypto one fell faster than I expected and ended up being the easiest challenge of the three! LarsH and kaliman submitted a solution in just 28 minutes! From the chat, I gathered that people solved it in three ways:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;typing the equations into wolfram alpha (this tool is becoming very popular! see recent solutions by tamaroth at crackmes.de among others)&lt;/li&gt;&lt;li&gt;using the &lt;a href="http://en.wikipedia.org/wiki/Chinese_remainder_theorem"&gt;Chinese remainder theorem&lt;/a&gt; (intended method)&lt;/li&gt;&lt;li&gt;using the &lt;a href="http://en.wikipedia.org/wiki/Method_of_successive_substitution"&gt;method of successive substitution&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;I've never seen the third method until now! Can there exist systems where CRT fails but this method finds a solution?&lt;br /&gt;&lt;br /&gt;The third challenge ended up being really really interesting and apparently the hardest. Awesie, the only solver and winner of the warmup and Shmoocon barcode, graciously details his methods for the public: &lt;a href="http://ppp.cylab.cmu.edu/wordpress/?p=410"&gt;http://ppp.cylab.cmu.edu/wordpress/?p=410&lt;/a&gt;. Congratulations awesie!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1561335885929911894?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1561335885929911894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2011/01/shmoocon-ctf-warmup-results.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1561335885929911894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1561335885929911894'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2011/01/shmoocon-ctf-warmup-results.html' title='2011 Shmoocon CTF Warmup Results'/><author><name>andrewl</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-1546617459093993319.post-4927269201695021562</id><published>2010-10-22T03:13:00.011-04:00</published><updated>2010-10-25T09:52:18.833-04:00</updated><title type='text'>One Hell of an Anti-Debug! HideFromDebugger</title><content type='html'>A target appears to have no protection whatsoever, allowing debug attach, stepping, breakpoint, etc. When a critical area is reached, however, the debugger seems to not work at all - the breakpoint instruction and single-step exceptions (C0000003, C0000004) get passed right over the debugger and to the target, where it displays an error message.&lt;br /&gt;&lt;br /&gt;Since my breakpoints were at User32's WaitMessageWhatever return, this would happen if my mouse went over the window, giving the cool effect that the frozen target was still alive, detecting my efforts in real time. So what to do now?&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;checked windbg on another machine, then olly - all tests exhibit same behavior&lt;br /&gt;&lt;/li&gt;&lt;li&gt;compared PEB and TIB before and after the protection looking for some magical flag setting crap that the target may be doing.... no big differences&lt;br /&gt;&lt;/li&gt;&lt;li&gt;the target loads drivers, so fearing some rootkit behavior, compared nt!KiTrap03 before and after the protection, no changes&lt;br /&gt;&lt;/li&gt;&lt;li&gt;continuing this way, compared nt!CommonDispatchException and then nt!KiDispatchException, still no differences&lt;br /&gt;&lt;/li&gt;&lt;li&gt;using the leaked Windows 2000 source (from torrent), omeg's fine comments on KiDispatchException (&lt;a href=http://omeg.pl/code/XP_32_KiDispatchException.txt&gt;http://omeg.pl/code/XP_32_KiDispatchException.txt&lt;/a&gt;) and ReactOS (&lt;a href=http://doxygen.reactos.org/db/da4/ntoskrnl_2ke_2i386_2exp_8c_a660d1a46ff201c5861caf9667937f73f.html#a660d1a46ff201c5861caf9667937f73f&gt;http://doxygen.reactos.org/blah/blah&lt;/a&gt;) it was easy to create an annotated IDA listing of my particular ontkrnlpa.exe&lt;br /&gt;&lt;/li&gt;&lt;li&gt;traced the difference to a call to nt!DbgkForwardException which would return 0 during the protection - tracing is a little complicated by the way: KiDispatchException is part of the logic path that eventually communicates with KD itself - it splits into two paths several times depending on whether the exception came from user or kernel mode - obviously you can only use KD (insert BP, single-step) on the user mode paths otherwise the CPU will loop, interrupting on the same BP continuously&lt;br /&gt;&lt;/li&gt;&lt;li&gt;tracing into this, found this crap:&lt;br /&gt;&lt;pre&gt;nt!DbgkForwardException+0x2b:&lt;br /&gt;80639e31 64a124010000    mov     eax,dword ptr fs:[00000124h] &lt;br /&gt;80639e37 f6804802000004  test    byte ptr [eax+248h],4&lt;br /&gt;80639e3e 7404            je      nt!DbgkForwardException+0x3e (80639e44) ; success&lt;br /&gt;80639e40 33c0            xor     eax,eax ; zero return value, indicating failure&lt;br /&gt;&lt;/pre&gt;this value was 4 during the protection, so the je/jz was skipped and the failure path taken - patching this in memory allowed breakpoints and stepping to happen!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;so wtf is this check? ReactOS again is indispensible, with its code for DbgkForwardException - didn't take much to match this up:&lt;br /&gt;&lt;pre&gt;00338     /* Check if this is to be sent on the debug port */&lt;br /&gt;00339     if (DebugPort)&lt;br /&gt;00340     {&lt;br /&gt;00341         /* Use the debug port, unless the thread is being hidden */&lt;br /&gt;00342         Port = PsGetCurrentThread()-&amp;gt;HideFromDebugger ?&lt;br /&gt;00343                NULL : Process-&amp;gt;DebugPort;&lt;br /&gt;00344     }&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;finally, googled for this HideFromDebugger and found ivanlef0u's page (&lt;a href=http://www.ivanlef0u.tuxfamily.org/?p=48&gt;http://www.ivanlef0u.tuxfamily.org/?p=48&lt;/a&gt;) where he explains this protection completely over 3 years ago! man am I behind!&lt;br /&gt;&lt;/ol&gt;Anyways, two days lost to a protection that amounts to a single NtSetInformationThread() call from the target. Am I upset? No, I'm lucky these more skilled reversers published their findings  otherwise this would have taken so much longer.  &lt;p&gt;&lt;b&gt;Oct 22, 2010 EDIT&lt;/b&gt;: upb sent me this &lt;a href=http://www.rootkit.com/board.php?did=edge284&amp;closed=0&amp;lastx=15&gt;rootkit.com link&lt;/a&gt; dating back to 2005 so this may not be news to anybody&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4927269201695021562?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4927269201695021562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/10/one-hell-of-anti-debug.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4927269201695021562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4927269201695021562'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/10/one-hell-of-anti-debug.html' title='One Hell of an Anti-Debug! HideFromDebugger'/><author><name>andrewl</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-1546617459093993319.post-7542486894093171928</id><published>2010-08-13T01:36:00.010-04:00</published><updated>2010-08-17T11:20:53.027-04:00</updated><title type='text'>Shmoocon 2010 Crypto Pack Solved! And Hidden Monomials!</title><content type='html'>&lt;center&gt;&lt;br /&gt;&lt;img src="http://4.bp.blogspot.com/_I5FRefiygsU/TGqoh9U81XI/AAAAAAAAABs/RoH74diBCqY/s1600/crypto4.png " /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;So Shmoocon 2010 challenge pack finally has a published solution! See numernia's solution &lt;a href="http://crackmes.de/users/andrewl.us/shmoocon_2010_crypto_challenge_pack/"&gt;here&lt;/a&gt; where he used MAGMA's Grobner basis facilities and jB's keygen source &lt;a href="http://jardinezchezjb.free.fr/crackmes.de/shmoocon/"&gt;here&lt;/a&gt; where he never mentioned how the parameters of the keygen were arrived at. Of the five challenges only crypto4, the "taste of post-quantum" binary, had something new in it.&lt;br /&gt;&lt;br /&gt;The equations you see are the most explicit way to represent MQ system (no lookup table or other type of "compression" was used as in gbe32241's work). See the HFE challenge &lt;a href="http://www.minrank.org/challenge1.tx"&gt;here&lt;/a&gt; for a very similar setup.&lt;br /&gt;&lt;br /&gt;I think the start of all these schemes was the MI C* scheme (see paper "Public Quadratic Polynomial-Tuples For Efficient Signature-Verification and Message-Encryption" by Matsumoto and Imai). The best explanation I've found though is probably in Koblitz's &lt;u&gt;Algebraic Aspects &lt;/u&gt;&lt;u&gt;of Cryptography&lt;/u&gt;.&lt;br /&gt;&lt;br /&gt;So the main idea is that you can compute certain exponentiations in an extension field in an alternative way. First you treat the extension field elements as a vector space over the base field. This vector space has many basis to choose from, and any element can also be represented in terms of any chosen basis (the canonical one works just fine). Carefully chosen exponents of these elements resolve to linear transformations and linear expressions of the vectors. And the product of two of these special exponents resolves to a quadratic system of equation. I gave clue "Remember that an extension field is a vector space over its ground field."&lt;br /&gt;&lt;br /&gt;The MI scheme and schemes to follow (HFE and so-on) do their best to hide this exponentiation by wrapping the expression for the exponentiation in linear transformations or adding/removing variables and equations. It's these obfuscating elements that become the private information. You didn't have to worry about any of this due to the clue: "there is no scheme in the system, no trapdoor".&lt;br /&gt;&lt;br /&gt;So how to solve this thing? Let's treat the system like a black box. If you suspect that the black box is performing exponentiation, what's the simplest test to affirm this? Send in the identity: {1}. No matter the exponent, the identity will be returned. In the polynomial basis representation of the elements, we still don't know which direction the coefficients are listed though. No problem. With a 40-bit input, we try a 1 coefficient at either end:&lt;br /&gt;&lt;pre&gt;blackbox(0x8000000000); // returns 000000E0BCE7BA8A&lt;br /&gt;blackbox(0x0000000001); // returns 0000000000000001&lt;/pre&gt;Cool so now we know the LSB of the input is the 0'th coefficient, and it is easy to send in {1}, {x}, {x+1}, etc. But we are faced with a new problem: we don't know what reduction polynomial is used in the field computations. There is only one GF(2^40) field, but the same elements have drastically different representations depending on the reducing polynomial (math nerds talk about isomorphism here).&lt;br /&gt;&lt;br /&gt;Can we craft some probe inputs so that the black box will yield to us its reduction polynomial? Yes!&lt;br /&gt;&lt;br /&gt;We send element {x}. The blackbox will give us {x}^e (mod p) where e is the unknown exponent and p is the unknown reduction polynomial. We send also element {x^2} and the blackbox will return to us {x^2}^e (mod p) = {x}^(2e) (mod p).&lt;br /&gt;&lt;br /&gt;Both of these results are already reduced (mod p). But *OUTSIDE* of the blackbox, we square the first result ourselves on the left hand side, and equate to the second result on the right hand side:&lt;br /&gt;&lt;pre&gt;({x}^e (mod p))^2 = {x}^(2e) (mod p)&lt;br /&gt;-&amp;gt; p | ({x}^e (mod p))^2 - {x}^(2e)&lt;br /&gt;-&amp;gt; p * q = ({x}^e (mod p))^2 - {x}^(2e)&lt;/pre&gt;And q is just some other polynomial. So we compute the right hand side of this last equation and factor it, hoping to find some large 40-degree irreducible polynomial! Enough talk, let's do it!&lt;br /&gt;&lt;pre&gt;blackbox(0x0000000002 /* {x} */); // returns 0x0EFFD5DBF6 which is {x^n}&lt;br /&gt;blackbox(0x0000000004 /* {x^2} */); // returns 0x0400040008 which is {x^(2n)}&lt;/pre&gt;Let's flee to our CAS now, the venerable PARI/GP! We convert these results to polynomials a, b:&lt;br /&gt;&lt;pre&gt;a = (x^35 + x^34 + x^33 + x^31 + x^30 + x^29 + x^28 + x^27 + x^26 + x^25 + x^24 + x^23 + \&lt;br /&gt;     x^22 + x^20 + x^18 + x^16 + x^15 + x^14 + x^12 + x^11 + x^9  + x^8  + x^7  + x^6  + \&lt;br /&gt;     x^5  + x^4  + x^2  + x)*Mod(1,2)&lt;br /&gt;b = (x^34 + x^18 + x^3)*Mod(1,2)&lt;/pre&gt;And finally reveal our p!&lt;br /&gt;&lt;pre&gt;lift(factor(a*a + b))&lt;br /&gt;[x 2]&lt;br /&gt;[x^2 + x + 1 1]&lt;br /&gt;[x^12 + x^9 + x^5 + x^4 + x^2 + x + 1 1]&lt;br /&gt;[x^14 + x^13 + x^11 + x^10 + x^7 + x^6 + x^3 + x + 1 1]&lt;br /&gt;[x^40 + x^38 + x^37 + x^36 + x^35 + x^33 + x^30 + x^29 + x^27 + x^26 + x^24 + x^23 + x^22 + \&lt;br /&gt; x^19 + x^15 + x^14 + x^12 + x^11 + x^6 + x^5 + 1 1]&lt;/pre&gt;It is the last 40-degree polynomial, converted to bit representation, it's 0x017A6DC8D861.&lt;br /&gt;&lt;br /&gt;Finding the exponent e is simple now: you may brute outright, brute only exponents that are coprime with ord(GF*(2^40)) (else the blackbox is not a bijection), or use Coppersmith or whatever your CAS uses. It's low, just 257.&lt;br /&gt;&lt;br /&gt;So the blackbox is doing exponentiation by 257 and field elements are represented bit-wise with the discovered polynomial. To invert, just exponentiate by d = 257^-1 (mod ord(GF*(2^40))) = 551894941568.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-7542486894093171928?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/7542486894093171928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/08/shmoocon-2010-crypto-pack-solved.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7542486894093171928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7542486894093171928'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/08/shmoocon-2010-crypto-pack-solved.html' title='Shmoocon 2010 Crypto Pack Solved! And Hidden Monomials!'/><author><name>andrewl</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://4.bp.blogspot.com/_I5FRefiygsU/TGqoh9U81XI/AAAAAAAAABs/RoH74diBCqY/s72-c/crypto4.png ' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-1363885177724563105</id><published>2010-05-29T01:09:00.001-04:00</published><updated>2010-05-29T01:09:55.977-04:00</updated><title type='text'>Conjan's "Jump Around"</title><content type='html'>[difficulty: 3][protection: mild asm obfuscation, trigonometry equation]&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_I5FRefiygsU/TACgslrYXnI/AAAAAAAAABc/kE8RSEfH7Pk/s1600/conjan.PNG" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;The serial verification function's instructions are reordered and linked with unconditional jumps. The solution shows how to disassemble the code into a linked list of instructions, remove the jumps, and recover the original code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1363885177724563105?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1363885177724563105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/05/conjans-jump-around.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1363885177724563105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1363885177724563105'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/05/conjans-jump-around.html' title='Conjan&apos;s &quot;Jump Around&quot;'/><author><name>andrewl</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://1.bp.blogspot.com/_I5FRefiygsU/TACgslrYXnI/AAAAAAAAABc/kE8RSEfH7Pk/s72-c/conjan.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-6060810795844782714</id><published>2010-05-14T16:39:00.002-04:00</published><updated>2010-05-28T14:28:55.423-04:00</updated><title type='text'>SEH Checklist</title><content type='html'>Trying to collect here the requirements that windows (32-bit) enforces before calling back an SEH handler that you've manually written into the SEH chain. Please comment anything you know.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;seh node must be on stack (thanks JPassing.com)&lt;/li&gt;&lt;li&gt;seh handler must be on non-stack (thanks JPassing.com)&lt;/li&gt;&lt;li&gt;seh handler nodes must appear in-order on the stack (imagine deeper functions' frames going up the stack, towards lower (less quantity) addresses) (thanks roxfan and Clandestiny post on woodmann)&lt;/li&gt;&lt;li&gt;seh handler must exist in safeseh list (if it exists, see IMAGE_LOAD_CONFIG_DIRECTORY.SEHandlerTable which is the IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG directory entry in IMAGE_OPTIONAL_HANDLER)&lt;/li&gt;&lt;li&gt;handler addresses in the safeseh list must be sorted ascending&lt;/li&gt;&lt;li&gt;IMAGE_OPTIONAL_HEADER.DllCharacteristics must not have flag set IMAGE_DLLCHARACTERISTICS_NO_SEH (this is set by default for Visual Studio when compiling with /SafeSEH:no and no other handlers present (yes even for exe's) ...caught by RtlCaptureImageExceptionValues() WARNING: LET ME RETRACT THIS, NOT ALWAYS)&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;May 28th, 2010 EDIT:&lt;/b&gt;&lt;br /&gt;As&amp;nbsp;Ivanlef0u commented, analysis of&amp;nbsp;RtlIsValidHandler() itself trumps any type of listing we could possibly do. Check his links:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;http://www.eeye.com/html/resources/newsletters/vice/VI20060830.html&lt;/li&gt;&lt;li&gt;http://sf-freedom.blogspot.com/2007/07/ms07-029-series-part-2-exploiting-dns.html&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-6060810795844782714?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/6060810795844782714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/05/seh-checklist.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6060810795844782714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6060810795844782714'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/05/seh-checklist.html' title='SEH Checklist'/><author><name>andrewl</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-1546617459093993319.post-3061118174777860533</id><published>2010-03-28T01:43:00.006-04:00</published><updated>2010-05-13T16:35:09.202-04:00</updated><title type='text'>Neotren's CryptoME</title><content type='html'>[difficulty: 7][protection: RSA (2034 bit), Schnorr Signature]&lt;br /&gt;&lt;center&gt;&lt;div style="text-align: auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;img height="190" src="http://3.bp.blogspot.com/_I5FRefiygsU/S67sVtnw_lI/AAAAAAAAABE/He9vw0snbk4/s400/neo2.PNG" width="400" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Your registration data is RSA decrypted, then checked for signature (DLP type). But the signature check uses the same modulus as in the RSA decryption part, giving you a clue to the existence of a subgroup, and the generator of that group. The exponent is capped at 7 bytes, making it possible to search cleverly within this range. Once the subgroup is found, a factor is revealed (and thus the other also). This is a long standing unsolved crackme on crackmes.de and unfortunately neotren had to clue us to the p-1 factoring algorithm, dropping the difficulty significantly.&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/_I5FRefiygsU/S67sYPz1y5I/AAAAAAAAABU/mCvYpljxX4Y/s1600/neo1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_I5FRefiygsU/S67sYPz1y5I/AAAAAAAAABU/mCvYpljxX4Y/s320/neo1.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Lately I read an article about how this one particular C64 user manual had nearly every detail of how the entire machine worked (insane depth compared to manuals of today) and then just a few days ago I read an announcement where the C64 is being re-released. I kind of want one of the classic machines for some reason :) And now this cool emulated game.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-3061118174777860533?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/3061118174777860533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/03/neos-cryptome.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3061118174777860533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3061118174777860533'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/03/neos-cryptome.html' title='Neotren&apos;s CryptoME'/><author><name>andrewl</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/_I5FRefiygsU/S67sVtnw_lI/AAAAAAAAABE/He9vw0snbk4/s72-c/neo2.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-5915743074197275866</id><published>2010-03-17T00:43:00.008-04:00</published><updated>2010-08-17T11:33:31.192-04:00</updated><title type='text'>MR.HAANDI's "Intersection #1.0"</title><content type='html'>[difficulty: 8][protection: ECC]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img src="http://1.bp.blogspot.com/_I5FRefiygsU/TGqqKwuNPcI/AAAAAAAAAB0/kPntG6MFrug/s1600/intersect.PNG" /&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;It's compiled against NTL and *alot* of code has to be sifted through to understand what is going on. It's a custom scheme:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;br /&gt;&lt;img src="http://2.bp.blogspot.com/_I5FRefiygsU/TGqrnwsym4I/AAAAAAAAAB8/8gcJbmrLiwo/s1600/intersect2.PNG"&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;To solve it, you need to express the PointB in terms of PointA multiplied by some coefficient k (solving the DLP). This can be done by finding the curve order (#E) and tracing the provided name/serial. But the DLP discovered here is inflated for this particular name/serial. After discovering how "close" PointA and PointB are in a subgroup, it can be reduced to its real value.&lt;br /&gt;&lt;br /&gt;Now a cubic equation arises because of the serial's exponent. The equation is reduced mod #E, which is composite. So it doesn't always have solutions. But you can produce many variations of the equation (one which hopefully DOES have a solution) by carefully tweaking the coefficient on the X^0 term.&lt;br /&gt;&lt;br /&gt;All crackme calculations are done using curves in the Jacobian intersection form, see:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Jacobian_curve"&gt;http://en.wikipedia.org/wiki/Jacobian_curve&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.hyperelliptic.org/EFD/g1p/auto-jintersect.html"&gt;http://www.hyperelliptic.org/EFD/g1p/auto-jintersect.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It was a real IRL killer. Equivalently, a great crackme :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-5915743074197275866?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/5915743074197275866/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/03/mrhaandis-intersection-10.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5915743074197275866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5915743074197275866'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/03/mrhaandis-intersection-10.html' title='MR.HAANDI&apos;s &quot;Intersection #1.0&quot;'/><author><name>andrewl</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://1.bp.blogspot.com/_I5FRefiygsU/TGqqKwuNPcI/AAAAAAAAAB0/kPntG6MFrug/s72-c/intersect.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-1067545550298530891</id><published>2010-02-09T11:34:00.006-05:00</published><updated>2010-05-13T16:41:06.201-04:00</updated><title type='text'>Shmoocon 2010 Crypto Challenge Pack</title><content type='html'>&lt;a href="http://andrewl.dreamhosters.com/archive/05130263.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" src="http://andrewl.dreamhosters.com/archive/05130263.png" style="display: block; height: 221px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 486px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;These are the crypto challenges from Shmoocon 2010's "Ghost in The Shellcode" CTF event (see http://www.shmoocon.org/gits.html). My goal was to make algos that can be grasped quickly (minimal reversing), but remain challenging to keygen. Example codes are given in each respective crackmes' GUI. As always, true keygens are the only real solutions :)&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;a href="http://crackmes.de/users/andrewl.us/shmoocon_2010_crypto_challenge_pack/"&gt;http://crackmes.de/users/andrewl.us/shmoocon_2010_crypto_challenge_pack/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1067545550298530891?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1067545550298530891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/02/shmoocon-2010-crypto-challenge-pack.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1067545550298530891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1067545550298530891'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/02/shmoocon-2010-crypto-challenge-pack.html' title='Shmoocon 2010 Crypto Challenge Pack'/><author><name>andrewl</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-1546617459093993319.post-6826043541125146819</id><published>2010-02-08T13:22:00.008-05:00</published><updated>2010-02-09T11:34:24.620-05:00</updated><title type='text'>Really slick way to calculate x % (2^32-1)</title><content type='html'>From Numernia's solution/analysis of WiteG #5:&lt;br /&gt;&lt;br /&gt;mul     dword ptr ds:[40120C]&lt;br /&gt;add     eax, edx&lt;br /&gt;adc     eax, 0&lt;br /&gt;&lt;br /&gt;The result is that eax = (eax * [40120C]) % (2^32-1)... Can you prove why?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-6826043541125146819?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/6826043541125146819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/02/really-slick-way-to-calculate-x-232-1.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6826043541125146819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6826043541125146819'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/02/really-slick-way-to-calculate-x-232-1.html' title='Really slick way to calculate x % (2^32-1)'/><author><name>andrewl</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-1546617459093993319.post-8967228727654022960</id><published>2010-02-06T01:04:00.008-05:00</published><updated>2010-02-09T02:11:55.616-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='math'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Chinese CRC In Operation Aurora</title><content type='html'>Google "Operation Aurora: Clues in the Code" for a cool writeup by secureworks about a CRC algorithm found in the trojan used against Google.&lt;br /&gt;&lt;br /&gt;CRC lookup tables normally store a precomputed value for each byte, and thus their tables have 256 entries. This one has only 16, how? If you look closely, the temporary value used to hold the result of the current division is shifted by 4, not 8.  Division is done twice. What is going on?&lt;br /&gt;&lt;br /&gt;This code is using a nibble lookup table. Two nibbles per byte processed. This optimization has decreased the size of the table by a factor of 16, but only decreased the code speed by a factor of 2, a very cool trade off!&lt;br /&gt;&lt;br /&gt;Also notice the direction of the shift, this implementation treats higher significance bits as higher order terms (unlike the typical crc-32, which does the opposite). You can thus find all coefficients except a_16 of the divider polynomial at entry 0x01 (instead of 0x80 in the crc-32 ordering). The polynomial is 0x1021 representing x^16 + x^12 + x^5 + 1. (The a_16 * x^16 term is implicit). The wikipedia page calls this CRC-16-CCITT.&lt;br /&gt;&lt;br /&gt;With a little care, we can recreate how this nibble lookup table was generated:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;WORD table[16];&lt;br /&gt;for(INT i=0; i&amp;lt;16; ++i) {&lt;br /&gt;WORD crc = i&amp;lt;&amp;lt;12;&lt;br /&gt;for(INT j=0; j&amp;lt;4; ++j) { // for each of 4 possible nibble terms&lt;br /&gt;  if(crc &amp;amp; 0x8000) {    // high order term present?&lt;br /&gt;    crc &amp;lt;&amp;lt;= 1;        // term=0 (by implied x^16 divider term)&lt;br /&gt;    crc ^= 0x1021;          // subtract rest of poly&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;    crc &amp;lt;&amp;lt;= 1;   &lt;br /&gt;}&lt;br /&gt;table[i] = crc;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When more spare time arrives, I'll adapt a crc-32 implementation to use this trick! Also add it to your bag of tricks to be on the lookout for when reversing!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Feb 09th, 2010 EDIT&lt;/b&gt;: check out the current file archive for the source to an adapted crc-32! It was more difficult than expected to get it to work!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-8967228727654022960?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/8967228727654022960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/02/chinese-crc-in-operation-aurora.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8967228727654022960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8967228727654022960'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/02/chinese-crc-in-operation-aurora.html' title='Chinese CRC In Operation Aurora'/><author><name>andrewl</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-227151885267763030</id><published>2010-01-27T10:32:00.002-05:00</published><updated>2010-01-27T10:36:48.985-05:00</updated><title type='text'>Numernia's "Keygenme Tre"</title><content type='html'>[difficulty: 4][protection: 0xECC9 :)]&lt;br /&gt;&lt;br /&gt;Check out Numernia's new crackme at &lt;a href="http://crackmes.de/users/numernia/keygenme_tre/"&gt;http://crackmes.de/users/numernia/keygenme_tre/&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;Probably a little more difficult than 4, but totally possible! Good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-227151885267763030?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/227151885267763030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/01/numernias-keygenme-tre.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/227151885267763030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/227151885267763030'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/01/numernias-keygenme-tre.html' title='Numernia&apos;s &quot;Keygenme Tre&quot;'/><author><name>andrewl</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-1546617459093993319.post-7624787246974241906</id><published>2010-01-07T02:59:00.007-05:00</published><updated>2010-01-27T10:31:42.828-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>gbe32241's SDDecoder</title><content type='html'>&lt;div&gt;[difficulty: 6][protection: multivariate]&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm pleased to report that after nearly half a year of obsession, SDDecoder is solved. It is one of the most enigmatic crackmes posted to crackmes.de IMHO.&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;NNE92-NS62P-TZ9QC-NGEII-6UJ4V (id: 0xDDDD)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;PMOFN-WJIJW-DQ9T9-IOM62-RXIIR (id: 0xBBBB)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;FGU6J-WAHFJ-T6ZD7-CBKOQ-6LJHD (id: 0x9999)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;JT2CQ-6HY7O-6B3DJ-HIAJC-BEC2Q (id: 0x5678)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My attack should work in general for any overlapping s-box scheme. The first implementation was made against SDD64 (the very reason SDD64 was written!) and can generate every possible key for an arbitrary ID. While converting this to 128-bit, I made some error because some id's for the real SDDecoder won't solve, and without the private info, it's difficult to trace why.&lt;br /&gt;&lt;br /&gt;It took about 2 single-machine days to extract the private data needed from the public key, and each key generation takes a few minutes (the ones that succeed).  When the keygen is debugged I'll submit a solution.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Jan 13th, 2010 EDIT&lt;/span&gt;: Solution uploaded! SDDecoder JR v2 falls even better to this same attack, so I downgraded the difficulty to 2... I'm off now exploring other MQ stuff (original C*, HFE, Oil and Vinegar, etc.) Some bonus keys:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;HSCTZ-KL9E2-OW67U-UBVEN-VYW7X&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;PMAUJ-9CJ2W-3SBSY-3A26Y-HAR4V&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;Z4ANL-MTVRL-3XVL3-A3NMB-3UI39&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;U3Z3Y-UM337-ZPT9R-4RCKP-C7MSP&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;SE2FI-B2LOS-EN4LK-HLJ9I-CWZ47&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;"&gt;PGPPP-ZVPJW-UEE2Q-FWLY3-3KPPX&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="font-family:Georgia, serif;"&gt;Jan 27th, 2010 EDIT:&lt;span class="Apple-style-span" style="font-weight: normal;"&gt; Not challenged enough? See how SDDecoder (DRegZ) was built, and try JRegZ and QRegZ at &lt;a href="http://www.webalice.it/giuliano.bertoletti/lca.html"&gt;http://www.webalice.it/giuliano.bertoletti/lca.html&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-7624787246974241906?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/7624787246974241906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2010/01/sddecoder-solved.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7624787246974241906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7624787246974241906'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2010/01/sddecoder-solved.html' title='gbe32241&apos;s SDDecoder'/><author><name>andrewl</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-1546617459093993319.post-351290733321256023</id><published>2009-12-22T23:55:00.003-05:00</published><updated>2010-05-13T16:41:29.862-04:00</updated><title type='text'>death's "Saddam Crackme"</title><content type='html'>[difficulty: 5][protection: des, scrambled function table]&lt;br /&gt;&lt;br /&gt;&lt;img alt="" border="0" src="http://andrewl.dreamhosters.com/archive/80614495.png" style="cursor: pointer; display: block; height: 192px; margin: 0px auto 10px; text-align: center; width: 285px;" /&gt;After being des-decrypted (key derived from GetVolumeInformation()), your serial is used to  unscramble an array of function pointers which are critical to the protected application (a cool desktop switcher prog called Smirk).&lt;br /&gt;&lt;br /&gt;To solve it, you can make a a small number of guesses (relative to the entire size of the table) at proper locations of function pointers within the table, and then search which serials yield arrangements that fit your guess.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-351290733321256023?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/351290733321256023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/12/deaths-saddam-crackme.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/351290733321256023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/351290733321256023'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/12/deaths-saddam-crackme.html' title='death&apos;s &quot;Saddam Crackme&quot;'/><author><name>andrewl</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-1546617459093993319.post-7352418411628976265</id><published>2009-12-08T18:20:00.003-05:00</published><updated>2010-10-22T13:51:34.711-04:00</updated><title type='text'>SDD64</title><content type='html'>&lt;pre&gt;r[0] = x[0]*x[0] ^ x[2]*x[0] ^ x[3]*x[0] ^ x[3]*x[2] ^ x[3]*x[3] ^ x[4]*x[4] ^ x[5]*x[2]&lt;br /&gt;r[1] = x[2]*x[1] ^ &lt;u&gt;&lt;b&gt;x[3]*x[0]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]*&lt;/b&gt;&lt;/u&gt;x[1] ^ &lt;u&gt;&lt;b&gt;x[3]*&lt;/b&gt;&lt;/u&gt;x[3] ^ &lt;u&gt;&lt;b&gt;x[4]*x[1]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[4]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt; ^ x[5]*x[3]&lt;br /&gt;r[2] = x[1]*x[0] ^ &lt;u&gt;&lt;b&gt;x[1]&lt;/b&gt;&lt;/u&gt;*x[1] ^ &lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[0]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*x[0] ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt; ^ x[4]*x[0]&lt;br /&gt;r[3] = x[2]*x[0] ^ &lt;u&gt;&lt;b&gt;x[2]*x[1]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[0]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[1]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*x[3] ^ &lt;u&gt;&lt;b&gt;x[4]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[1]&lt;/b&gt;&lt;/u&gt; ^ x[4]*x[2]&lt;br /&gt;r[4] = x[1]*x[1] ^ x[2]*&lt;u&gt;&lt;b&gt;x[0]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[1]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[0]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]*x[1]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]*x[2]&lt;/b&gt;&lt;/u&gt; ^ x[4]*x[0]&lt;br /&gt;r[5] = x[2]*x[0] ^ x[2]*&lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[4]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[1]&lt;/b&gt;&lt;/u&gt; ^ x[4]*&lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt; ^ x[4]*x[3]&lt;br /&gt;r[6] = x[0]*x[0] ^ x[1]*&lt;u&gt;&lt;b&gt;x[0]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[1]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]&lt;/b&gt;&lt;/u&gt;*&lt;u&gt;&lt;b&gt;x[0]&lt;/b&gt;&lt;/u&gt; ^ x[3]*&lt;u&gt;&lt;b&gt;x[1]&lt;/b&gt;&lt;/u&gt; ^ x[3]*x[2]&lt;br /&gt;r[7] = x[0]*x[0] ^ &lt;u&gt;&lt;b&gt;x[2]*x[1]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]*x[0]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[3]*x[2]&lt;/b&gt;&lt;/u&gt; ^ &lt;u&gt;&lt;b&gt;x[4]*x[0]&lt;/b&gt;&lt;/u&gt; ^ x[4]*&lt;u&gt;&lt;b&gt;x[2]&lt;/b&gt;&lt;/u&gt; ^ x[5]*x[0]&lt;br /&gt;r[8] = x[1]*x[0] ^ x[1]*x[1] ^ x[2]*x[1] ^ x[2]*x[2] ^ x[3]*x[2] ^ x[3]*x[3] ^ x[4]*x[0]&lt;br /&gt;r[9] = x[1]*x[0] ^ x[1]*x[1] ^ x[2]*x[1] ^ x[3]*x[0] ^ x[3]*x[3] ^ x[4]*x[0] ^ x[4]*x[1]&lt;br /&gt;&lt;br /&gt;WHAT:&lt;br /&gt;SDD64&lt;br /&gt;&lt;br /&gt;This is a 64-bit bit version of Giuliano Bertoletti's&lt;br /&gt;DRegZ/SDDecoder license scheme.&lt;br /&gt;&lt;br /&gt;No code lifted!&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;"Asymmetric Cryptography with S-Boxes" - Jacques Patarin&lt;br /&gt;"Algorithm for license codes" - Giuliano's sci.crypt post&lt;br /&gt;"License Code Algorithms" - Giuliano's website:&lt;br /&gt;&lt;a href="http://www.webalice.it/giuliano.bertoletti/lca.html"&gt;http://www.webalice.it/giuliano.bertoletti/lca.html&lt;/a&gt;&lt;br /&gt;"SDDecoder" - crackmes.de&lt;br /&gt;&lt;br /&gt;andrewl&lt;br /&gt;dec07_2009 - first release&lt;br /&gt;http://andrewl.brainstemprojects.com&lt;br /&gt;&lt;br /&gt;HOW:&lt;br /&gt;&lt;br /&gt;Use sdd64.cpp to generate a random keypair, which are&lt;br /&gt;output into public_key.h and private_key.h.&lt;br /&gt;&lt;br /&gt;Use encoder.cpp with private_key.h to make valid licenses.&lt;br /&gt;&lt;br /&gt;Use decoder.cpp with public_key.h check license validity.&lt;br /&gt;&lt;br /&gt;encoder takes as input the license id (decimal format 20-bit&lt;br /&gt;integer) and emits an encoded license&lt;br /&gt;&lt;br /&gt;decoder takes as input an encoded license (hexadecimal format&lt;br /&gt;64-bit integer) and emits "pass" or "fail" message&lt;br /&gt;&lt;br /&gt;COMPILATION:&lt;br /&gt;&lt;br /&gt;Written/tested with Visual Studio 9.0 express. With VC6,&lt;br /&gt;much wincrypt stuff is not found (HCRYPTPROV, PROV_RSA_FULL,&lt;br /&gt;etc. not defined). It can be made to work with VC6, but I do&lt;br /&gt;not have time.&lt;br /&gt;&lt;br /&gt;Compile sdd64.cpp alone.&lt;br /&gt;&lt;br /&gt;Execution of sdd64 produces public_key.h and private_key.h.&lt;br /&gt;&lt;br /&gt;Compile encoder.cpp + private_key.h.&lt;br /&gt;&lt;br /&gt;Compile decoder.cpp + public_key.h.&lt;br /&gt;&lt;br /&gt;Example command line:&lt;br /&gt;&lt;br /&gt;cl sdd64.cpp /link advapi32.lib&lt;br /&gt;sdd64.exe&lt;br /&gt;cl encoder.cpp&lt;br /&gt;cl decoder.cpp&lt;br /&gt;&lt;br /&gt;WHERE:&lt;br /&gt;&lt;br /&gt;Browse my website for the currently updated file archive and&lt;br /&gt;text search for "sdd64".&lt;br /&gt;&lt;br /&gt;An early version of the software is also included with the&lt;br /&gt;SDDecoder Jr. v2 crackme on &lt;a href="http://crackmes.de/"&gt;http://crackmes.de&lt;/a&gt;.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-7352418411628976265?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/7352418411628976265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/12/sdd64.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7352418411628976265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7352418411628976265'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/12/sdd64.html' title='SDD64'/><author><name>andrewl</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-1546617459093993319.post-5396596616464783748</id><published>2009-11-12T00:50:00.006-05:00</published><updated>2010-05-13T16:41:55.448-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><category scheme='http://www.blogger.com/atom/ns#' term='dlp'/><title type='text'>death's "electric-camel"</title><content type='html'>[difficulty: 6][protection: tiger,sha1,blowfish,el-gamal]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/archive/82709920.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 366px; height: 179px;" src="http://andrewl.dreamhosters.com/archive/82709920.PNG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It does some sha/tiger/blowfish which has to produce the right el-gamal private key to decrypt the goodboy message. See solution and keygen for details. The hardest thing about this crackme is the message of c++ code that goes along with crypto++ library. There's just so much code. I downloaded an old compiler and service pack in order to build the two versions of crypto++ that straddle the 2001 time that this crackme was made, and produced IDA signatures from these.&lt;br /&gt;&lt;br /&gt;One of the coolest thing to be learned from this crackme is just how fast &lt;a href="http://magma.maths.usyd.edu.au/"&gt;MAGMA&lt;/a&gt; can solve the DLP for this crackme:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;P: cc7346a8b4ffb3f2393b&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;G: 00000000000000000003&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Y: 3e2cb006ad3961beda9d&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I left &lt;a href="http://www.alpertron.com.ar/DILOG.HTM"&gt;alpertron&lt;/a&gt; on overnight and it had not found anything... About 17 hours of computation was continuing when Dcoder from EFNET #cryptography helped me his script:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;p := 965489229592273293031739;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;K := GF(p);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;g := K ! 3;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;y := K ! 293611062693023723739805;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;x := Log(g, y);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;x;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It finds x=0792A1952223 in about .3 seconds!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-5396596616464783748?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/5396596616464783748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/11/deaths-electric-camel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5396596616464783748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5396596616464783748'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/11/deaths-electric-camel.html' title='death&apos;s &quot;electric-camel&quot;'/><author><name>andrewl</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-1546617459093993319.post-2395267954951247507</id><published>2009-11-03T13:46:00.006-05:00</published><updated>2009-11-04T10:41:52.539-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>upb's "Keygenme Sheg"</title><content type='html'>[difficulty: 2][protection: digital logic]&lt;br /&gt;&lt;br /&gt;Your serial number encodes instructions for a stack-based machine that has instructions for AND, XOR, and PUSH.&lt;br /&gt;&lt;br /&gt;The VM is called 16 times and the output must match some values calculated from your username.&lt;br /&gt;&lt;br /&gt;This is extremely similar to Malfunction's "Digital Arithmetic" (which came later). In DA, your serial encoded a circuit of NAND gates, and it was shown that NAND gates can be used to make any circuit. In sheg, you have a stack machine, so it is a little harder to produce a functioning "circuit" (the binary operations can ONLY use the two values at the top of the stack, and can ONLY put a result at the top of the stack). Since NOT(x)=XOR(x,1), we get can combine with AND to get NAND, and thus we get anything.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EDIT:&lt;/span&gt; upb has informed me that his machine is evaluating a &lt;a href="http://en.wikipedia.org/wiki/Zhegalkin_polynomial"&gt;Zhegalkin polynomial&lt;/a&gt;, which is neat view of a logic circuit as a polynomial over GF(2).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2395267954951247507?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2395267954951247507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/11/upbs-keygenme-sheg.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2395267954951247507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2395267954951247507'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/11/upbs-keygenme-sheg.html' title='upb&apos;s &quot;Keygenme Sheg&quot;'/><author><name>andrewl</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-1546617459093993319.post-4649229448466203522</id><published>2009-10-08T13:33:00.004-04:00</published><updated>2010-05-13T16:42:12.809-04:00</updated><title type='text'>Amenesia's "Howl"</title><content type='html'>[difficulty: 6][protection: custom finite field cipher activity]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/archive/16307903.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 305px; height: 177px;" src="http://andrewl.dreamhosters.com/archive/16307903.PNG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Contains a block cipher utilizing finite field arithmetic. You can invert it by reversing the operations and inverting certain field operations. Your serial must encrypt to some values generated from the name and Allen Ginsberg's poem "Howl" (what is an angelheaded hipster anyways!?).&lt;br /&gt;&lt;br /&gt;Check out the code for some real calculation of multiplicative inverses in the field using the Euclidean algorithm (no bruteforcing this time!!)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4649229448466203522?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4649229448466203522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/10/amenesias-howl.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4649229448466203522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4649229448466203522'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/10/amenesias-howl.html' title='Amenesia&apos;s &quot;Howl&quot;'/><author><name>andrewl</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-1546617459093993319.post-3156743455262248020</id><published>2009-09-28T15:19:00.004-04:00</published><updated>2010-05-13T16:42:26.752-04:00</updated><title type='text'>so61pi's "Keygenme#1"</title><content type='html'>[difficulty: 2][protection: miniature RSA and subset sum]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/archive/65389556.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 293px; height: 137px;" src="http://andrewl.dreamhosters.com/archive/65389556.PNG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A fun little keygenme! See if you can make serials containing only printable characters!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-3156743455262248020?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/3156743455262248020/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/09/so61pis-keygenme1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3156743455262248020'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3156743455262248020'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/09/so61pis-keygenme1.html' title='so61pi&apos;s &quot;Keygenme#1&quot;'/><author><name>andrewl</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-1546617459093993319.post-4915549872852380122</id><published>2009-09-25T18:06:00.005-04:00</published><updated>2010-05-13T16:42:35.368-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Numernia's "Keygenme Tvaa"</title><content type='html'>[difficulty: 3][protection: crc32, GF(2^19) arithmetic]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/archive/15352237.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 548px; height: 132px;" src="http://andrewl.dreamhosters.com/archive/15352237.PNG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I won't post too much about this yet (it is less than 2 days old on crackmes.de right now) and I am curious what other people submit. It is a very nicely, tightly coded crackme that I'm sure you will enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4915549872852380122?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4915549872852380122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/09/numernias-keygenme-tvaa.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4915549872852380122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4915549872852380122'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/09/numernias-keygenme-tvaa.html' title='Numernia&apos;s &quot;Keygenme Tvaa&quot;'/><author><name>andrewl</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-1546617459093993319.post-3275944357653197524</id><published>2009-09-13T00:59:00.008-04:00</published><updated>2010-05-13T16:42:42.997-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Encrypto's "Aurora"</title><content type='html'>[difficulty: 5][protection: crc32, custom block cipher, Nyberg Rueppel]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/archive/94022207.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 443px; height: 438px;" src="http://andrewl.dreamhosters.com/archive/94022207.PNG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Numernia, Cyclops and I teamed up on this flashy crackme from Encrypto. You have to reverse both symmetric (amazing work Numernia!!) and public key routines. Solution will be posted soon!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-3275944357653197524?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/3275944357653197524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/09/encryptos-aurora.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3275944357653197524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3275944357653197524'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/09/encryptos-aurora.html' title='Encrypto&apos;s &quot;Aurora&quot;'/><author><name>andrewl</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-1546617459093993319.post-3287383125204255416</id><published>2009-09-13T00:59:00.007-04:00</published><updated>2009-11-25T15:58:11.541-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme'/><title type='text'>"SDDecoder Junior"</title><content type='html'>SDDecoder keygenme by gbe32241 is a truly amazing work, worth anybody's examination.&lt;br /&gt;&lt;br /&gt;In this knock-off, the strengthening factors are removed, namely:&lt;br /&gt;&lt;br /&gt;- the input and output transforms are separated from the core function&lt;br /&gt;- the key size is reduced from 128 bits to 64 bits&lt;br /&gt;- some other minor simplifications&lt;br /&gt;&lt;br /&gt;Here is a list of example codes.&lt;br /&gt;&lt;br /&gt;0B9406A6A5CF8D68&lt;br /&gt;7C2E3DC7A9357094&lt;br /&gt;04FEB466BEDCDB92&lt;br /&gt;21E55E6A6B309F70&lt;br /&gt;A8FAC8E4DF56C998&lt;br /&gt;D597329D34D0ED3A&lt;br /&gt;33D0A0EA1092124B&lt;br /&gt;28AC66DD28697C52&lt;br /&gt;1E380939AF1BF545&lt;br /&gt;4FC1636FB7EEAFB0&lt;br /&gt;93B2C52E2B77BD8F&lt;br /&gt;&lt;br /&gt;Can you keygen the rest?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE&lt;/span&gt;: (Oct05_2009) a mysterious visitor "z1hye" registered October 5th, 2009 and immediately posted the serial "F365E2149BEA87F1" with ID 0xDEAD!!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; (Nov25_2009): Numernia has keygenned it!! check his site or my file archive for sources...going to increase the difficulty towards the real sddecoder now by applying just an input transformation and just an output transformation (but not both simultaneously) ...watch crackmes.de soon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-3287383125204255416?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/3287383125204255416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/09/sddecoder-junior.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3287383125204255416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3287383125204255416'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/09/sddecoder-junior.html' title='&quot;SDDecoder Junior&quot;'/><author><name>andrewl</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-1546617459093993319.post-7534476200897718065</id><published>2009-08-04T00:44:00.009-04:00</published><updated>2010-05-13T16:42:50.068-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='keygenme'/><title type='text'>"Capriccio"</title><content type='html'>[&lt;span style="font-weight: bold;"&gt;difficulty&lt;/span&gt;: 4] [&lt;span style="font-weight: bold;"&gt;protection&lt;/span&gt;: crc64 control]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/archive/30766082.PNG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 343px; height: 110px;" src="http://andrewl.dreamhosters.com/archive/30766082.PNG" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I don't want to give away too much yet. The routine is very small. So hopefully very little time reversing and more time keygenning.&lt;br /&gt;&lt;br /&gt;EDIT: so it wasn't as hard as I thought! Villani killed it without even knowing the underlying scheme (which, to me, is even more impressive). Artif owned it up also with ease :) Both solutions posted, thanks guys.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-7534476200897718065?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/7534476200897718065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/08/capriccio.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7534476200897718065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7534476200897718065'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/08/capriccio.html' title='&quot;Capriccio&quot;'/><author><name>andrewl</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-3180572060400712001</id><published>2009-07-14T01:10:00.004-04:00</published><updated>2009-07-14T01:23:05.423-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>ZeroCoder's "CrackMe v10.0"</title><content type='html'>[difficulty: 6][protection: int1, hash]&lt;br /&gt;&lt;br /&gt;I'm 14 again ruining any chance of being awake tomorrow at school due to a VX zine that I'm nowhere near comprehending. The 16-bit world lives on with ZeroCoder's 425 bytes of frustration that he calls his v10.0 crackme.&lt;br /&gt;&lt;br /&gt;It sets up an int1 handler and uses pushf/popf to set the TF. A simple NOP invokes the handler which retrieves "instructions" from an area in the crackme and executes them. Yea it's like a VM, but there are only four instructions. Pretty damn cool so far.&lt;br /&gt;&lt;br /&gt;Enter the pain. A simple hash calculation involving add/xor is used with inputs and outputs all over the place (from the crackme, from a supplied password, from the calculations of previous hashes, to the goodboy message, to temporary areas). You don't know what the goodboy is, what characters are in the goodboy or the password, or even what the length of the password is (except that it's capped at 10).&lt;br /&gt;&lt;br /&gt;Anyways, it is solvable, although with a little brute-force and guesswork. Like many before it, I could never admit how much time was spent on this thing :P&lt;br /&gt;&lt;br /&gt;SIDE NOTES: It was pretty cool using debug.exe and recognizing some of its influence in WinDBG. For a cool description of why interleaving add/xor is so powerful, check out the paper "Block Ciphers and Cryptanalysis" by Fauzan Mirza.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-3180572060400712001?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/3180572060400712001/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/07/zerocoders-crackme-v100.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3180572060400712001'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3180572060400712001'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/07/zerocoders-crackme-v100.html' title='ZeroCoder&apos;s &quot;CrackMe v10.0&quot;'/><author><name>andrewl</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-1546617459093993319.post-2722016917111604114</id><published>2009-07-06T17:19:00.006-04:00</published><updated>2009-07-08T14:59:12.448-04:00</updated><title type='text'>WinDBG Extension to Read BigLib Numbers</title><content type='html'>In filedump, file "WinDBG_Ext_Roy_BigLib.zip" is a WinDBG extension for reading arbitrary precision number structures from the BigLib library by Roy | Fleur. It comes with source. To use it, copy it to the "winext" subdirectory in your WinDBG installation directory.An example:&lt;pre&gt;&lt;br /&gt;.text:004016B0         push    dword_4047A1 &lt;-- arg3 &lt;br /&gt;.text:004016B6         push    dword_404789 &lt;-- arg2 &lt;br /&gt;.text:004016BC         push    dword_404799 &lt;-- arg1 &lt;br /&gt;.text:004016C2         push    dword_40478D &lt;-- arg0 &lt;br /&gt;.text:004016C8         mov     eax, 1 &lt;br /&gt;.text:004016CD         call    sub_4017F3&lt;/pre&gt;&lt;br /&gt;Even without knowing what sub_4017F3 is, the input/output can be monitored. Load up the extension so that we can view the numbers:&lt;pre&gt;&lt;br /&gt;0:000&gt; !load bn&lt;br /&gt;extension: initializing...&lt;br /&gt;0:000&gt; !bn poi(esp)&lt;br /&gt;bignum @00AC0000&lt;br /&gt;00003652B36A37B0C7ECE042&lt;br /&gt;0:000&gt; !bn poi(esp+4)&lt;br /&gt;bignum @00AF0000&lt;br /&gt;00000002&lt;br /&gt;0:000&gt; !bn poi(esp+8)&lt;br /&gt;bignum @009B0000&lt;br /&gt;0000CBEC5F1F97FB14C803CB&lt;br /&gt;0:000&gt; !bn poi(esp+c)&lt;br /&gt;bignum @00B10000&lt;br /&gt;0&lt;/pre&gt;&lt;br /&gt;Proceed over the call, and check the numbers again:&lt;pre&gt;&lt;br /&gt;0:000&gt; p&lt;br /&gt;0:000&gt; !bn 00AC0000&lt;br /&gt;bignum @00AC0000&lt;br /&gt;00003652B36A37B0C7ECE042&lt;br /&gt;0:000&gt; !bn 00AF0000&lt;br /&gt;bignum @00AF0000&lt;br /&gt;00000002&lt;br /&gt;0:000&gt; !bn 009B0000&lt;br /&gt;bignum @009B0000&lt;br /&gt;0000CBEC5F1F97FB14C803CB&lt;br /&gt;0:000&gt; !bn 00B10000&lt;br /&gt;bignum @00B10000&lt;br /&gt;00006F18441B1396928838B5&lt;/pre&gt;&lt;br /&gt;All the arguments except arg3 remained the same. With some intuition and a verifying test in BigCalto, we see that arg3 = arg0 ^ arg1 (mod arg2) and identify this function as _BigPowMod().&lt;br /&gt;&lt;br /&gt;I purposely did some things to encourage rapid re-purposement of the source code: all the code is in one file, there is minimal bloat (just some placeholders with prints where extended functionality can exist), and it compiles with a simple batch file which invokes the Visual Studio command line tools. No project or solution bullshit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2722016917111604114?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2722016917111604114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/07/windbg-extension-to-read-biglib-numbers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2722016917111604114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2722016917111604114'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/07/windbg-extension-to-read-biglib-numbers.html' title='WinDBG Extension to Read BigLib Numbers'/><author><name>andrewl</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-1546617459093993319.post-659626505655412308</id><published>2009-07-04T00:48:00.008-04:00</published><updated>2010-05-13T16:43:02.184-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>dihux's Keygenme nr. 2</title><content type='html'>[difficulty: 4][protection: math and tricks]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/dihux_keygenmenr2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 489px; height: 295px;" src="http://andrewl.dreamhosters.com/filedump/dihux_keygenmenr2.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I've had the privilege to beta-test dihux's second keygenme... it's tough but not too hard. Grab it quick when it hits crackmes.de!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-659626505655412308?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/659626505655412308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/07/dihuxs-keygenme-nr-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/659626505655412308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/659626505655412308'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/07/dihuxs-keygenme-nr-2.html' title='dihux&apos;s Keygenme nr. 2'/><author><name>andrewl</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-1546617459093993319.post-1439893681144087121</id><published>2009-06-23T10:39:00.004-04:00</published><updated>2009-06-23T11:02:22.616-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>upb's Push-The-Pusher</title><content type='html'>[difficulty: 3][protection: CRC32 manipulation]&lt;br /&gt;&lt;br /&gt;Your name is used to generate an input buffer. Your serial decides which bits of the input buffer are complemented. Finally, the CRC32 of the input buffer must equal a predefined value (0xFAF3CCCE).&lt;br /&gt;&lt;br /&gt;Though CRC is so old and there are numerous resources online about its many variations, this turned out to be much much harder than I expected. Here is the final technique:&lt;ol&gt;&lt;br /&gt;&lt;li&gt;find what 32-bit input has CRC32 of 0xFAF3CCCE (brute all 32-bit values or try to work backwards with the long division)&lt;br /&gt;&lt;li&gt;calculate CRC32 of the input buffer less 32-bits&lt;br /&gt;&lt;li&gt;since CRC32(input,4,X) == CRC32(input^X,4,0) we can concatenate the four bytes discovered from step 1 to the buffer after having xor'd them by the result from step 2&lt;br /&gt;&lt;li&gt;the CRC32 of the full input buffer now is 0xFAF3CCCE&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;If you're facing a similar task, the solution text includes a hand-worked example of CRC32. Oh! And a challenge to you: given a CRC lookup table, how can you quickly find which polynomial was used to generate it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1439893681144087121?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1439893681144087121/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/06/upbs-push-pusher.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1439893681144087121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1439893681144087121'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/06/upbs-push-pusher.html' title='upb&apos;s Push-The-Pusher'/><author><name>andrewl</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-1546617459093993319.post-2727013982880834482</id><published>2009-06-05T11:04:00.007-04:00</published><updated>2010-05-13T16:43:10.708-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Waganono's WagaTemplate</title><content type='html'>[difficulty: 2][protection: mmx]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/Waganono_WagaTemplate.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 338px; height: 229px;" src="http://andrewl.dreamhosters.com/filedump/Waganono_WagaTemplate.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Hehe yet another strange crackme by this guy. This one comes with the &lt;a href="http://melzas.free.fr/repo/Coding/WagaTemplate.rar"&gt;about-box template&lt;/a&gt; (which has cool fractal animation worth checking out).&lt;br /&gt;&lt;br /&gt;The serial verification makes use of just 5 mmx/sse/simd/whatever instructions (I always ignore these strange things!) After some time on google, it is very easy to solve.&lt;br /&gt;&lt;br /&gt;What is NOT so easy is getting the floating point crap right. The easiest path is to use your debugger to write the values into the xmmX register and then read the register as raw bytes, but not so fast. WinDBG is shown to have MANY bugs when it comes to this.&lt;br /&gt;&lt;br /&gt;First of all, the register command and register window will show two different values:&lt;pre&gt;3.60134e-043  7.9881e-041 6.16406e-039 1.71607e-038 &lt;-- from "r xmm1"&lt;br /&gt;&lt;br /&gt;3.601337e-043: 7.988102e-041: 6.164064e-039: 1.716068e-038 &lt;-- from register window&lt;/pre&gt;And evidently, it's not just a rounding issue. Second, if you double click in the register window on this xmm1 value, when you click away, the first float will be set to 0! This is the same for any xmmX register. If you do it to the same register twice in a row, all the floats will be set to 0! WTF?Third, the input into the xmmX register "r xmm0=&lt;float0&gt; &lt;float1&gt; &lt;float2&gt; &lt;float3&gt;" truncates the precision also. You can list all registers and WinDBG will show them identical (register window or r command), but then the "r xmm0:ub" will show small difference, as will "cmpps" from crackme.Ultimately I had to give up and use the compiler to generate code to do the work for me. See in \crackmes_solutions.Maybe I have something wrong here. Storing real numbers inside discrete registers is just outright confusing. It's been on my to-do list for years to read "&lt;a href="http://www.google.com/#hl=en&amp;amp;q=what+every+computer+scientist+should+know+about+floating+point+arithmetic&amp;amp;aq=f&amp;amp;oq=&amp;amp;aqi=g1&amp;amp;fp=SHAbtGzS2yM"&gt;What Every Computer Scientist Should Know About Floating-Pointe Arithmetic&lt;/a&gt;". Maybe some other day! :)&lt;/float3&gt;&lt;/float2&gt;&lt;/float1&gt;&lt;/float0&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2727013982880834482?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2727013982880834482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/06/waganonos-wagatemplate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2727013982880834482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2727013982880834482'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/06/waganonos-wagatemplate.html' title='Waganono&apos;s WagaTemplate'/><author><name>andrewl</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-1546617459093993319.post-7366612476668066749</id><published>2009-05-27T00:15:00.005-04:00</published><updated>2010-05-13T16:43:24.710-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>HappyTown's CrackME_0009</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/happytown_crackme_0009.png"&gt;&lt;/a&gt;[difficulty: 4][protection: CRC/blowfish/distractions]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/happytown_crackme_0009.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 446px; height: 185px;" src="http://andrewl.dreamhosters.com/filedump/happytown_crackme_0009.png" alt="" border="0" /&gt;&lt;br /&gt;&lt;/a&gt;Ok, so I did this one because it looked kinda cool and there are a few remaining unsolved HappyTown's still out there. Decoys aside, your serial number must decrypt to a value calculated from the CRC's of your username and Windows product ID.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-7366612476668066749?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/7366612476668066749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/05/happytowns-crackme0009.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7366612476668066749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7366612476668066749'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/05/happytowns-crackme0009.html' title='HappyTown&apos;s CrackME_0009'/><author><name>andrewl</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-1546617459093993319.post-2514020312238192840</id><published>2009-05-25T21:55:00.005-04:00</published><updated>2009-05-25T22:11:55.879-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>HappyTown's CrackME_0030</title><content type='html'>[difficulty: 4][protection: 2nd order polynomial over Zn]&lt;br /&gt;&lt;br /&gt;This crackme made me read the "quadratic residue" Wikipedia page AGAIN. One day I might have it memorized :)&lt;br /&gt;&lt;br /&gt;You end up having to solve:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;C*X^2 + Y^2 = U (mod N)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Where C is constant, U is a number derived from your username, and N is the product of two large primes P and Q. The X and Y are the components of the serial.&lt;br /&gt;&lt;br /&gt;First you can randomly produce values for either X^2 or Y^2 and solve for the other. Whatever values you use, you must make sure that they're truly squares (mod N) [thus squares both (mod P) and (mod Q)] using Euler's criterion. Luckily, both P and Q are congruent 3 (mod 4) so we get the easy path in deriving X and Y.&lt;br /&gt;&lt;br /&gt;But not so fast! Like "D-Racinez Moi" from decades past, solving for either X or Y must be done in pieces, as the modulus is composite, (one piece for P and one piece for Q). You'll have two answers:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;X = &amp;lt;something&amp;gt; (mod P)&lt;br /&gt;X = &amp;lt;something&amp;gt; (mod Q)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As primes, GCD(P,Q) = 1, and that means the Chinese remainder theorem will be making a guest appearance as the final step in generating keys.&lt;br /&gt;&lt;br /&gt;Also, author notes that "Public Key algorithm INSIDE." - does anybody recognize this algorithm?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2514020312238192840?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2514020312238192840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/05/happytowns-crackme0030.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2514020312238192840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2514020312238192840'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/05/happytowns-crackme0030.html' title='HappyTown&apos;s CrackME_0030'/><author><name>andrewl</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-1546617459093993319.post-531494476118673776</id><published>2009-05-05T13:14:00.006-04:00</published><updated>2010-05-13T16:43:33.305-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>HappyTown's CrackME_0026</title><content type='html'>[difficulty: 3][protection: ECDSA]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/happytown_0026.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 534px; height: 279px;" src="http://andrewl.dreamhosters.com/filedump/happytown_0026.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The moderator comments revealed that it did some type of ECC, so I had to try it in continuation of my elliptic journey. Fortunately, it implements ECDSA just like WiteG #10. But in this crackme, you have to actually forge a signature for a message generated from your user name (actually it is bignum(sha1(user)) just like the previous crackme!).&lt;br /&gt;&lt;br /&gt;Of course ECDSA would be useless if forgery were possible without knowing the private key. I enlisted &lt;a href="http://mrhaandi.thecoderblogs.com/2008/07/14/ecdlp-solver-v02a/"&gt;Mr. Haandi's ECDLP Solver v0.2a&lt;/a&gt; to find the discrete log (just the scalar k so that k * G = public key). The crackme uses extremely small parameters for its curve, so the solver finished in about 1/5th of a second.&lt;br /&gt;&lt;br /&gt;From there it's just calculation...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-531494476118673776?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/531494476118673776/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/05/happytowns-crackme0026.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/531494476118673776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/531494476118673776'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/05/happytowns-crackme0026.html' title='HappyTown&apos;s CrackME_0026'/><author><name>andrewl</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-1546617459093993319.post-6996950058183922835</id><published>2009-05-04T17:34:00.009-04:00</published><updated>2010-05-13T16:43:49.163-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>WiteG #10: What do you think you know about signatures?</title><content type='html'>[difficulty: 4][protection: ECDSA]&lt;br /&gt;&lt;br /&gt;The idea of this crackme is a challenge: to generate a single ECDSA signature for two different messages (computed from the username). The cracker gets free choice of the public key Q&lt;sub&gt;A&lt;/sub&gt; and the randomized parameter k.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://aandrewl.dreamhosters.com/filedump/witeg_10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 426px; height: 217px;" src="http://andrewl.dreamhosters.com/filedump/witeg_10.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Two messages, one signature? It's impossible right?&lt;br /&gt;&lt;br /&gt;Well after many lonely mornings in front of the glow, it really is possible!&lt;br /&gt;&lt;br /&gt;The spoiler is that in the ECDSA signature verification computations, only the x-coordinate of the computed point is checked. For each x-coordinate on a curve over Fp, there are two y-coordinates (two distinct points total, inverses of one another for point arithmetic on the curve). Here is a good example from Certicom's ECC Java applet:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/ecc_f23.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 367px; height: 409px;" src="http://andrewl.dreamhosters.com/filedump/ecc_f23.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Given some point k*G, where k is an integer and point G is the generator, you don't have to do anything difficult like the ECDLP to find -(k*G). One of the six generators is G=(17,10). Calculating 1*G, 2*G, ... this generator produces:&lt;br /&gt;&lt;pre&gt;(17,10), (16,15), (15,03), (09,18), (21,17), (01,18), (11,10), (18,13),&lt;br /&gt;(20,04), (13,05), (19,22), (00,00), (19,01), (13,18), (20,19), (18,10),&lt;br /&gt;(11,13), (01,05), (21,06), (09,05), (15,20), (16,08), (17,13), (inf)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The inverse points are mirrored around the (0,0) point in the middle of the sequence. We can put this symmetry into a simple formula:&lt;br /&gt;&lt;pre&gt;k * G = -((N-k) * G)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Where N is the order of the generator. Like in the above picture, P and Q are inverses. But suppose we didn't know this beforehand, and only knew that P=14*G. We could discover Q by calculating (24-14)*G = 10*G = Q.&lt;br /&gt;&lt;br /&gt;Ok so we can find the two inverse points easily in terms of a coefficient and a generator point. Now just try to get the two separate messages to have these two separate points as signatures. See my solution for more detail.&lt;br /&gt;&lt;br /&gt;It is mentioned in WiteG's comment that it has been keygenned by jB before, a known keygenning master. If I find the time I will his solution and maybe add some more comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-6996950058183922835?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/6996950058183922835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/05/witeg-10-what-do-you-think-you-know.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6996950058183922835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6996950058183922835'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/05/witeg-10-what-do-you-think-you-know.html' title='WiteG #10: What do you think you know about signatures?'/><author><name>andrewl</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-1546617459093993319.post-5856606805137384143</id><published>2009-04-19T23:16:00.013-04:00</published><updated>2010-05-13T16:44:15.131-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>GiveMeMoney by ksc91u</title><content type='html'>[difficulty: 6][protection: ECC]&lt;br /&gt;&lt;br /&gt;According to Google, ksc91u is a Taiwanese student, and his main study lately is keeping me from getting any sleep trying to keygen his little creation:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/GiveMeMoney.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 508px; height: 127px;" src="http://andrewl.dreamhosters.com/filedump/GiveMeMoney.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;His crackme uses Crypto++ library, which is a royal pain to disassemble. I used default settings in the Crypto++ Visual Studio project file to compile the lib and attempt to make an IDA sig, but it only recognized 16 functions in the crackme, and none of them were important names in the serial verification routine. An OpenRCE post &lt;a href="http://www.openrce.org/forums/posts/701"&gt;here&lt;/a&gt; seems to mirror my frustration. Look at this example code for simply calculating a hash &lt;a href="http://www.cryptopp.com/fom-serve/cache/50.html"&gt;here&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;#include "sha.h"&lt;br /&gt;#include "base64.h"&lt;br /&gt;&lt;br /&gt;std::string digest;&lt;br /&gt;&lt;br /&gt;CryptoPP::SHA256 hash;  // don't use MD5 anymore. It is considered insecure&lt;br /&gt;&lt;br /&gt;// Thank you, Wei Dai, for making this possible:&lt;br /&gt;CryptoPP::StringSource foo("CryptoPP is cool", true,&lt;br /&gt;new CryptoPP::HashFilter(hash,&lt;br /&gt;new CryptoPP::Base64Encoder (&lt;br /&gt;new CryptoPP::StringSink(digest))));&lt;br /&gt;&lt;br /&gt;std::cout &lt;&lt; digest &lt;&lt; std::endl;&lt;br /&gt;&lt;/pre&gt;"Thank you, Wei Dai, for making this possible"? This is crazy! I want my init(), update(), final() calls, not this object-within-an-object source-pipe-sink paradigm garbage!There is some help from openrce user igorsk who published his &lt;a href="http://www.openrce.org/downloads/details/196"&gt;"Microsoft VC++ Reversing Helpers" IDA scripts&lt;/a&gt;. Other than that, it's the classic poking around, trying different inputs and watching the output (and verifying against your calculator), and tracing deep :) If you can get through this, the hard part is over.Your serial encodes a point on an elliptic curve over Fp which is multiplied (point multiplication on the curve) by a constant within the crackme. The resulting point's X coordinate acts as a modulus for which the second part of your serial has its inverse found. From this inverse is derived a decryption key for a DLL which exports the goodboy function.Fortunately, some valid keys come with this crackme, and the magical inverse value is revealed to be constant simply by tracing through the crackme with a valid key. It is prime, so it will have an inverse mod any number (specifically any X coordinate from any random point on the curve).Though not having anything to do with the crackme, it is interesting to see the curve used by the crackme over the real numbers and imagining the the group addition law:&lt;pre&gt;gp &gt; E=ellinit([0,0,0,589755319233708863313827,435926913486323829977567])&lt;br /&gt;gp &gt; ploth(X=-.7393,-.7390,real(ellordinate(E,X)))&lt;br /&gt;&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/GiveMeMoney_curve0.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 408px; height: 327px;" src="http://andrewl.dreamhosters.com/filedump/GiveMeMoney_curve0.png" alt="" border="0" /&gt;&lt;/a&gt;If you look near Y=0, it is hard to image a tangent line at a point intersecting the curve in another spot. But then zoom out:&lt;pre&gt;ploth(X=-1000000000000000000,1000000000000000000,real(ellordinate(E,X)))&lt;br /&gt;&lt;/pre&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/GiveMeMoney_curve1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 408px; height: 327px;" src="http://andrewl.dreamhosters.com/filedump/GiveMeMoney_curve1.png" alt="" border="0" /&gt;&lt;/a&gt;The way that the curve is concave is somewhat convincing that the tangent line would eventually hit it, although it would be lightyears above or below the X axis. I would really like to learn how to graph the points of the curve over Fp.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-5856606805137384143?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/5856606805137384143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/04/givememoney-by-ksc91u.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5856606805137384143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5856606805137384143'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/04/givememoney-by-ksc91u.html' title='GiveMeMoney by ksc91u'/><author><name>andrewl</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-3612317104041163411</id><published>2009-04-09T17:50:00.011-04:00</published><updated>2010-05-13T16:44:25.180-04:00</updated><title type='text'>Locating the code that executes upon a button press</title><content type='html'>It can be hard to find the code that executes when a button is pushed. For a dialog, you can break on creation of the dialog and find the callback parameter. The callback logic can be followed on WM_COMMAND (0x111). But development environments that do a lot of the GUI work for you can be a different situation. Often a message will pass through several handlers before arriving at the user mode code.&lt;br /&gt;&lt;br /&gt;SetWindowsHookEx() lets a callback be notified of different events. When supplied WH_CALLWNDPROC it can be notified of messages before they go to the windows procedure.  Moreover, the lParam you are sent is a CWPSTRUCT* which has a handle to the destination window. This can be given to GetWindowLongPtr() with GWL_WNDPROC to find what code gets called.&lt;br /&gt;&lt;br /&gt;I know spy++ type tools do this type of thing already, but it was a learning experience to make a tool. It does exactly what is described above. Just give it a PID and it will enumerate all threads and install the monitoring hook. It actually injects a DLL which opens a pipe back to the control program to send it the caught messages:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/msgspy_action.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 556px; height: 139px;" src="http://andrewl.dreamhosters.com/filedump/msgspy_action.gif" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Instead of complicating it with filters and stuff, just grep the output to capture what message you are looking for. For instance: msgspy.exe 924 | grep 111 to get your WM_COMMAND. Download this tool msgspy_v1.rar in filedump.&lt;br /&gt;&lt;br /&gt;Many times the PROC given for the command will be some default function in user32 or comctl32 or something (eg: COMCTL32!Button_WndProc). In this case you can trace through until the code in your target is hit or use your debuggers facility to do this, if it exists (go to user code in Olly).&lt;br /&gt;&lt;br /&gt;One difficulty in making this tool was that it would often return values like 0xFFFFF052 for the WndProc. On the MSDN page for CallWindowProc the strangeness is explained, "If this value is obtained by calling the GetWindowLong function with the nIndex parameter set to GWL_WNDPROC or DWL_DLGPROC, it is actually either the address of a window or dialog box procedure, or a special internal value meaningful only to CallWindowProc."&lt;br /&gt;&lt;br /&gt;That sucks - this internal magic token is useless to us trying to find the code. I traced into user32!CallWindowProc to see what it did with these funny values. My CallWindowProc is actually typedef'd to CallWindowProcA. This calls CallWindowProcAorW which performs this test:&lt;br /&gt;&lt;pre&gt;.text:7E429FD3         mov     eax, 0FFFF0000h&lt;br /&gt;.text:7E429FD8         mov     ecx, esi                &lt;-- WndProc&lt;br /&gt;.text:7E429FDA         and     ecx, eax&lt;br /&gt;.text:7E429FDC         cmp     ecx, eax&lt;br /&gt;.text:7E429FDE         push    edi&lt;br /&gt;.text:7E429FDF         mov     edi, [ebp+arg_8]&lt;br /&gt;.text:7E429FE2         jz      special_value &lt;/pre&gt;So what makes the specialty of these WndProc's is that their top 16 bits are set. Immediately into special_value, we get:&lt;pre&gt;.text:7E42A99C         mov     dl, 7&lt;br /&gt;.text:7E42A99E         mov     ecx, esi                &lt;-- WndProc&lt;br /&gt;.text:7E42A9A0         call    HMValidateHandleNoRip &lt;/pre&gt;This HMValidateHandleNoRip function is way beyond me: it does some system call crap to get a struct in ebx and blah blah who cares. But what does with the return value is treats it like some type of structure and extracts the member 24 bytes inwards:&lt;pre&gt;.text:7E42A9C6         mov     esi, [eax+18h]&lt;br /&gt;&lt;/pre&gt;And this is the real function pointer. The only way I could think of to get this feature in my code was to scan user32 for the function HMValidateHandleNoRip, having made a signature that consists of just the opcode (the operands are like wildcards). This blows because if user32 ever looks different (different service pack, different windows version?), the tool will need to fall back and only display the special tokens, unable to resolve them. Have a better idea? Please comment.Anyways so if it is found (which it does on my XP SP3 machine), it can be used to resolve the special tokens just fine.&lt;pre&gt;typedef struct HMVALIDATESTRUCT&lt;br /&gt;{&lt;br /&gt;// filler to get to offset 0x18&lt;br /&gt;UINT a, b, c, d, e, f;&lt;br /&gt;UINT fptr;&lt;br /&gt;} HMVALIDATESTRUCT, *PHMVALIDATESTRUCT;&lt;br /&gt;&lt;br /&gt;typedef PHMVALIDATESTRUCT (__fastcall *PFN_HMVALIDATEHANDLENORIP)(WNDPROC, BYTE);&lt;br /&gt;&lt;br /&gt;PFN_HMVALIDATEHANDLENORIP ValidateHandle = ScanForFunction(hUser32);&lt;br /&gt;&lt;br /&gt;WndProc proc = GetWindowLongPtr(pcwp-&gt;hwnd, GWL_WNDPROC);&lt;br /&gt;&lt;br /&gt;PHMVALIDATESTRUCT foo = ValidateHandle((WNDPROC) proc, 7);&lt;br /&gt;&lt;br /&gt;spymsg.wndProc = foo-&gt;fptr;&lt;br /&gt;&lt;/pre&gt;Ugly but it works!You may find this tool useful for delphi apps or other programs made with workshop type development environments. A recent example I used it on is obnoxious's AutoIt crackme.&lt;span style="font-weight: bold;"&gt;May 11th, 2009 EDIT&lt;/span&gt;: zip now includes source!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-3612317104041163411?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/3612317104041163411/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/04/finding-code-that-executes-due-to.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3612317104041163411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3612317104041163411'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/04/finding-code-that-executes-due-to.html' title='Locating the code that executes upon a button press'/><author><name>andrewl</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-1789102261895844878</id><published>2009-04-03T13:59:00.007-04:00</published><updated>2010-05-13T16:44:32.848-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>DoomsDay's ReverseMe - FindThePassword v1</title><content type='html'>[difficulty: 4][protection: obfuscation]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/half_adder.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 389px; height: 110px;" src="http://andrewl.dreamhosters.com/filedump/half_adder.png" alt="" border="0" /&gt;&lt;/a&gt;A nice console crackme with spinning slash at only 4k! :)&lt;br /&gt;&lt;br /&gt;The main idea is to reverse addition and squaring (composed of additions) that are implemented using just bit operations. It is pretty difficult.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EDIT&lt;/span&gt;: DoomsDay was kind enough to share his source code! see DoomsDay_FindThePassword_v1.asm in crackmes&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1789102261895844878?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1789102261895844878/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/04/doomsdays-reverseme-findthepassword-v1.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1789102261895844878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1789102261895844878'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/04/doomsdays-reverseme-findthepassword-v1.html' title='DoomsDay&apos;s ReverseMe - FindThePassword v1'/><author><name>andrewl</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-934486630342538840</id><published>2009-03-20T15:03:00.009-04:00</published><updated>2010-05-13T16:44:40.452-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Eggi's Arteam Crackme #1</title><content type='html'>[difficulty: 2][protection: code protected with xor]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/crackmes/Eggi_ArteamCrackme.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 458px; height: 126px;" src="http://andrewl.dreamhosters.com/crackmes/Eggi_ArteamCrackme.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;This was recently posted to crackmes.de. It is another crackme where your serial is used to decrypt some code that will eventually execute.&lt;br /&gt;&lt;br /&gt;Specifically here, a word is made by summing your serial characters with strlen(serial). This word then is xor'd sequentially (no feedback) across 10 words.&lt;br /&gt;&lt;br /&gt;Before execution reached the decrypted code, a one byte comparison is made for validity, revealing half of the xor key.&lt;br /&gt;&lt;br /&gt;To get the other half, I used z0mbie's XDE engine on trial decryptions (incrementing trial keys) to see which key produced the most normal disassembly; normal meaning it consisted of typical instructions: push, pop, call, etc.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;UPDATE&lt;/span&gt;: crackme was removed from crackmes.de since it is preferred that the real author submit - a copy is in this site's crackmes folder&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-934486630342538840?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/934486630342538840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/03/eggis-arteam-crackme-1.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/934486630342538840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/934486630342538840'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/03/eggis-arteam-crackme-1.html' title='Eggi&apos;s Arteam Crackme #1'/><author><name>andrewl</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-1161467243006021759</id><published>2009-03-20T14:56:00.007-04:00</published><updated>2010-05-13T16:44:50.136-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reversing'/><title type='text'>Paltalk Password Storage Algorithm</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/filedump/paltalk_login.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 240px; height: 295px;" src="http://andrewl.dreamhosters.com/filedump/paltalk_login.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;There are a ton of password recovery tools for this program, so how hard can the storage algorithm be?&lt;br /&gt;&lt;br /&gt;Homemade schemes can be very interesting. Here, in the registry is stored one dword for each of the password characters.&lt;br /&gt;&lt;br /&gt;The username and is interleaved with the volume serial number. Like "myuser" and volume serial DEADBEEF come to: "mDyEuAsDeBrEEF". That is then trippled: "mDyEuAsDeBrEEFmDyEuAsDeBrEEFmDyEuAsDeBrEEF".&lt;br /&gt;&lt;br /&gt;The registry value is then used to subtract values from certain characters, resulting in the password. It is easier to convey in code: see paltalk_pw_recover.cpp in filedump.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1161467243006021759?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1161467243006021759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/03/paltalk-password-storage-algorithm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1161467243006021759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1161467243006021759'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/03/paltalk-password-storage-algorithm.html' title='Paltalk Password Storage Algorithm'/><author><name>andrewl</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-1546617459093993319.post-2753559195079193992</id><published>2009-03-11T01:37:00.010-04:00</published><updated>2010-05-13T16:45:00.799-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Cyclop's Angler</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/crackmes/Cyclops_Angler.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 288px;" src="http://andrewl.dreamhosters.com/crackmes/Cyclops_Angler.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;A fellow mod from crackmes.de has posted an interesting crackme that will exercise your number theory knowledge. It's short and not too hard, have fun!&lt;br /&gt;&lt;br /&gt;Funny hint: the color of the crackme may be some clue!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;EDIT&lt;/span&gt;: freesoul freaking solved it in record time! (I admittedly had a head start as it rested in the moderator queue). So the spoiler is that it's Goldbach's conjecture. The serial has four pairs of numbers that must be prime and sum to four CRC's generated from the username (which are incremented if odd).&lt;br /&gt;&lt;br /&gt;Cyclops said that not all usernames have serials, but I think they do. The CRC's are 32-bits, and the conjecture has been tested way up above 2^32. Since the addition check happens in the confines of a 32-bit register, you can even generate serials for when a CRC is 0 or 2 (aim for 2^32 and 2^32+2).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2753559195079193992?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2753559195079193992/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/03/solution-to-cyclops-angler.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2753559195079193992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2753559195079193992'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/03/solution-to-cyclops-angler.html' title='Cyclop&apos;s Angler'/><author><name>andrewl</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-1546617459093993319.post-763366762514634951</id><published>2009-03-07T23:54:00.013-05:00</published><updated>2010-02-02T11:12:26.140-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reversing'/><title type='text'>Internal binary representation of FGInt</title><content type='html'>From FGInt.pas:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;//   TFGInt = Record&lt;br /&gt;//      Sign : TSign;&lt;br /&gt;//      Number : Array Of LongWord;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In a crackme, the MD5 of "myname" == ABB45C192F0818FF22B7DDDA8566DAC3 is made into an FGInt via Base256StringToFGInt(). Looking at the memory where this FGInt is stored:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;0014fc04  00000001 00862354 0014fc34 0001d4c7&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Where 000000001 is the Sign member and 00862354 is the Number member.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;00862354  00000009 44414333 706a6c6c 11111104&lt;br /&gt;00862364  119211ba 13846463 48c60706 50cc4e4c&lt;br /&gt;00862374  21211a1a 00000041 00860a3c 0001f604&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Where 00000009 is the amount of dwords in the array, and the 44414333 706a6c6c 11111104... are the members of the array.&lt;br /&gt;&lt;br /&gt;Strange, but the only quantities contributing to the FGInt are the 31 lower bits of the 9 dwords.&lt;br /&gt;&lt;br /&gt;Here is some C where a 64-bit value is used as kind of a bit buffer to shift in the 31-bit chunks. When more than 8 are collected, a byte can be consumed. If you know a better way, please tell me.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;       typedef struct {&lt;br /&gt;           ULONG nLongWords;&lt;br /&gt;           ULONG longWords[1];&lt;br /&gt;       } DELPHI6ARRAYLONGWORD, *PDELPHI6ARRAYLONGWORD;&lt;br /&gt;&lt;br /&gt;       // assume DELPHI6ARRAYLONGWORD variable darray and byte buffer bytes[]&lt;br /&gt;&lt;br /&gt;       for(int i=0; i&amp;lt;darray.nLongWords; ++i)&lt;br /&gt;           OutputRaw("digit %d: %08X\n", i, (ULONG)digits[i]);&lt;br /&gt;&lt;br /&gt;       ULONGLONG ullBuff=0;&lt;br /&gt;       UINT bytei=0;&lt;br /&gt;&lt;br /&gt;       UINT nBitsInBuff=0;&lt;br /&gt;&lt;br /&gt;       for(int i=0; i&amp;lt;darray.nLongWords; ++i)&lt;br /&gt;       {&lt;br /&gt;           ullBuff |= (digits[i] &amp;lt;&amp;lt; nBitsInBuff);&lt;br /&gt;&lt;br /&gt;           nBitsInBuff += 31;&lt;br /&gt;&lt;br /&gt;           while(nBitsInBuff &amp;gt;= 8)&lt;br /&gt;           {&lt;br /&gt;               bytes[bytei++] = ullBuff &amp;amp; 0xFF;&lt;br /&gt;               ullBuff &amp;gt;&amp;gt;= 8;&lt;br /&gt;               nBitsInBuff -= 8;&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       if(nBitsInBuff)&lt;br /&gt;           bytes[bytei++] = ullBuff &amp;amp; 0xFF;&lt;br /&gt;&lt;br /&gt;       for(int i=bytei-1; i&amp;gt;=0; i--)&lt;br /&gt;           OutputRaw("%02X", (ULONG)bytes[i]);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The output is good:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;digit 0: 44414333&lt;br /&gt;digit 1: 706A6C6C&lt;br /&gt;digit 2: 11111104&lt;br /&gt;digit 3: 119211BA&lt;br /&gt;digit 4: 13846463&lt;br /&gt;digit 5: 48C60706&lt;br /&gt;digit 6: 50CC4E4C&lt;br /&gt;digit 7: 21211A1A&lt;br /&gt;digit 8: 00000041&lt;br /&gt;0000004142423434433139304630383038464630324237404444410035363644414333&lt;br /&gt;&lt;/pre&gt;The bytes of the FGInt (within the 31-bit chunks) are stored little-endian. The 414242... start the "ABB..." from the hash.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Feb 02, 2010 EDIT&lt;/b&gt;: Numernia informed me that 31-bits is chosen to easily propagate carry bits across addition (carry flag and adc instruction are not accessible from delphi)... a closer look at FGInt source verifies this:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;Trest := FGInt1.Number[i] + FGInt2.Number[i] + rest;&lt;/div&gt;&lt;div&gt;Sum.Number[i] := Trest And 2147483647;&lt;/div&gt;&lt;div&gt;rest := Trest Shr 31;&lt;br /&gt;&lt;br /&gt;Switch "rest" with "carry" in your mind. 2147483647 is 0x7FFFFFFF.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-763366762514634951?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/763366762514634951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/03/internal-binary-representation-of-fgint.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/763366762514634951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/763366762514634951'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/03/internal-binary-representation-of-fgint.html' title='Internal binary representation of FGInt'/><author><name>andrewl</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-1546617459093993319.post-8976959632113353820</id><published>2009-03-02T01:44:00.007-05:00</published><updated>2010-05-13T16:45:11.214-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Xspider's xCryptokGnMe #1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/crackmes/xspider_xCryptokGnMe1.png"&gt;&lt;/a&gt;[difficulty: 2][protection: modified blowfish, distractions]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/crackmes/xspider_xCryptokGnMe1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 267px; height: 204px;" src="http://andrewl.dreamhosters.com/crackmes/xspider_xCryptokGnMe1.png" alt="" border="0" /&gt;&lt;/a&gt;This crackme does a few things to distract you, like getting the dialog text of fields that don't exist, computing a SHA1 hash and then not using it, and other calculations. Ultimately 16 calls to blowfish's F() function (that does not use the tables within the blowfish context struct) work on the first 64-bits of your entered username. A little custom math after that computers your 64-bit key. Crackme is fishable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-8976959632113353820?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/8976959632113353820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/03/xspiders-xcryptokgnme-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8976959632113353820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8976959632113353820'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/03/xspiders-xcryptokgnme-1.html' title='Xspider&apos;s xCryptokGnMe #1'/><author><name>andrewl</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-1546617459093993319.post-7841409871012102078</id><published>2009-03-01T16:28:00.005-05:00</published><updated>2009-03-23T17:19:46.068-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Trevil's Keygenme #1</title><content type='html'>[difficulty: 2] [protection: 1/2 of RSA]&lt;br /&gt;&lt;br /&gt;Check out Trevil's (a cool guy from #c4n) keygenme. It's old, and does some basic RSA stuff. Just encrypt(user) == serial. But the fact that its in VB made it a little difficult. I probably would have been lost without Googling for some of the strings. See if you can do it without searching!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-7841409871012102078?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/7841409871012102078/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/03/trevils-keygenme-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7841409871012102078'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7841409871012102078'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/03/trevils-keygenme-1.html' title='Trevil&apos;s Keygenme #1'/><author><name>andrewl</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-1546617459093993319.post-1965639211565855160</id><published>2009-03-01T16:10:00.009-05:00</published><updated>2010-05-13T16:45:21.239-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Malfunction's "Digital Arithmetic"</title><content type='html'>[difficulty: 5] [protection: SEH, NAND Circuit Simulation]&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://andrewl.dreamhosters.com/crackmes/malfunction_DigitalArithmetic.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 464px; height: 139px;" src="http://andrewl.dreamhosters.com/crackmes/malfunction_DigitalArithmetic.png" alt="" border="0" /&gt;&lt;/a&gt;This crackme has encrypted functions and to decrypt them, you must trace through some exceptions. Luckily they follow a standard form and a static deprotector can be made (included in the solution.)&lt;br /&gt;&lt;br /&gt;The functions eventually reads in your key file, which must contain a description of a NAND gate logic circuit whose simulation verifies some calculations made in the crackme from your username. The bits of some generated inputs are the hi/lo inputs of the nand gates, and the output hi/lo is the output bits.&lt;br /&gt;&lt;br /&gt;The major weakness is that the crackme only generates ten input/output pairs to verify that your circuit works. For instance the username "malfunction" generates:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;input              output&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;0x103473A2E909556A 0xD5C5F13B5D19C47B&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0xD58409F7ACE0B636 0xCC00155EACD0443C&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0xB8E23CEC3499154F 0xDA1F03994BAD8545&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0x7D0D5F4A4B7EE494 0x3700BB945FE19291&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0x3C8249E1942D1311 0xB21A80661AF8410E&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0x6450E69AC82EF542 0x149E7890D8C07AFC&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0xFA754B5BE6241519 0x4D0FF60D1535ED08&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0xD2AC47F7A3DDC7F2 0xD8002D85A3D9E8D5&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0x67BF14070BAAE972 0x8F000EC07480C934&lt;/span&gt; &lt;span style="font-family:courier new;"&gt;&lt;br /&gt;0x7D173C2B4336EE20 0xE1F3F4387250BC3F&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here again (like in BUBlic's Xor2Zero) the strength of understanding GF(2) and vectors of GF(2) is shown (even if it is basic as hell, like mine :)). The bit columns of the input and outputs can be thought of as vectors. This yields 64 vectors, each with 10 dimensions.&lt;br /&gt;&lt;br /&gt;Since the smallest basis of ten dimensions is a set of 10 vectors, having 64 nearly guarantees that we have a basis here. So we must be able to find some vectors that, summed (xor) over GF(2) give us any output vector we want. In reality, it is difficult to find some output vector that needs more than 3 input vectors.&lt;br /&gt;&lt;br /&gt;Thus we could solve Digital Arithmetic if only it was a simulation of XOR gates. But it's a simulation of NAND gates. What to do?&lt;br /&gt;&lt;br /&gt;XOR(A,B) = NAND(NAND(A,(NAND(A,B)),NAND(B,NAND(A,B)))&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1965639211565855160?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1965639211565855160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/03/malfunctions-digital-arithmetic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1965639211565855160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1965639211565855160'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/03/malfunctions-digital-arithmetic.html' title='Malfunction&apos;s &quot;Digital Arithmetic&quot;'/><author><name>andrewl</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-1546617459093993319.post-6690389242768613953</id><published>2009-02-26T16:57:00.020-05:00</published><updated>2010-05-13T16:45:39.110-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Waganono's D-Vinaigrez Moi</title><content type='html'>[difficulty: 2] [protection: HMAC, XOR]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/Waganono_D-VinaigrezMoi.png" /&gt;&lt;/div&gt;&lt;p&gt;Another one for my Waganono collection :) Your serial number "decrypts" (xor) a ciphered message in the crackme. The crackme verifies proper decryption by using a keyed hash message authentication code. You get a French message and a song as a reward! You can see patterns in the ciphertext that clue you to the length of the key. Next, individual bytes of the key can be toggled to maximize the amount of "normal" text in trial decryptions. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-6690389242768613953?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/6690389242768613953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/waganonos-d-vinaigrezmoi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6690389242768613953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6690389242768613953'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/waganonos-d-vinaigrezmoi.html' title='Waganono&apos;s D-Vinaigrez Moi'/><author><name>andrewl</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-1546617459093993319.post-1681059911509298939</id><published>2009-02-26T16:57:00.019-05:00</published><updated>2010-05-13T16:45:33.778-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>BUBLic's Xor2Zero</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 3] [&lt;b&gt;protection&lt;/b&gt;: GF(2) math]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/BUBlic_Xor_2_Zero.png" /&gt;&lt;/div&gt;&lt;p&gt;This one is really neat! MD5 is used to generate a system of linear equations over GF(2). Your serial encodes a solution to the equations. Only XOR, and AND can be used. A reduced Gauss-Jordan elimination algorithm was employed to make a keygen. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1681059911509298939?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1681059911509298939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/bublics-xor2zero.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1681059911509298939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1681059911509298939'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/bublics-xor2zero.html' title='BUBLic&apos;s Xor2Zero'/><author><name>andrewl</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-1546617459093993319.post-4731022949667862987</id><published>2009-02-26T16:57:00.018-05:00</published><updated>2010-05-13T16:45:29.687-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>BUBLic's Security^-1</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 4] [&lt;b&gt;protection&lt;/b&gt;: MD5, NTRU crypto]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/BUBlic_securitypow1.png" /&gt;&lt;/div&gt;&lt;p&gt;MD5 is used on the username to generate what's called a truncated polynomial within the NTRU cryptosystem. It represents the plaintext. The entered serial number encodes a polynomial that is the ciphertext, and the crackme decrypts it to compare it to the plaintext. Keygenning is just enciphering the the poly produced from the username, but a small shortcut can be taken. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4731022949667862987?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4731022949667862987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/bublics-security-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4731022949667862987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4731022949667862987'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/bublics-security-1.html' title='BUBLic&apos;s Security^-1'/><author><name>andrewl</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-1546617459093993319.post-5868537879643307162</id><published>2009-02-26T16:56:00.004-05:00</published><updated>2010-05-13T16:45:51.399-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Bruteforceme#1_astigmata</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 2] [&lt;b&gt;protection&lt;/b&gt;: the RCR instruction :)]&lt;br /&gt;&lt;p&gt;A machine has been dedicated to searching for the key to Bruteforceme#1_astigmata, a crackme which has stood unsolved for quite a while now. &lt;a href="http://crackmes.de/users/astigmata/bruteforceme1_astigmata/" style="color: red;"&gt;(LINK: Bruteforceme#1_astigmata)&lt;/a&gt;. What's so neat about the crackme is that there are really only four instructions that make it so difficult. Those instructions are iterated 1E8 times. RCR has no 1:1 inverse, but it is invertible. The branching factor, moving backwards, is so large that any attempt to go back more than 100 iterations becomes infeasible. It is also not difficult to find (eax,ebx) pairs that lead to a solution by just allowing the loop to run unbounded, and stopping when the xor result is 0xD5446474 (keep a 1E8 history). So back to brute force. My biggest fear is that no answer exists. I'm confident that the search is correct because I compared some outputs with outputs of the crackme. Some inputs were also chosen, ran them through the crackme to get the xor result, and then the search was tested to see if it could really find the chosen input. &lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;img style="border: 0pt none ;" src="http://andrewl.dreamhosters.com/crackmes/astigmata_bruteforceme1.png" /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;&lt;br /&gt;UPDATE!&lt;/b&gt; After nearly 9 days of searching, on Christmas eve morning (2008), the serial was found :) See the solution in the crackme solutions download link or on crackmes.de.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-5868537879643307162?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/5868537879643307162/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/bruteforceme1astigmata.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5868537879643307162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/5868537879643307162'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/bruteforceme1astigmata.html' title='Bruteforceme#1_astigmata'/><author><name>andrewl</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-1546617459093993319.post-2632227700505875781</id><published>2009-02-26T16:55:00.030-05:00</published><updated>2010-08-17T11:37:08.316-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>JE's "jE!_CRC_DRx"</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 7] [&lt;b&gt;protection&lt;/b&gt;: SEH, TF, HW BP's]&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_I5FRefiygsU/TGqsnvkGIwI/AAAAAAAAACE/52mpS7u_VDU/s1600/jE!_CRC_DRx.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_I5FRefiygsU/TGqsnvkGIwI/AAAAAAAAACE/52mpS7u_VDU/s320/jE!_CRC_DRx.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;At only 11k, this crackme is a real pain. It's a puzzle from you must supply an input file that coerces the crackme into displaying a message box (the usual user32!MessageBoxA). There is some anti-debug. The calculation is based on the bytes of the executabe memory image, so it will change if BPX's are present. The code itself has int3 and a handler for int3, making you wonder how much the cme behavior will intersect with your debugger. The DRx registers are used as the area for calculations, an obstacle for BPM. It also depends on the trap flag being set in certain places, so single-stepping is not an easy option. Though I lost alot of time on it, it forced me to learn alot about my debugger (making it pass and handle certain exceptions, tracing SEH, etc.) For some reason, I find jE!'s comments very entertaining:       &lt;br /&gt;&lt;pre&gt;U must buid KEY-file, which forces cr0ckme to show msgbox:&lt;br /&gt;&lt;br /&gt;WOW!&lt;br /&gt;CONGRATULATIONZ!&lt;br /&gt;&lt;br /&gt;main cr0ckme idea is playing with SEHs..&lt;br /&gt;(look at comment in code below)&lt;br /&gt;&lt;br /&gt;after i imagined some fun-way to call MessageBox..&lt;br /&gt;fun is fun, but what for U!?&lt;br /&gt;btw, maybe i will call it 'READY-STACK' &amp;amp; write another cr0ckme on this idea!&lt;br /&gt;&lt;br /&gt;so i mostly removed my-fun! U must discover that fun-way first!&lt;br /&gt;(info leaved should be enough.. U need fUntaziE+LogiQ, have U!?)&lt;br /&gt;then you need discover main ck0ckme idea.. o-o-o!&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2632227700505875781?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2632227700505875781/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/jecrcdrx.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2632227700505875781'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2632227700505875781'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/jecrcdrx.html' title='JE&apos;s &quot;jE!_CRC_DRx&quot;'/><author><name>andrewl</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://1.bp.blogspot.com/_I5FRefiygsU/TGqsnvkGIwI/AAAAAAAAACE/52mpS7u_VDU/s72-c/jE!_CRC_DRx.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1546617459093993319.post-3603677334071856875</id><published>2009-02-26T16:55:00.028-05:00</published><updated>2010-05-13T16:46:04.283-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>TMG official keygenme #3</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 4] [&lt;b&gt;protection&lt;/b&gt;: El-Gamal Signature Scheme]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/TMG_Official_Trial_3.png" /&gt;&lt;/div&gt;The username is converted into a message using MD5 and a powmod op. The serial number you supply is the signature which is verified using a public key hardcoded in the crackme. In other words, keygenning is forging the signature for the username.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-3603677334071856875?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/3603677334071856875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/tmg-official-keygenme-3.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3603677334071856875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/3603677334071856875'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/tmg-official-keygenme-3.html' title='TMG official keygenme #3'/><author><name>andrewl</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-1546617459093993319.post-6022316139191840490</id><published>2009-02-26T16:55:00.027-05:00</published><updated>2010-05-13T16:45:58.884-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme'/><title type='text'>"UPSKiRT"</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 3] [&lt;b&gt;protection&lt;/b&gt;: Modular Arithmetic]&lt;br /&gt;&lt;br /&gt;&lt;p&gt;"UPSKiRT" CrackME&lt;/p&gt;&lt;p&gt;- serial verification uses elementary number theory&lt;/p&gt;&lt;p&gt;- uses just four or five different calls to custom big number lib&lt;/p&gt;&lt;p&gt;- values of big numbers in memory are EXTREMELY obvious&lt;/p&gt;&lt;p&gt;The serial verification is based on a single call, no decoys. The only anti-debug is distracting multimedia :) I apologise in advance if any bugs are found. Kindly report them immediately. Crackme and a working keygen were tested on 32-bit XP SP2.&lt;/p&gt;&lt;p&gt;Keygen only! Enjoy!&lt;/p&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/UPSKiRT.png" /&gt;&lt;/div&gt;&lt;p&gt;&lt;b&gt;UPDATE!&lt;/b&gt; Numernia has solved my crackme in an impressive manner! See his solution in my solutions link or on crackmes.de. I've decided also to release the keygen I made during testing for another angle at the problem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-6022316139191840490?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/6022316139191840490/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/upskirt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6022316139191840490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/6022316139191840490'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/upskirt.html' title='&quot;UPSKiRT&quot;'/><author><name>andrewl</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-1546617459093993319.post-30348315915467225</id><published>2009-02-26T16:55:00.023-05:00</published><updated>2009-03-23T17:19:09.187-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>c00lw0lf's KeygenMe1</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 1] [&lt;b&gt;protection&lt;/b&gt;: RSA]&lt;br /&gt;&lt;p&gt;It has an easily factorable modulus. Crackme serial must encipher/decipher to a number derived from the "C:\" volume serial number.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-30348315915467225?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/30348315915467225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/c00lw0lfs-keygenme1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/30348315915467225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/30348315915467225'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/c00lw0lfs-keygenme1.html' title='c00lw0lf&apos;s KeygenMe1'/><author><name>andrewl</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-1546617459093993319.post-4067570689207816808</id><published>2009-02-26T16:55:00.022-05:00</published><updated>2009-03-23T17:19:02.887-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>Crosys's Keygenme 2008</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 4] [&lt;b&gt;protection&lt;/b&gt;: DSA]&lt;br /&gt;&lt;p&gt;I was stuck on this crackme for some time, not able to recognise or figure out the math. A clue came from fuss on IRC who revealed that it was digital signature algorithm :) The serials consist of three parts: a message, and the two components of the signature, using the public key parameters stored in the crackme. I can imagine such a scheme being used in a real protection: the message could encode enabled/disabled features or a license expiration time, and the signature (only producible by the company having the private key) prevents forgeries.&lt;/p&gt;     &lt;p&gt;DSA is interesting in its similarity to the El-Gamal scheme present in the last TMG crackme. In El-Gamal, there was only one prime, and the random K you chose had to be ensured relatively prime to P-1. DSA is more complicated. The public parameters consist of two primes, one which divides the totient of the other, and the K can be chosen freely within the number line of the smaller prime. Bruce Schneier's "Applied Cryptography" has an interesting discussion of the similarities between signature schemes based on the discrete logarithm problem at chapter 20.4 where he unifies them with generalized equations and attempts to count all possible variations.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4067570689207816808?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4067570689207816808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/crosys-keygenme-2008.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4067570689207816808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4067570689207816808'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/crosys-keygenme-2008.html' title='Crosys&apos;s Keygenme 2008'/><author><name>andrewl</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-1546617459093993319.post-4651256032803480716</id><published>2009-02-26T16:54:00.030-05:00</published><updated>2010-05-13T16:46:31.864-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"Ra$cal crackme N3 with VM" by Ra$cal</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 4] [&lt;b&gt;protection&lt;/b&gt;: Virtual Machine]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/ra$cal_VM_N3.png" border="1" /&gt;&lt;/div&gt;&lt;p&gt;The VM supports 25 instruction, some of which contain obfuscated opcodes. The VM program is nearly 1000 instructions long. I needed to write a program that drew VM execution using text to get an idea what was going on, and then resigned to making a full disassembler, which isn't perfect, but sufficient. The final algorithm held in the VM consists of xor's and rol's on the serial and output of GetComputerName().&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;March 25th, 2009 EDIT&lt;/span&gt;:&lt;br /&gt;Posted crackme source rascal_n3_vm_src.rar in filedump!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;May 11th,  2009 EDIT&lt;/span&gt;:&lt;br /&gt;Source moved to ra$cal_vm_n3_src.rar in crackmes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4651256032803480716?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4651256032803480716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/racal-crackme-n3-with-vm-by-racal.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4651256032803480716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4651256032803480716'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/racal-crackme-n3-with-vm-by-racal.html' title='&quot;Ra$cal crackme N3 with VM&quot; by Ra$cal'/><author><name>andrewl</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-1546617459093993319.post-9209292093679110854</id><published>2009-02-26T16:54:00.029-05:00</published><updated>2010-05-13T16:46:25.931-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"Genaytyk's VM KeygenMe"</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 5] [&lt;b&gt;protection&lt;/b&gt;: Virtual Machine, packed with MEW]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/Genaytyk_VM_KeygenMe.png" /&gt;&lt;/div&gt;&lt;p&gt;This is a well-structured VM with instructions analogous to x86 architecture, but with a larger set of registers. There are about 30 opcodes. The program executed by the VM is just under 400 instructions long and is some kind of monstrous crypto algorithm of the author's design (Genaytyk calls it a "high cipher" in his crackmes.de description).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; artif has solved this crackme too! see his keygen written in pure ASM in the crackme solutions download link&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-9209292093679110854?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/9209292093679110854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/genaytyks-vm-keygenme.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/9209292093679110854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/9209292093679110854'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/genaytyks-vm-keygenme.html' title='&quot;Genaytyk&apos;s VM KeygenMe&quot;'/><author><name>andrewl</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-1546617459093993319.post-8746043114910838159</id><published>2009-02-26T16:54:00.028-05:00</published><updated>2010-05-13T16:46:21.325-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"JUNo" by _J_</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 3] [&lt;b&gt;protection&lt;/b&gt;: modified MD5, unknown math, 3way block cipher]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/j_juno.png" /&gt;&lt;/div&gt;&lt;p&gt;JUNo contains floating point math utilizing the normal instructions and a math library called MAPM (Mike's Arbitrary Precision Math). However, the path between the serial number and the comparison requiring satisfaction is separated only by the 3way code. Ultimately the serial needs to be the ciphertext that, when decrypted with a key generated by the crackme, yields a block of plaintext derived from the name and company fields.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-8746043114910838159?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/8746043114910838159/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/juno-by-j.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8746043114910838159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8746043114910838159'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/juno-by-j.html' title='&quot;JUNo&quot; by _J_'/><author><name>andrewl</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-1546617459093993319.post-7732420703211730471</id><published>2009-02-26T16:54:00.027-05:00</published><updated>2010-05-13T16:46:16.351-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"ScrewME #2" by Dynasty</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 4] [&lt;b&gt;protection&lt;/b&gt;: obfuscation, custom serial routine]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/Dynasty_Screwme2.png" /&gt;&lt;/div&gt;&lt;p&gt;This has some anti-debugging tricks obscured among junk/obfuscation. The parts that verify the serial, however, are plaintext and viewable in IDA, so you can breakpoint there without stepping through the nonsense. I included a single-stepping program to attempt a more general counter to the problem of "finding the algorithm among the hay stack". An experienced reverser on crackmes.de, HMX0101 rates the difficulty at just 1 or 2.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-7732420703211730471?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/7732420703211730471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/screwme-2-by-dynasty.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7732420703211730471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/7732420703211730471'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/screwme-2-by-dynasty.html' title='&quot;ScrewME #2&quot; by Dynasty'/><author><name>andrewl</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-1546617459093993319.post-13557784481845284</id><published>2009-02-26T16:54:00.019-05:00</published><updated>2009-03-23T17:18:16.639-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"miniVM Crackme v1" by craig@neo</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 2] [&lt;b&gt;protection&lt;/b&gt;: Virtual Machine]&lt;br /&gt;&lt;p&gt;The machine is of decent size, but you only have to trace a small subset of the instructions to follow the logic. This was just the right difficulty, I feel, for a first VM crackme - and now I want to do more of them :). The author says that the source code for the crackme will be posted at http://labs.neohapsis.com after RECON.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-13557784481845284?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/13557784481845284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/minivm-crackme-v1-by-craigneo.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/13557784481845284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/13557784481845284'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/minivm-crackme-v1-by-craigneo.html' title='&quot;miniVM Crackme v1&quot; by craig@neo'/><author><name>andrewl</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-1546617459093993319.post-4801429908614554729</id><published>2009-02-26T16:53:00.024-05:00</published><updated>2010-05-13T16:47:36.185-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"Demeter" by _J_</title><content type='html'>&lt;b&gt;[difficulty&lt;/b&gt;: 4] [&lt;b&gt;protection&lt;/b&gt;: RSA, custom HAVAL]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/j_demeter.png" /&gt;&lt;/div&gt;&lt;p&gt;A big number library called BigDigits is used in this crackme, and making sense of its code is the hardest task. Correct serials are the RSA ciphertexts whose decryption yields a plaintext derived from the username and volume serial number.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4801429908614554729?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4801429908614554729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/demeter-by-j.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4801429908614554729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4801429908614554729'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/demeter-by-j.html' title='&quot;Demeter&quot; by _J_'/><author><name>andrewl</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-1546617459093993319.post-2280663097152796484</id><published>2009-02-26T16:53:00.023-05:00</published><updated>2010-05-13T16:47:31.383-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"D-Racinez Moi" by Waganono</title><content type='html'>&lt;b&gt;[difficulty&lt;/b&gt;: 3] [&lt;b&gt;protection&lt;/b&gt;: ripemd160, quadratic residue formula]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/waganono_dracinezmoi.png" /&gt;&lt;/div&gt;&lt;p&gt;There's a collection of anti-debug tricks in a TLS routine. A big number (using OpenSSL) quadratic residue equation has to be solved - but it's of special form, allowing the solution to be found in pieces and combined using the Chinese remainder theorem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2280663097152796484?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2280663097152796484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/d-racinez-moi-by-waganono.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2280663097152796484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2280663097152796484'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/d-racinez-moi-by-waganono.html' title='&quot;D-Racinez Moi&quot; by Waganono'/><author><name>andrewl</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-1546617459093993319.post-2319966252050127844</id><published>2009-02-26T16:53:00.022-05:00</published><updated>2010-05-13T16:47:23.627-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme'/><title type='text'>"Russian Dolls"</title><content type='html'>&lt;div class="news_body"&gt;&lt;b&gt;[difficulty&lt;/b&gt;: 3] [&lt;b&gt;protection&lt;/b&gt;: Telescoping Code :)]&lt;br /&gt;&lt;p&gt;"Russian Dolls" CrackME&lt;/p&gt;&lt;p&gt;You will quickly find "good boy" and "bad boy" message.&lt;/p&gt;&lt;p&gt;The decision is based on one call. No tricks.&lt;/p&gt;&lt;p&gt;The call is to the "Russian Dolls" verification function. (Russian dolls are those dolls where there's like one inside another, and one inside that, and so on...)&lt;/p&gt;&lt;p&gt;You'll quickly see the similarity of how this verificationi function executes and the dolls that the crackme name refersi to.&lt;/p&gt;&lt;p&gt;Write a keygen and a tutorial!&lt;/p&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/russian_dolls.png" /&gt;&lt;/center&gt;         &lt;p&gt;&lt;b&gt;UPDATE!&lt;/b&gt; red477 made short work of this crackme using his IDA script writing skills! See his solution on crackmes.de or in my solutions link!&lt;a style="color: red;" href="http://www.crackmes.de/users/andrewl.us/russian_dolls/solutions/red477"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2319966252050127844?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2319966252050127844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/russian-dolls.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2319966252050127844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2319966252050127844'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/russian-dolls.html' title='&quot;Russian Dolls&quot;'/><author><name>andrewl</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-1546617459093993319.post-8055414496962793657</id><published>2009-02-26T16:53:00.021-05:00</published><updated>2010-05-13T16:46:37.920-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"MiSHKA'S RETRiBUTiON" by Zart</title><content type='html'>[&lt;b&gt;difficulty&lt;/b&gt;: 4] [&lt;b&gt;protection&lt;/b&gt;: custom serial routine]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/zart_mishkas_retribution.png" /&gt;&lt;/div&gt;&lt;p&gt;Not much of the stuff in this crackme makes sense. To produce keys that work, some logic and some brute forcing was required.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-8055414496962793657?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/8055414496962793657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/mishkas-retribution-by-zart.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8055414496962793657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8055414496962793657'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/mishkas-retribution-by-zart.html' title='&quot;MiSHKA&apos;S RETRiBUTiON&quot; by Zart'/><author><name>andrewl</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-1546617459093993319.post-4678319172033535561</id><published>2009-02-26T16:52:00.016-05:00</published><updated>2010-05-13T16:47:50.242-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"D-Montez Moi" by Waganono (in crackme solutions)</title><content type='html'>&lt;div class="news_body"&gt;&lt;b&gt;[difficulty&lt;/b&gt;: 2] [&lt;b&gt;protection&lt;/b&gt;: custom math]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/waganono_dmontezmoi.png" /&gt;&lt;/div&gt;&lt;p&gt;Anti-debug tricks in TLS routine and a math problem (mod 2^64) have to be beaten.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-4678319172033535561?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/4678319172033535561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/d-montez-moi-by-waganono_26.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4678319172033535561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/4678319172033535561'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/d-montez-moi-by-waganono_26.html' title='&quot;D-Montez Moi&quot; by Waganono (in crackme solutions)'/><author><name>andrewl</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-1546617459093993319.post-2800830660237469718</id><published>2009-02-26T16:52:00.015-05:00</published><updated>2010-05-13T16:47:41.090-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"192 Bits" by NeoN</title><content type='html'>&lt;div class="news_body"&gt;&lt;b&gt;[difficulty&lt;/b&gt;: 3] [&lt;b&gt;protection&lt;/b&gt;: RSA]&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://andrewl.dreamhosters.com/crackmes/NeoN_192bits.png" /&gt;&lt;/div&gt;&lt;p&gt;My solution is very poor because I did not know much about big number structures at the time.&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-2800830660237469718?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/2800830660237469718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/192-bits-by-neon_26.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2800830660237469718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/2800830660237469718'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/192-bits-by-neon_26.html' title='&quot;192 Bits&quot; by NeoN'/><author><name>andrewl</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-1546617459093993319.post-1669444833149628750</id><published>2009-02-26T16:52:00.012-05:00</published><updated>2009-03-23T17:17:06.370-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='crackme solution'/><title type='text'>"Keygenme I v1.0" by luxor</title><content type='html'>&lt;div class="news_body"&gt;     &lt;b&gt;[difficulty&lt;/b&gt;: 3] [&lt;b&gt;protection&lt;/b&gt;: polynomial modulus equation]&lt;br /&gt;&lt;p&gt;Some lookup tables and transforms set up a cubic polynomial (mod 2^64) equation from the name and serial. Schoup's NTL makes short work of it.&lt;/p&gt;     &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-1669444833149628750?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/1669444833149628750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/02/keygenme-i-v10-by-luxor_26.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1669444833149628750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/1669444833149628750'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/02/keygenme-i-v10-by-luxor_26.html' title='&quot;Keygenme I v1.0&quot; by luxor'/><author><name>andrewl</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-1546617459093993319.post-8598316649844349117</id><published>2001-07-06T14:47:00.003-04:00</published><updated>2010-03-18T11:17:31.005-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='godaddy sucks'/><title type='text'>GoDaddy's Terrible Customer Care Policy</title><content type='html'>I get an email telling me it's time to renew my .us domain name registration. The price is $19.99 for one year. That's pretty expensive for even a .com.&lt;br /&gt;&lt;br /&gt;&lt;img alt="" border="0" src="http://andrewl.dreamhosters.com/filedump/godaddy_stupid1.png" style="display: block; height: 191px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 586px;" /&gt;&lt;br /&gt;So I call them up and ask why it's so expensive, considering registering the thing was something like $3 at the time. He offers me a "discount" to $7.99. You know that the email price is just to prey on the push-overs if they're willing to drop 60% just for questioning it.&lt;br /&gt;&lt;br /&gt;But look at the front page of GoDaddy (in my browser at the time of the phone call), and you can click to this offering: (screenshot taken July 6th, 2009).&lt;br /&gt;&lt;br /&gt;&lt;img alt="" border="0" src="http://andrewl.dreamhosters.com/filedump/godaddy_stupid0.png" style="display: block; height: 202px; margin-bottom: 10px; margin-left: auto; margin-right: auto; margin-top: 0px; text-align: center; width: 586px;" /&gt;&lt;br /&gt;You can get a BRAND NEW .us domain name for only $4.99 a year. Yet my registration is already in their system and they want $7.99 a year. I tell him "You know what this tells me? That you value new people that come across your website more than you value your existing customers." He responds that this is the price. I ask "Well explain to me how it is that an existing customer who just want RENEWAL can be charged more than a non-customer who wants a NEW registration... surely a renewal can't cost more than a registration, can it? How does this make sense?". He responds again that this is a price, and refuses my offer to renew for three years if HE WOULD JUST GIVE ME THE SAME PRICE AS NEW CUSTOMERS.&lt;br /&gt;&lt;br /&gt;So just out of principle now, (even though it will cost me more time and money), I must transfer this name elsewhere.&lt;br /&gt;&lt;br /&gt;Good thinking, GoDaddy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1546617459093993319-8598316649844349117?l=rcejunk.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rcejunk.blogspot.com/feeds/8598316649844349117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rcejunk.blogspot.com/2009/07/godaddys-terrible-customer-care-policy.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8598316649844349117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1546617459093993319/posts/default/8598316649844349117'/><link rel='alternate' type='text/html' href='http://rcejunk.blogspot.com/2009/07/godaddys-terrible-customer-care-policy.html' title='GoDaddy&apos;s Terrible Customer Care Policy'/><author><name>andrewl</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>
