{"id":224,"date":"2020-05-06T14:44:18","date_gmt":"2020-05-06T12:44:18","guid":{"rendered":"https:\/\/blog.caturday-lovers.fr.nf\/?p=224"},"modified":"2020-05-06T18:38:43","modified_gmt":"2020-05-06T16:38:43","slug":"les-chatons-ont-la-reponse-fcsc-2020-flag-checker","status":"publish","type":"post","link":"https:\/\/blog.caturday-lovers.fr.nf\/?p=224","title":{"rendered":"Les chatons ont la r\u00e9ponse \u2013 FCSC 2020 \/\/ Flag Checker"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"444\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_13h44_00.png\" alt=\"\" class=\"wp-image-225\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_13h44_00.png 498w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_13h44_00-300x267.png 300w\" sizes=\"auto, (max-width: 498px) 100vw, 498px\" \/><\/figure><\/div>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Intro<\/h2>\n\n\n\n<p>Dernier exercice donn\u00e9 lors du challenge, dernier exercice r\u00e9solu pour moi.  De prime abord, il peut faire peur, mais finalement il n&rsquo;\u00e9tait pas si compliqu\u00e9 que cela.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Premier contact<\/h2>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"217\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-22-1024x217.png\" alt=\"\" class=\"wp-image-226\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-22-1024x217.png 1024w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-22-300x63.png 300w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-22-768x162.png 768w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-22.png 1106w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>pas grand chose, pas d&rsquo;info, pas de tips<\/figcaption><\/figure><\/div>\n\n\n\n<p>Comme \u00e0 l&rsquo;accoutum\u00e9 nous allons commencer par regarder la source, et c&rsquo;est cod\u00e9 sur une ligne, c&rsquo;est imbuvable. Soit nous passons par un code beautifier, soit nous passons par les DevTools de notre navigateur.<br>C&rsquo;est la seconde solution que j&rsquo;ai choisie, j&rsquo;ai trouv\u00e9 cela plus simple, et cela nous donne acc\u00e8s \u00e0 un code beautifier, cela pourrait peut \u00eatre se r\u00e9v\u00e9ler utile pour la suite.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"96\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-24-1024x96.png\" alt=\"\" class=\"wp-image-228\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-24-1024x96.png 1024w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-24-300x28.png 300w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-24-768x72.png 768w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-24-1536x144.png 1536w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-24.png 1923w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<p>Dans la colonne de gauche, nous avons la liste des fichiers utilis\u00e9s par notre page, et pour la premi\u00e8re fois, je vois l&rsquo;extension \u00ab\u00a0.wasm\u00a0\u00bb. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"222\" height=\"125\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_14h41_13.png\" alt=\"\" class=\"wp-image-240\"\/><\/figure><\/div>\n\n\n\n<p>Cela serait-il de l&rsquo;assembleur pour les pages web ? Une petite <a rel=\"noreferrer noopener\" href=\"https:\/\/webassembly.org\/\" target=\"_blank\">recherche <\/a>sur le net nous rapporte ceci :<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>WebAssembly (abbreviated&nbsp;<em>Wasm<\/em>) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable target for compilation of high-level languages like C\/C++\/Rust, enabling deployment on the web for client and server applications.<\/p><\/blockquote>\n\n\n\n<p>C&rsquo;est presque cela, c&rsquo;est bien une nouvelle syntaxe de programmation, une fois dans le code de la page, un tout nouveau langage appara\u00eet, qui semble \u00eatre un d\u00e9riv\u00e9 de l&rsquo;assembleur.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"632\" height=\"775\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-25.png\" alt=\"\" class=\"wp-image-229\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-25.png 632w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-25-245x300.png 245w\" sizes=\"auto, (max-width: 632px) 100vw, 632px\" \/><figcaption>et mer\u2026credi !<\/figcaption><\/figure><\/div>\n\n\n\n<p>\u00c0 la fin du code, un bloc attire mon attention :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"504\" height=\"87\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-26.png\" alt=\"\" class=\"wp-image-230\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-26.png 504w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-26-300x52.png 300w\" sizes=\"auto, (max-width: 504px) 100vw, 504px\" \/><figcaption>serait-ce un pattern fixe pour d\u00e9coder le flag ?<\/figcaption><\/figure><\/div>\n\n\n\n<p>Nous retrouvons au d\u00e9but les caract\u00e8res E@P@ , qui pourraient \u00eatre FCSC, de plus la r\u00e9p\u00e9tition des \u00ab\u00a0@\u00a0\u00bb colle avec les \u00ab\u00a0C\u00a0\u00bb. On regarde rapidement, et on voit que le \u00ab\u00a0E\u00a0\u00bb dans la table ASCII est \u00e0 un caract\u00e8re d&rsquo;\u00e9cart, que les quatre caract\u00e8res suivants sont \u00e0 trois d&rsquo;\u00e9cart au-dessus et que le dernier caract\u00e8re est \u00e0 un caract\u00e8re d&rsquo;\u00e9cart, le pattern est donc nul. Mais la fr\u00e9quence est trop grosse pour \u00eatre due au hasard.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00e9thode 1 : analyse du code en deadlisting<\/h2>\n\n\n\n<p>Nous savons que nous avons une cha\u00eene qui d\u00e9vie de fa\u00e7on logique, nous allons chercher dans le code une fonction qui pourrait faire l&rsquo;affaire. <br>Dans le bloc juste au-dessus, nous trouvons une fonction tr\u00e8s int\u00e9ressante :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"78\" height=\"45\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-27.png\" alt=\"\" class=\"wp-image-231\"\/><figcaption>oh la belle initialisation d&rsquo;un Xor<\/figcaption><\/figure><\/div>\n\n\n\n<p>D\u00e9sol\u00e9, cela n&rsquo;a rien \u00e0 voir avec le Sherif de l&rsquo;espace, pour les plus jeunes qui ne comprennent pas la r\u00e9f\u00e9rence, je vous laisse googleliser X-or<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img decoding=\"async\" src=\"https:\/\/media.giphy.com\/media\/5YMUolfyOqZrO\/giphy.gif\" alt=\"\"\/><figcaption>\u00e0 ne pas confondre avec X-or<\/figcaption><\/figure><\/div>\n\n\n\n<p>Nous allons coder rapidement une petite appli en C# pour en avoir le c\u0153ur net, j&rsquo;ai volontairement transform\u00e9 la cha\u00eene de caract\u00e8res en sa repr\u00e9sentation hexad\u00e9cimale pour raccourcir le code :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>static void Main(string&#91;] args)\n        {\n            byte&#91;] Resultat = new byte&#91;70];\n            string FinalFlag;\n            byte&#91;] tableau =\n            {\n            0x45,0x40,0x50,0x40,0x78,0x34,0x66,0x31,0x67,0x37,0x66,0x36,0x61,0x62,0x3a,0x34,0x32,0x60,0x31,0x67,0x3a,0x66,0x3a,0x37,\n            0x37,0x36,0x33,0x31,0x33,0x33,0x3b,0x65,0x30,0x65,0x3b,0x30,0x33,0x60,0x36,0x36,0x36,0x31,0x60,0x62,0x65,0x65,0x30,0x3a,\n            0x33,0x33,0x66,0x67,0x37,0x33,0x32,0x3b,0x62,0x36,0x66,0x65,0x61,0x34,0x34,0x62,0x65,0x33,0x34,0x67,0x30,0x7e\n            };\n            int i;\n            for (i = 0; i &lt; tableau.Length ;i++)\n            {\n                tableau&#91;i] ^= 3;\n                Resultat&#91;i] = tableau&#91;i];\n            }\n\n            \n            FinalFlag = Encoding.UTF8.GetString(Resultat, 0, Resultat.Length);\n            Console.WriteLine(\"La clef est : {0}\", FinalFlag);\n            Console.WriteLine(\"Press Enter to quit\");\n            while (Console.ReadKey().Key != ConsoleKey.Enter) ;\n        }<\/code><\/pre>\n\n\n\n<p>Vous pouvez tester ce code sur ce <a rel=\"noreferrer noopener\" href=\"https:\/\/rextester.com\/\" target=\"_blank\">site<\/a>, qui vous permettra de le compiler m\u00eame sans avoir d&rsquo;IDE sur votre ordinateur.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"589\" height=\"33\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-28.png\" alt=\"\" class=\"wp-image-232\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-28.png 589w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-28-300x17.png 300w\" sizes=\"auto, (max-width: 589px) 100vw, 589px\" \/><figcaption>GG&nbsp;les chatons, notre intuition \u00e9tait la bonne<\/figcaption><\/figure><\/div>\n\n\n\n<pre class=\"wp-block-preformatted\">FCSC{7e2d4e5ba971c2d9e944502008f3f830c5552caff3900ed4018a5efb77af07d3}<\/pre>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"267\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_14h17_55-1-1024x267.png\" alt=\"\" class=\"wp-image-234\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_14h17_55-1-1024x267.png 1024w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_14h17_55-1-300x78.png 300w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_14h17_55-1-768x200.png 768w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-06_14h17_55-1.png 1075w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">M\u00e9thode 2 : approche au shotgun, CyberChef<\/h2>\n\n\n\n<p>Nous savons qu&rsquo;il y a une logique derri\u00e8re la cha\u00eene de base, nous l&rsquo;ajoutons dans cyberchef, je suis d\u00e9\u00e7u car il ne nous trouve pas de suite ce que c&rsquo;est, dans la recherche de la colonne op\u00e9ration, nous allons chercher brute et il va nous proposer ceci :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"381\" height=\"247\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-29.png\" alt=\"\" class=\"wp-image-235\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-29.png 381w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-29-300x194.png 300w\" sizes=\"auto, (max-width: 381px) 100vw, 381px\" \/><\/figure><\/div>\n\n\n\n<p>Nous avons rep\u00e9r\u00e9 qu&rsquo;il y avait une logique dans l&rsquo;encodage de la chaine, nous allons tester le XOR Bruteforcer :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"619\" height=\"65\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-30.png\" alt=\"\" class=\"wp-image-236\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-30.png 619w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-30-300x32.png 300w\" sizes=\"auto, (max-width: 619px) 100vw, 619px\" \/><figcaption>Parfait !<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Mais pourquoi une cha\u00eene XOR\u00e9e une seconde fois retourne la cha\u00eene en clair ?<\/h2>\n\n\n\n<p>En effet mon petit chaton, pourquoi ?<br>C&rsquo;est une propri\u00e9t\u00e9 du XOR :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"200\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-32-1024x200.png\" alt=\"\" class=\"wp-image-238\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-32-1024x200.png 1024w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-32-300x58.png 300w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-32-768x150.png 768w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-32-1536x299.png 1536w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-32.png 1708w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption><a href=\"https:\/\/fr.wikipedia.org\/wiki\/Fonction_OU_exclusif\">https:\/\/fr.wikipedia.org\/wiki\/Fonction_OU_exclusif<\/a><\/figcaption><\/figure><\/div>\n\n\n\n<p>Pour essayer de d\u00e9grossir la chose, imaginons A et B comme nos entr\u00e9es dans la table du XOR et C&nbsp;son r\u00e9sultat, nous allons avoir la correspondance suivante :<br><strong>A xor B = C<\/strong><br>Nous savons que le XOR ne fonctionne que si A ou B est activ\u00e9 :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"172\" height=\"159\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-33.png\" alt=\"\" class=\"wp-image-239\"\/><\/figure><\/div>\n\n\n\n<p>Nous pouvons donc d\u00e9finir que le d\u00e9chiffrement du xor est le suivant :<br><strong>C xor B = A<\/strong><br>Exemple :<br><em>A = 0<br>B = 1<br>A xor B = C<br>0 xor 1 = C<\/em> <br><em><strong>C = 1<\/strong><\/em><br>Et nous pouvons donc prouver que l&rsquo;inverse est bien ce que nous avions d\u00e9duit :<br><em>C xor B = A<br>1 xor 1 = A<br><strong>A = 0<\/strong><\/em><br>Dans notre cas nous sommes dans cette configuration :<br><br>A = flag en clair<br>B = module de xor<br>C = flag XOR\u00e9<br><br>Pour retourner sur le flag en clair, nous devons bien faire l&rsquo;op\u00e9ration inverse et XORer notre flag au module.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bonus<\/h2>\n\n\n\n<p>Nous pouvons aussi trouver la clef du XOR, en nous basant sur les observations pr\u00e9c\u00e9dente, notre clef de chiffrement B est donc \u00e9gale \u00e0:<br><em>B = A xor C<\/em><br><strong><em>clef = \u00ab\u00a0message en clair\u00a0\u00bb xor \u00ab\u00a0message cod\u00e9\u00a0\u00bb<\/em><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":13,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[133,132,12,63,61,131,130],"class_list":["post-224","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kitensgotanswer","tag-algebre","tag-bool","tag-c","tag-ecsc","tag-fcsc","tag-sherif","tag-xor"],"_links":{"self":[{"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/posts\/224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=224"}],"version-history":[{"count":4,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/posts\/224\/revisions"}],"predecessor-version":[{"id":249,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/posts\/224\/revisions\/249"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/media\/13"}],"wp:attachment":[{"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}