Ce weekend j’ai encore tenté d’aider maigrement l’équipe de Big-Daddy au CTF Forbidden Bits. Ce n’est pas facile de résoudre un chall sans qu’une des brutes de l’équipe ne le finisse avant vous. Heureusement je suis tombé sur le chall (Invisible/150) où ils avaient manifestement renoncés :). L’énoncé est ici : blank.html
Comme on peut le constater c’est une page vide. Si on regarde dedans on constate que ce vide est plein de tabulations, d’espaces et de retour chariots.
$ hexdump real.html | head 0000000 2020 0920 0909 0920 0909 200a 2020 090a 0000010 090a 2020 0920 0a20 0909 0909 2020 0a09 0000020 2009 0920 2020 0920 0920 0a0a 0a20 0920 0000030 2020 2020 0909 0a0a 2020 0920 2020 0920 0000040 0920 200a 2020 0909 2009 0920 0a09 2020 0000050 0a20 0a09 2009 2020 2009 090a 0909 2009 0000060 0920 090a 2020 2009 2020 0909 0a09 200a 0000070 200a 2009 2020 0920 0a09 200a 2020 2009 0000080 2020 0909 0a09 2020 0920 2009 0909 2020 0000090 200a 2020 090a 090a 2020 0920 0a20 0909
Et c’est là que ce genre de chall sombre dans ce que je n’aime pas du tout; le non sens.
On regarde si c’est pas du Morse… On regarde si c’est pas du Snow… (Snow est une méthode de stéganographie élaborée qui se base sur les espaces). Toujours rien…
Là on se tourne vers DuckDuckGo, pour “WhiteSpace” on découvre qu’il y a aussi un language de programmation éponyme (Le language Whitespace pas le language éponyme :) )
https://en.wikipedia.org/wiki/Whitespace_(programming_language)
Et là on se dit “Non Quoi”… J’ai trouvé sur un site de fan un interpreteur perl déja tout cuit. Au premiers abords le truc est pas content.
$perl whitespace.pl real.htlm [stuck]^c $perl whitespace.pl < real.html wrong
Ne comprenant pas d’où sort ce “wrong” je trouve l’option qui debug le programme. On se rend compte que oui c’est bien un script Whitespace. Me voici enfin avec le debug suivant.
$ perl whitespace.pl < real.html -d command list: AAABBBABBBCAAACBCBAAABACBBBBAABCBAABAAABABCCACABAAAABBCCAAABAAABABCAAABBBAABBCAAACBCBAAABACBBBBAABCBAABAAABBBCCACABAAAABBCCAAABAAABBBCAAABBABBAACAAACBCBAAABACBBBBAABCBAABAABAAACCACABAAAABBCCAAABAABAAACAAABBAAAABCAAACBCBAAABACBBBBAABCBAABAABAABCCACABAAAABBCCAAABAABAABCAAABBABBBACAAACBCBAAABACBBBBAABCBAABAABABACCACABAAAABBCCAAABAABABACAAABBAABBBCAAACBCBAAABACBBBBAABCBAABAABABBCCACABAAAABBCCAAABAABABBCAAABABABAACACABCAAAAABBABAAACACABCAAAAABBAABABCACABCAAAAABAAAAACACABCAAAAABBABABBCACABCAAAAABBAABABCACABCAAAAABBBBAABCACABCAAAAABAAAAACACABCAAAAABBABAABCACABCAAAAABBBAABBCACABCAAAAABAAAAACACABCAAAAABABABBBCACABCAAAAABBAABABCACABCAAAAABABBBBBCACABCAAAAABBAAAABCACABCAAAAABBBAABACACABCAAAAABBAABABCACABCAAAAABABBBBBCACABCAAAAABAABBBACACABCAAAAABBAAAABCACABCAAAAABBBAABBCACABCAAAAABBBABABCACABCAAAAABBBAABBCACABCAAAAABAABCACABCAACCCCCCCAAABAAAABBCAAABBBABBBCBCAAAAABBBAABACBCAAAAABBABBBBCBCAAAAABBABBBACBCAAAAABBAABBBCBCAACCC posiiton: 0 command: AAn push_number 119 posiiton: 11 command: AAn push_number posiiton: 15 command: BCBA read_char posiiton: 19 command: AAn push_number posiiton: 24 command: BBB retrieve posiiton: 27 command: BAAB subtract posiiton: 31 command: CBAl jump_ifzero ABAAABAB posiiton: 43 command: CACl jump ABAAAABB posiiton: 55 command: CAAl set_label ABAAABAB posiiton: 67 command: AAn push_number 115 posiiton: 78 command: AAn push_number posiiton: 82 command: BCBA read_char posiiton: 86 command: AAn push_number posiiton: 91 command: BBB retrieve posiiton: 94 command: BAAB subtract posiiton: 98 command: CBAl jump_ifzero ABAAABBB posiiton: 110 command: CACl jump ABAAAABB posiiton: 122 command: CAAl set_label ABAAABBB posiiton: 134 command: AAn push_number 108 posiiton: 145 command: AAn push_number posiiton: 149 command: BCBA read_char posiiton: 153 command: AAn push_number posiiton: 158 command: BBB retrieve posiiton: 161 command: BAAB subtract posiiton: 165 command: CBAl jump_ifzero ABAABAAA posiiton: 177 command: CACl jump ABAAAABB posiiton: 189 command: CAAl set_label ABAABAAA posiiton: 201 command: AAn push_number 97 posiiton: 212 command: AAn push_number posiiton: 216 command: BCBA read_char posiiton: 220 command: AAn push_number posiiton: 225 command: BBB retrieve posiiton: 228 command: BAAB subtract posiiton: 232 command: CBAl jump_ifzero ABAABAAB posiiton: 244 command: CACl jump ABAAAABB posiiton: 256 command: CAAl set_label ABAABAAB posiiton: 268 command: AAn push_number 110 posiiton: 279 command: AAn push_number posiiton: 283 command: BCBA read_char posiiton: 287 command: AAn push_number posiiton: 292 command: BBB retrieve posiiton: 295 command: BAAB subtract posiiton: 299 command: CBAl jump_ifzero ABAABABA posiiton: 311 command: CACl jump ABAAAABB posiiton: 323 command: CAAl set_label ABAABABA posiiton: 335 command: AAn push_number 103 posiiton: 346 command: AAn push_number posiiton: 350 command: BCBA read_char posiiton: 354 command: AAn push_number posiiton: 359 command: BBB retrieve posiiton: 362 command: BAAB subtract posiiton: 366 command: CBAl jump_ifzero ABAABABB posiiton: 378 command: CACl jump ABAAAABB posiiton: 390 command: CAAl set_label ABAABABB posiiton: 402 command: AAn push_number 84 posiiton: 413 command: ACA duplicate_last posiiton: 416 command: BCAA print_char posiiton: 420 command: AAn push_number 104 posiiton: 431 command: ACA duplicate_last posiiton: 434 command: BCAA print_char posiiton: 438 command: AAn push_number 101 posiiton: 449 command: ACA duplicate_last posiiton: 452 command: BCAA print_char posiiton: 456 command: AAn push_number 32 posiiton: 466 command: ACA duplicate_last posiiton: 469 command: BCAA print_char posiiton: 473 command: AAn push_number 107 posiiton: 484 command: ACA duplicate_last posiiton: 487 command: BCAA print_char posiiton: 491 command: AAn push_number 101 posiiton: 502 command: ACA duplicate_last posiiton: 505 command: BCAA print_char posiiton: 509 command: AAn push_number 121 posiiton: 520 command: ACA duplicate_last posiiton: 523 command: BCAA print_char posiiton: 527 command: AAn push_number 32 posiiton: 537 command: ACA duplicate_last posiiton: 540 command: BCAA print_char posiiton: 544 command: AAn push_number 105 posiiton: 555 command: ACA duplicate_last posiiton: 558 command: BCAA print_char posiiton: 562 command: AAn push_number 115 posiiton: 573 command: ACA duplicate_last posiiton: 576 command: BCAA print_char posiiton: 580 command: AAn push_number 32 posiiton: 590 command: ACA duplicate_last posiiton: 593 command: BCAA print_char posiiton: 597 command: AAn push_number 87 posiiton: 608 command: ACA duplicate_last posiiton: 611 command: BCAA print_char posiiton: 615 command: AAn push_number 101 posiiton: 626 command: ACA duplicate_last posiiton: 629 command: BCAA print_char posiiton: 633 command: AAn push_number 95 posiiton: 644 command: ACA duplicate_last posiiton: 647 command: BCAA print_char posiiton: 651 command: AAn push_number 97 posiiton: 662 command: ACA duplicate_last posiiton: 665 command: BCAA print_char posiiton: 669 command: AAn push_number 114 posiiton: 680 command: ACA duplicate_last posiiton: 683 command: BCAA print_char posiiton: 687 command: AAn push_number 101 posiiton: 698 command: ACA duplicate_last posiiton: 701 command: BCAA print_char posiiton: 705 command: AAn push_number 95 posiiton: 716 command: ACA duplicate_last posiiton: 719 command: BCAA print_char posiiton: 723 command: AAn push_number 78 posiiton: 734 command: ACA duplicate_last posiiton: 737 command: BCAA print_char posiiton: 741 command: AAn push_number 97 posiiton: 752 command: ACA duplicate_last posiiton: 755 command: BCAA print_char posiiton: 759 command: AAn push_number 115 posiiton: 770 command: ACA duplicate_last posiiton: 773 command: BCAA print_char posiiton: 777 command: AAn push_number 117 posiiton: 788 command: ACA duplicate_last posiiton: 791 command: BCAA print_char posiiton: 795 command: AAn push_number 115 posiiton: 806 command: ACA duplicate_last posiiton: 809 command: BCAA print_char posiiton: 813 command: AAn push_number 9 posiiton: 821 command: ACA duplicate_last posiiton: 824 command: BCAA print_char posiiton: 828 command: CCC end posiiton: 831 command: CCC end posiiton: 834 command: CAAl set_label ABAAAABB posiiton: 846 command: AAn push_number 119 posiiton: 857 command: BCAA print_char posiiton: 861 command: AAn push_number 114 posiiton: 872 command: BCAA print_char posiiton: 876 command: AAn push_number 111 posiiton: 887 command: BCAA print_char posiiton: 891 command: AAn push_number 110 posiiton: 902 command: BCAA print_char posiiton: 906 command: AAn push_number 103 posiiton: 917 command: BCAA print_char posiiton: 921 command: CCC end ABAAAABB = 846 ABAAABAB = 67 ABAAABBB = 134 ABAABAAA = 201 ABAABAAB = 268 ABAABABA = 335 ABAABABB = 402 position=0 stack= position=11 stack=119 position=15 stack=119,0 position=19 stack=119 position=24 stack=119,0 position=27 stack=119,0 position=31 stack=119 position=43 stack= position=846 stack= position=857 stack=119 position=861 stack= position=872 stack=114 position=876 stack= position=887 stack=111 position=891 stack= position=902 stack=110 position=906 stack= position=917 stack=103 position=921 stack= wrong
La on se dit qu’on pousse beaucoup sur la pile pour n’afficher que “wrong”. Dumpons la stack .. (en Whitespace mais ou vis t’on !!)
$ perl whitespace.pl < real.html -d 2>&1 | grep push_number | cut -d " " -f 10 | perl -lane "print chr($_)" | tr -d "\n" wslangThe key is We_are_Nasus wrong
Bingo ;), Et la en relisant le programme on se dit qu’il eu été plus malin de lire le source avant de le lancer bêtement. On comprend alors rapidement que le programme veut que l’on tape “wslang”
$perl whitespace.pl real.html wslang The key is We_are_Nasus
Au final je dit..STOP PLUS JAMAIS de challs en WhiteSpace, en BrainFuck, en Piet, en Haskell :) ou n’importe quel autre language à la Con. Filez une VM de packer PE ca sera beaucoup plus didactique !