Skip to content

Instantly share code, notes, and snippets.

@RobinMalfait
Last active December 10, 2015 21:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RobinMalfait/2c765cdeea8f9f79e418 to your computer and use it in GitHub Desktop.
Save RobinMalfait/2c765cdeea8f9f79e418 to your computer and use it in GitHub Desktop.
Crack that code :)

Hoe heb ik de code gekraakt?

"http://Yml0Lmx5/" + 1 + ([]+!!-[])[(1<<1)+1] + (1<<1) + (("".constructor)+'')[(1<<4)-(1<<1)] + 'zK' + (([][+[]]+{})[1<<1])

Je merkt op dat de code een link moet zijn, vermits Yml0Lmx5 geen geldige url is, moet deze ook nog omgezet worden. In het tweede deel merk je arrays op [], en bit-shifting (1<<4), dit wordt vaak gebruikt bij javascript. Je kan ook nog afleiden dat het javascript door het feit dat je 'zK' met single quotes kan gebruiken (meestal zijn single quotes voor characters, en geen strings).

TL;DR: 1 + ([]+!!-[])[(1<<1)+1] + (1<<1) + (("".constructor)+'')[(1<<4)-(1<<1)] + 'zK' + (([][+[]]+{})[1<<1]) (1s2gzKd) kan je letterlijk in je google chrome devtools > console plakken.

Part 1

In javascript heb je de functies:

btoa() // String naar base64 encoding
atob() // base64 encoding naar String

Deze zorgen voor base64 encoding en decoding, vermits dit standaard in javascript is, is het het proberen waard.

atob("Yml0Lmx5"); // "bit.ly"

Wist je dat google chrome (en safarie, firefox, ...) hun devtools awesome javascript debuggers zijn?!

Nu hebben we http://bit.ly/ al, wat vaak gebruikt wordt om "korte" urls te genereren. I think I'm on the right track!

Part 2

Dit is het tricky gedeelte, maar hier komen de rare dingen van javascript, biijvoorbeeld.

"0" + 1; // Dit geeft "01", want je javascript denkt dat het een string concatenatie is.
"0" - 1; // Dit geef -1, omdat javascript denkt dat de "0" een 0 is, en een - wordt niet als concatenatie bedoelt.

Ik zal de volgende stapjes nog wat opdelen:

a) 1

Het eerste wat we zien is 1, we zouden dit al kunnen opslaan, zo komen we bij http://bit.ly/1

b) ([]+!!-[])[(1<<1)+1]

Daarna zien we een ([]+!!-[]), de ronde haakjes wijzen op een "groep", de vierkante haakjes zijn een lege array. Bij een lege array kan je dingen optellen, maar javscript roept hier de .length eigenschap impliciet aan, en vermits deze leeg is is het een "0", dit is een string.

De twee !! lijkt op een dubbele negatie, maar in veel programmeer talen wilt dit zeggen dat je het resultaat omzet naar een boolean.

!!0; // false
!!1; // true

Nu het laatste deeltje van deze groep is een -[] wat op een -0 uitkomt.

Nu kunnen we zien dat een string + een false, waarde gelijk is aan de string "false".

Na deze groep komt het [(1<<1)+1] gedeelte, het leuke bij javascript is dat je bij een string ook ineens [] kan achterhangen om een index van deze string te verkrijgen.

"false"[0] = "f";
"false"[1] = "a";
"false"[2] = "l";
"false"[3] = "s";
"false"[4] = "e";

c) (1<<1)

Nu zie je iets raar (1<<1), dit heet bitshifting, en het is eigenlijk zeer simpel.

Ik kan het uitleggen aan volgende tabel, de eerste waarde voor de << is de waarde in bits, in dit geval een 1.

8 4 2 1
0 0 0 1

Nu shiften we deze bits 1 keer naar links. (Links van de richting <<, en 1 van het laatste getal)

16 8 4 2 1
0 0 0 1 0

Nu zie je dat je de waarde 2 krijgt.

(1<<1)+1 resulteert dan in een 3 dus als we terug naar "false" kijken is dit de s.

We hebben dit al kunnen kraken "http://Yml0Lmx5/" + 1 + ([]+!!-[])[(1<<1)+1] tot http://bit.ly/1s.

Het volgende stukje is de + (1<<1) +, we hebben hiervoor geleerd dat dit slaat op een 2, dus http://bit.ly/1s2

d) (("".constructor)+'')[(1<<4)-(1<<1)]

Daarna volgt dit rare stukje (("".constructor)+'')[(1<<4)-(1<<1)].

("".constructor) vermits alles objecten zijn, kan je op een String een constructor methode aanroepen. Als je de .constructor aanroept zonder ze uit te voeren, dan krijg je de "code" van deze methode. de +'' converteert het weer naar een string.

(1<<4)-(1<<1), komt op 14, dus het 15e karakter van de bovenstaande string. Dit komt op een g

Nu zitten we aan http://bit.ly/1s2g.

e) 'zK'

Het volgende is dan weer een makkelijke: 'zK', deze kunnen we er gewoon aanplakken: http://bit.ly/1s2gzK

f) (([][+[]]+{})[1<<1])

Het laatste deeltje dan, ook vrij eenvoudig nu je het door begint te krijgen.

+[] is een 0, omdat je weer op de lengte uitkomt van de lege array. Als je dit dan invult krijg je een [][0], maar het nulde element van een lege array is undefined. Nu zie je binnen de haakjes nog een +{}, de plus is weer een concatenatie van strings omdat het geen getalletjes zijn, {} is een omzet, en als je dit voorstelt als een string krijg je hetvolgende "[object Object]". Nu moeten we ze nog samenvoegen en dan krijg je "undefined[object Object]", van deze string nemen we het (1<<1), het 2e element, en dat is een d.

http://bit.ly/1s2gzKn is dus de uitkomst.

:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment