<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Falme Streamless</title>
    <description>The latest articles on DEV Community by Falme Streamless (@falme).</description>
    <link>https://dev.to/falme</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1112300%2Fba256475-a68f-4510-9b77-0e9e0d72302b.png</url>
      <title>DEV Community: Falme Streamless</title>
      <link>https://dev.to/falme</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/falme"/>
    <language>en</language>
    <item>
      <title>[GameDev] Unity3D, C# and String Security (PT-BR)</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Sat, 14 Jun 2025 05:56:54 +0000</pubDate>
      <link>https://dev.to/falme/gamedev-unity3d-c-and-string-security-pt-br-5ag8</link>
      <guid>https://dev.to/falme/gamedev-unity3d-c-and-string-security-pt-br-5ag8</guid>
      <description>&lt;p&gt;Originalmente esse documento era uma apresentação para uma empresa em que eu trabalhava, mas que nunca tive a chance de apresentar para meus colegas que trabalhavam com a Unity3D (Por ser ~Muito Perigoso~..., não é perigoso).&lt;/p&gt;

&lt;p&gt;O nome original da apresentação era &lt;strong&gt;Introdução à Segurança da Informação (e por que não colocar senhas dentro do código?)&lt;/strong&gt;. Espero que curtam.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do que iremos falar?
&lt;/h2&gt;

&lt;p&gt;Eu sou um desenvolvedor de jogos digitais, e em todas as empresa que eu trabalhei é utilizado a Unity3D/C# como Engine principal, então vários exemplos apresentados serão voltados a essa ferramenta.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e10ejglxc2pb92crij6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e10ejglxc2pb92crij6.jpg" alt=" " width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nós iremos falar de:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O que é CyberSegurança? (rapidinho)&lt;/li&gt;
&lt;li&gt;O que é Compilação e Decompilação&lt;/li&gt;
&lt;li&gt;Um simples decompilação e leitura de senhas&lt;/li&gt;
&lt;li&gt;O que é o Dotpeek e como usá-lo com a Unity&lt;/li&gt;
&lt;li&gt;Unity com IL2CPP (e PlayMaker)&lt;/li&gt;
&lt;li&gt;Inevitabilidade e Git&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;li&gt;Referências e outros Links&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Além disso, esse texto é somente para &lt;strong&gt;AUTO DEFESA&lt;/strong&gt;, muitos/vários/quase todos os jogos e softwares tem um documento que precisa ser aceito dizendo que você não deve abrir o código do jogo (e é o que faremos hoje).&lt;/p&gt;

&lt;p&gt;Tem várias empresas que lançam um jogo e no dia seguinte vários assets que seriam só revelados no Dia das Bruxas ou Natal agora estão por toda a internet, fazendo disso um inferno para o marketing do projeto que estava preparando para uma surpresa, mas mais perigoso que isso, pode ter uma chave de API disponivel para os jogadores poderem acessar Rankings de um jogo competitivo, dinheiro dentro do jogo ou algo similar.&lt;/p&gt;

&lt;p&gt;Nós estamos aqui para ajudar você a prevenir (mas ainda possível) hackers de acessarem o que eles não devem. No caso desse documento, as strings/chaves/segredos dentro do seu jogo.&lt;/p&gt;

&lt;p&gt;Mas primeiro, acho que você é "Só" um desenvolvedor de jogos, então vamos falar de cybersegurança.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é CyberSegurança?
&lt;/h2&gt;

&lt;p&gt;A definição de CyberSegurança segue:&lt;/p&gt;

&lt;p&gt;"Proteção da informação e sistemas de informação de acessos não autorizados, o uso, vazamento, pertubação, modificação ou destruição a fim de providenciar sua confidencialidade, integridade e disponibilidade."&lt;/p&gt;

&lt;p&gt;Tem muitos termos nesse parágrafo, mas nós iremos focar em:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proteção da informação e sistemas de informação de acessos não autorizados&lt;/strong&gt; : Onde a informação de um jogo é o valor que não deve ser acessado pelos jogadores.&lt;/p&gt;

&lt;p&gt;E para o esclarecimento de alguns termos para esse documento: Confidencialidade, Integridade e Disponibilidade (Conhecido em inglês como C.I.A.)&lt;/p&gt;

&lt;p&gt;Onde:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Confidencialidade : É basicamente dar acesso para aqueles que devem acessar aquela informação e impedir o acesso para aqueles que não devem acessar aquela informação&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integridade : Significa que a informação que aquele usuário receber é confiável e que ninguém modificou ela antes ou depois da transação. Isso garante que a informação de quem a recebeu é 100% idêntica a de quem enviou.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Disponibilidade : Isso garante que a informação precisa estar sempre disponível no espaço de tempo requerido, então, por exemplo, um site que acessa o seu jogo deve estar acessível, mas um hacker que faz um DDoS no seu site (fazendo seu site cair) não deveria acontecer baseado no princíprio da Disponibilidade. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mas a Disponibilidade não significa que a informação deve estar disponível o tempo todo pra sempre, somente precisa estar acessível no tempo que deve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Então como eram as proteções no passado?
&lt;/h3&gt;

&lt;p&gt;Em torno dos anos 1960 só existiam senhas e proteções físicas, isso significa que o computador (a maioria só acessível nas Universidades) tinham uma sala com uma tranca que o protegia de ser acessado por quem não deveria.&lt;/p&gt;

&lt;p&gt;Isso faz com que os ataques sejam na maioria físicos, sempre um acesso pessoal à máquina e não existia a ideia de algo como um Vírus. Mas não demorou muito para isso se tornar uma realidade.&lt;/p&gt;

&lt;p&gt;Em torno dos anos 1970 começou o conceito de Antivírus e Proteção Virtual, muito porque a ARPANET tava ganhando força pelos EUA. Mas especialmente porcausa de um cara chamado Bob Thomas que criou o primeiro vírus conhecido: the Creeper.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk5980yf50yyateehcaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk5980yf50yyateehcaj.png" alt=" " width="584" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bob Thomas criou um programa que se auto-replica e se espalha pela rede de computadores, ele não fazia nada destrutivo, ele só desenhava um texto na tela escrito "I'M THE CREEPER: CATCH ME IF YOU CAN".&lt;/p&gt;

&lt;p&gt;A consequência de sua criação faz com que Ray Tomlinson crie um novo programa que elimina o "The creeper", um programa chamado "Reaper".&lt;/p&gt;

&lt;p&gt;Com isso, o primeiro vírus (The Creeper) e o primeiro Antivírus (Reaper) foram criados.&lt;/p&gt;

&lt;p&gt;Ok, The Creeper era na verdade um Worm, ele se auto-propaga pela rede, mas esses nomes (Vírus, antivírus, worm) não era algo até 1980 onde os computadores pessoais e a internet como conhecemos era algo real.&lt;/p&gt;

&lt;p&gt;Com o tempo vírus, worms, antivírus e similares começaram a se tornarem mais complexos. Hoje em dia, informação é mais preciosa que qualquer outra coisa, e precisamos protegê-lo da maneira correta.&lt;/p&gt;

&lt;h3&gt;
  
  
  HACKERS!?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbiq9hymdd2h725lvxvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbiq9hymdd2h725lvxvw.png" alt=" " width="260" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hackers pela definição de Wesley Chai:&lt;/p&gt;

&lt;p&gt;"Um hacker é um individual que usa a computação, redes e outras habilidades para sobrepor um problema técnico. O termo também se refere a qualquer um que use suas habilidades para ganhar acessos antes não permitidos em redes ou redes para cometer crimes. Um hacker pode, por exemplo, roubar informação para machucar pessoas via roubo de indentidade ou derrubar um sistema e, muitas vezes, manter como sequestro até que colete uma recompensa.&lt;/p&gt;

&lt;p&gt;O termo Hacker historicamente tem sido bem divisivo, algumas vezes sendo usado como um termo de admiração por individuais que exibem um nível altissimo de habilidades e criatividades para resolver problemas técnicos. No entanto, o termo também é normalmente aplicado a individuais que usa essas habilidades para usos ilegais e não éticos."&lt;/p&gt;

&lt;p&gt;Então, várias palavras, mas precisamos falar sobre algumas palavras usadas no parágrafo anterior:&lt;/p&gt;

&lt;p&gt;Hacker, antes do termo cybersegurança ser aplicado, era utilizado para pessoas que são "Gambiarreiras" ou trazem soluções inteligentes para resolver um problema num sistema limitado.&lt;/p&gt;

&lt;p&gt;Hackers cometerem crimes é uma frase desatualizada, hoje em dia nós devemos separar em chapéus:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;White Hat&lt;/strong&gt; (Chapéu Branco) : Hacker Ético, não comite crimes&lt;br&gt;
&lt;strong&gt;Black Hat&lt;/strong&gt; (Chapéu Preto) : Usa suas habilidades de hacker para ganhar acessos não autorizados. (normalmente cybercrime)&lt;br&gt;
&lt;strong&gt;Gray Hat&lt;/strong&gt; (Chapéu Cinza) : Usa suas habilidades para seu benefício próprio, talvez um trabalhador de TI de dia e um cybercriminoso durante a noite para seu próprio benefício.&lt;/p&gt;

&lt;p&gt;Resumindo, hackers podem ser muito bons em encontrar falhas de segurança em sistemas como na empresa em que trabalha (com a permissão para testar o sistema, obviamente) a achar maneiras de fazê-lo mais seguro. Mas da mesma forma que pode ser positivo, também pode ser destrutivo com cybercrimes, roubo de informações, espiar usuários sem o conhecimento deles, etc.&lt;/p&gt;


&lt;h2&gt;
  
  
  O que é Compilação e Decompilação?
&lt;/h2&gt;

&lt;p&gt;Quando você, sim Você, o desenvolvedor de jogos, faz um código pra um jogo e precisa lançar ele para o público (fazendo um .exe, por exemplo) você precisa fazer uma compilação do seu código. Para simplificar, nós iremos definir como:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compilação&lt;/strong&gt;:&lt;br&gt;
Código C# → Para → Código de Máquina&lt;/p&gt;

&lt;p&gt;O código de máquina não é legível para desenvolvedores/humanos. Mas se nós só tivermos o código compilado, e por algum motivo precisarmos lê-lo, o processo de reversão é chamado de &lt;strong&gt;Decompilação&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decompilação&lt;/strong&gt;&lt;br&gt;
Código de Máquina → Para → Código C# (Legivel para humanos)&lt;/p&gt;

&lt;p&gt;Nesse caso, vamos pegar um código legível em C# vindo do programa original. Normalmente uma Decompilação deve ter a possibilidade de recompilar o código para um executável novamente. Esse é o objetivo final.&lt;/p&gt;


&lt;h2&gt;
  
  
  Uma decompilação simples e leitura de senhas
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9ui52q4i1jzrmi1mlo3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9ui52q4i1jzrmi1mlo3.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando você passa pelo processo de decompilação, talvez o código resultante não seja o mesmo que o original, mas com certeza age igual ao original. Isso porque no processo de compilação o código (C#) precisa ser convertido em outra linguagem para ser processado em linguagem de máquina, algumas (maioria) das tecnicalidades do C# não estarão presentes e serão adaptadas.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo, nós temos um código original que verifica se a senha em uma variável é igual à "S3Cr37"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"S3Cr37"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"you have access"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e depois de passarmos esse código pelo processo de decompilação, o código se parece com:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(!(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"S3Cr37"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;"you have access"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Meio diferente, mas eles fazem a mesma coisa, o código de baixo nível funciona meio "Pulando de uma linha para outra", então o codigo decompilado prefere sair do métido numa falha de verificação (isso explica a chamada do "return;")&lt;/p&gt;

&lt;p&gt;Mas não devemos perder o foco, nossa "Senha Secreta" ainda está visível, esse string poderia ser nossa senha secreta, nossa chave de API secreta ou um endereço para uma página.&lt;/p&gt;

&lt;p&gt;Então, antes de entender como prevenir, vamos ver como que isso funciona.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é o Dotpeek e como usá-lo com a Unity
&lt;/h2&gt;

&lt;p&gt;Nós estaremos usando a Unity como um exemplo para esse exercício, mas se precisar, eu subi o &lt;a href="https://github.com/Falme/Unity3D-String-Hack" rel="noopener noreferrer"&gt;projeto exemplo e o código fonte&lt;/a&gt; no GitHub (Mas é tão simples que você pode fazer por conta própria).&lt;/p&gt;

&lt;p&gt;Nós vamos criar um projeto Unity com as configurações padrão, adicionar numa cena um script chamado "Secret.cs" com o nosso código secreto. Só isso e fazer uma build para Windows (Desculpe usuários de linux D:, talvez o processo seja parecido de qualquer forma)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Falme/Unity3D-String-Hack/releases/tag/Build" rel="noopener noreferrer"&gt;Aqui está nossa Build&lt;/a&gt;, vamos quebrar esse Secret.cs;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mas Ei, isso só acontece com amadores, certo?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;De maneira alguma, vários jogos grandes que você conhece tem essa tecnicalidade que faz com que seja possível ler o código do jogo, aqui estão alguns exemplos (Não faça nada com esses códigos):&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdd1d28zdgtnx1pf235x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdd1d28zdgtnx1pf235x.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Tome nota sobre INSIDE, que tem um "+/-", esse é um caso especial, nós iremos falar sobre isso mais pra frente)&lt;/p&gt;

&lt;p&gt;O real perigo está no acesso do público/players ao conteúdo secreto dentro do jogo.&lt;/p&gt;

&lt;p&gt;Com a build em mãos, agora nós precisados baixar uma ferramenta chamada &lt;a href="https://www.jetbrains.com/pt-br/decompiler/" rel="noopener noreferrer"&gt;DotPeek&lt;/a&gt; da JetBrains. A ferramenta é um decompilador, para que possamos desmontar as .DLLs da build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pequena parada para explicar como as DLLs funcionam com a Unity
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finwkmw2oxum2pzgwa1a0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finwkmw2oxum2pzgwa1a0.png" alt=" " width="785" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por padrão todos os scripts que você (desenvolvedor) cria na engine, será compilada em um Assembly Definition chamado &lt;strong&gt;Assembly-CSharp.dll&lt;/strong&gt;, lembre-se desse nome, ele vai ser importante no futuro.&lt;/p&gt;

&lt;p&gt;Isso faz com que o código da Unity seja estável e separado do código do desenvolvedor. Se você não quiser todo o seu código em uma DLL só, você vai precisar criar uma nova Assembly Definition no seu projeto e o separar numa pasta, mas sua referência AINDA aponta para o Assembly-CSharp.&lt;/p&gt;

&lt;p&gt;Ok, fim do intervalo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Depois de terminar de baixar o DotPeek
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faz0pu6din2441mo91l4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faz0pu6din2441mo91l4f.png" alt=" " width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de baixar o Dotpeek, você vai precisar saber se a sua build alvo é vulnerável a esse ataque. Pra saber isso, você precisará achar a pasta da build e encontrar o DLL no caminho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\CaminhoParaBuild\NomeDaBuild\BuildName_Data\Managed\Assembly-CSharp.dll
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se nesse caminho a DLL existir, seu ataque poderá ser feito. Isso acontece porque a Unity deixa como padrão a opção em Player Settings &amp;gt; Other Settings &amp;gt; Configuration &amp;gt; Scripting Backend como Mono.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bdz64h0595ztjqd4s0j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bdz64h0595ztjqd4s0j.png" alt=" " width="358" height="49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;isso faz com que a build seja muito mais rápida, mas sacrifica outras partes como Performance e Segurança.&lt;/p&gt;

&lt;p&gt;Então, chega de falação, abram seu DotPeek, e selecione "File &amp;gt; Open" e selecione seu alvo &lt;strong&gt;Assembly-CSharp.dll&lt;/strong&gt; (Eu disse que isso seria importante):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfw7oos6yxfl294ait3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfw7oos6yxfl294ait3j.png" alt=" " width="352" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkwerphnbycxtdq82vku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkwerphnbycxtdq82vku.png" alt=" " width="303" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbfglhiqdttswm8pwa55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbfglhiqdttswm8pwa55.png" alt=" " width="425" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de carregar o projeto, você vai selecionar o Assembly-CSharp, clique com botão direito do mouse e selecione "Export to Project...", selecione uma pasta e espere o decompilador terminar o trabalho.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frygupyxb8x704mj4kq8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frygupyxb8x704mj4kq8e.png" alt=" " width="430" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de exportar, você terá os arquivos C# do projeto original agora legível para o ser humano (meio diferente, mas legível).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hou5ck9jlzr0hpegzro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hou5ck9jlzr0hpegzro.png" alt=" " width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parabéns, você conseguiu a senha secreta!&lt;/p&gt;

&lt;p&gt;Mas espera, como podemos prevenir isso?&lt;/p&gt;




&lt;h2&gt;
  
  
  Unity com IL2CPP e PlayMaker
&lt;/h2&gt;

&lt;p&gt;Uma maneira de deixar as coisas um pouco mais difícil para quem está abrindo o seu código é mudar a opção do &lt;strong&gt;Script Backend&lt;/strong&gt; para &lt;strong&gt;IL2CPP (Intermediate Language To C++)&lt;/strong&gt; em "Edit &amp;gt; Project Settings &amp;gt; Other Settings &amp;gt; Configuration"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgd2jdaqxd1hvzdcfisx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgd2jdaqxd1hvzdcfisx.png" alt=" " width="698" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O que ele faz é não colocar seu código diretamente em uma DLL, mas converte seu código C# em uma Linguagem Intermediária (Microsoft Intermediate Language) e depois em C++, para aí então compilar em código de máquina.&lt;/p&gt;

&lt;p&gt;Fazendo esse processo, ele não irá criar um Assembly-CSharp.dll&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb4np2jm341vugnyradg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb4np2jm341vugnyradg.png" alt=" " width="425" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nenhum problema com isso... certo?
&lt;/h3&gt;

&lt;p&gt;Sim, tem um problema nisso, e é que a String ainda é uma String. Nós vamos achar nossa senha secreta novamente, mas dessa vez vamos usar uns comandos de Bash no Linux.&lt;/p&gt;

&lt;p&gt;Com nossos novos arquivos compilados para a build, nós precisamos ir até o arquivo "global-metadata.dat" em&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\CaminhoParaBuild\NomeDaBuild\BuildName_Data\il2cpp_data\Metadata\global-metadata.dat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nós iremos usar o &lt;a href="https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R" rel="noopener noreferrer"&gt;WSL (Windows Subsystem for Linux)&lt;/a&gt;, que é um Linux dentro do Windows 10/11, se você não tem ele, você pode baixá-lo na Microsoft Store, é de graça.&lt;/p&gt;

&lt;p&gt;Com WSL, nós iremos usar esse comando no nosso arquivo global-metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;strings global-metadata.dat | &lt;span class="nb"&gt;grep &lt;/span&gt;S3Cr37
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;strings&lt;/code&gt; lista todas as strings dentro de um arquivo&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grep&lt;/code&gt; Destaca/Mostra somente se o argumento foi encontrado&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;S3Cr37&lt;/code&gt; é o argumento que queremos encontrar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com isso, nós podemos ver que nossa senha secreta ainda pode ser encontrado na build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkbo7zw2ghdutvivdt78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkbo7zw2ghdutvivdt78.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bem, claro que nós sabíamos antes qual que era o código que queriamos encontrar. Mas se nós soubessemos pelas builds anteriores quais palavras descartar ou se nós usássemos uma wordlist com valores relevantes (http, api, etc...), nós ainda encontraríamos resultados interessantes, incluíndo nosso segredo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hora do PlayMaker
&lt;/h3&gt;

&lt;p&gt;Primeiro, eu não estou dizendo que o PlayMaker é mais seguro, é só um fato curioso que faz sentido estar nesse documento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://assetstore.unity.com/packages/tools/visual-scripting/playmaker-368" rel="noopener noreferrer"&gt;PlayMaker&lt;/a&gt; é uma ferramenta de Script Visual, similar aos Blueprint da Unreal Engine, mas não oficial da Unity. O curioso caso é que o jogo INSIDE usa essa ferramenta, e isso faz com que o codigo do PlayMaker não possa ser convertido diretamente, mas ele é convertido em Assets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj4kp8bd76iftfdxdx2s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj4kp8bd76iftfdxdx2s.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Isso faz com que seja mais difícil de encontrar as informações no código com as técnicas anteriormente usadas.&lt;/p&gt;

&lt;p&gt;A conversão do seu código para Asset pode também ser feitas de maneiras diferentes, como:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Usando Scriptable Objects: Onde você pôe a sua chave em um Asset&lt;/li&gt;
&lt;li&gt;Usando PlayMaker ou Outro Visual Scripting : Mesmo que o exemplo acima, mas estes influenciam o modo de desenvolvimento do time&lt;/li&gt;
&lt;li&gt;Usando Serviços Externos : Ainda usando Scriptable Objects, mas esse faz chamadas para serviços externos, mantendo seus dados/acessos fora do jogo (Nós iremos falar sobre isso mais tarde).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No caso do PlayMaker, o que isso faz é converter o seu Visual Scripting Data em um arquivo &lt;strong&gt;resources.assets&lt;/strong&gt;. Então, se você decidir abrir o arquivo resources.assets com um comando &lt;code&gt;strings&lt;/code&gt; no bash (como falamos anteriormente), você só irá receber baboseiras.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wvy3bvga4k9ljxp6957.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wvy3bvga4k9ljxp6957.png" alt=" " width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Então, É possível de abrí-lo?
&lt;/h3&gt;

&lt;p&gt;Sim... Mais ou Menos... você vai precisar de umas ferramentas mais especializadas para isso, uma que possa te mostrar os Assets dentro de uma Build.&lt;/p&gt;

&lt;p&gt;Nós iremos usar uma ferramenta chamada &lt;a href="https://github.com/Perfare/AssetStudio" rel="noopener noreferrer"&gt;AssetStudio&lt;/a&gt;. Ela é de graça e pode ser acessada em seu repositório no Github.&lt;/p&gt;

&lt;p&gt;Nesse examplo, nós iremos pegar um projeto com PlayMaker e abrir ele com AssetStudio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9tkshcnp0an8hq81i0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9tkshcnp0an8hq81i0h.png" alt=" " width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como mostrado na imagem acima, nós podemos encontrar, abrir e exportar os arquivos PlayMakerAssemblies e PlayMakerFSM para nosso sistema e talvez achar algo útil.&lt;/p&gt;

&lt;p&gt;Eu irei parar por aqui sobre o PlayMaker, mas se você quiser saber mais, brinque com ele, faça seu exemplo em um projeto e tente achar algum conteúdo secreto.&lt;/p&gt;

&lt;p&gt;Bonus: AssetStudio também é usado para encontrar imagens, sons, músicas, modelos 3D, texturas e qualquer outra coisa que a Unity categorize como um Asset, que pode ser exportado e lido. É assim que muito modelos e informações são encontradas tão rapidamente depois do lançamento de um jogo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Inevitabilidade e Git
&lt;/h2&gt;

&lt;p&gt;Então... O que aprendemos até agora?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Todas as opções acima foram terríveis&lt;/li&gt;
&lt;li&gt;Nenhum código é 100% seguro&lt;/li&gt;
&lt;li&gt;O que nós estamos fazendo é só atrasar o hacker em achar a chave secreta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo isso pode ser resumido no "Teorema do Macaco Infinito" (Escondi a identidade do macaco por segurança):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqkwrulvevs6vzhq1n03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqkwrulvevs6vzhq1n03.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O teorema diz que &lt;em&gt;um macaco digitando aleatoriamente em um teclado por um intervalo de tempo infinito irá quase certamente criar um texto qualquer escolhido, como por exemplo a obra completa de William Shakespeare.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;No nosso caso, o que os hackers tem é tempo, então, com o tempo e paciência, o hacker vai encontrar a sua chave secreta (também vale lembrar que não é só um macaco, se o seu jogo for publicado na steam) &lt;/p&gt;

&lt;h3&gt;
  
  
  Então como hackers ainda conseguem achar minha chave secreta?
&lt;/h3&gt;

&lt;p&gt;Aqui estão alguns exemplos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Arquivos GitHub e Bitbucket&lt;/strong&gt;: Os hackers podem acessar/hackear os arquivos .git em algum momento e ir diretamente ao código fonte, e isso não é impossível, alguns jogos AAA tiveram esse incidente, o exemplo com o Git também tem acesso ao histórico de todos os seus commits, fazendo disso possível outros ataques (talvez?)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autenticação de Dois Fatores e Métodos de Login Obsoletos&lt;/strong&gt;: Alguns usuários não tem Autenticação de dois fatores ativo, no Github, na Unity, no Google Play Store, na Steam, e assim vai. Essa autenticação garante que é você mesmo que está acessando. &lt;a href="https://www.youtube.com/watch?v=gYs9nS8LlZ8" rel="noopener noreferrer"&gt;Aqui está um video engraçado do Game Newell pedindo para ser hackeado, mas a Autenticação de Dois Fatores bloqueia os acessos.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low-Hanging Fruit&lt;/strong&gt;: Fazer o basico é essencial, mas os hackers amam ir atrás daqueles que nem o basico fazem, porque é fácil de hackear. Então se você não fizer o básico (como mudar para IL2CPP) eles vão usar uma automatização para te achar mais rápido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Strings e Códigos Encriptados&lt;/strong&gt;: Fazer uma encriptação é bom para todos, para mandar um email ou manter um dado secreto. Mas tenha certeza de não manter a chave ao lado da gaveta trancada. Tenha certeza que sua encriptação é boa, porque se for somente um ROT13, ele não vai fazer qualquer diferença.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Outras maneiras de fazer ser mais seguro?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use Serviços Externos como &lt;a href="https://azure.microsoft.com/pt-br/products/playfab" rel="noopener noreferrer"&gt;PlayFab&lt;/a&gt;&lt;/strong&gt;: PlayFab é um serviço onde você consegue colocar dados, rankings e codigo remoto, então se você precisar enviar uma pontuação para um jogo competitivo, você pode ter um código remoto que verifica se a pontuação está correta (ou viável) de ser adicionada. Mas mais que isso, verificar se uma transação monetária é legitima, ver os dados de um jogador e se necessário banir ele, etc. Dessa forma, sua chave/serviço não fica no seu jogo, então sua build está a salvo.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Esse conteúdo remoto também pode ser aplicado a conteúdos para eventos/feriados, onde você pode colocar um Asset Bundle (ou Adressables) em um serviço/servidor CDN e lançar quando o tempo chegar (evento de natal, por exemplo), então esse conteúdo e Assets não ficam na sua Build.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Permissões para Leitura e Modificação&lt;/strong&gt;: Tenha certeza que alguns dados no seu servidor (enviando Requests para um servidor) não podem ser modificados se não devem ser modificados. É facil deixar isso passar, pois não pensamos nisso até o momento que alguém vai lá e remove/modifica os dados, mas tenha certeza que os acessos estão corretos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Faça o básico e um pouco mais&lt;/strong&gt;: Eu vejo outras áreas como Desenvolvimento de Software ou Desenvolvimento de Sites sendo bem cautelosos sobre Segurança da Informação (ok, não tanto assim, mas eles fazem o básico), e em desenvolvimento de jogos isso não é nem discutido. E as vezes a solução é tão simples. Então tome cuidado com seus projetos, não deixe nenhum valor secreto que não deve ser lido dentro das suas builds, especialmente se for um jogo online, verifique várias vezes se for necessário.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusão e Recomendações
&lt;/h2&gt;

&lt;p&gt;Vamos recapitular:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Faça builds da Unity com o Script Backend: IL2CPP&lt;/li&gt;
&lt;li&gt;Não use strings comprometedoras dentro de scripts&lt;/li&gt;
&lt;li&gt;Use proteções recomendadas para Servidores Git (Github, Bitbucket, etc.) com &lt;a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent" rel="noopener noreferrer"&gt;Chaves SSH RSA&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Se você precisar registrar um valor, use serviços externos que tem uma camada de autenticação&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Outras Recomendações de Segurança fora da Área GameDev
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Não abra links ou Emails suspeitos (nem de amigos)&lt;/li&gt;
&lt;li&gt;Ative a &lt;a href="https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication" rel="noopener noreferrer"&gt;Autenticação de Dois Fatores&lt;/a&gt; em todos os serviços (Steam, Github, Google, etc...)&lt;/li&gt;
&lt;li&gt;Use Antivírus (Melhor que nada)&lt;/li&gt;
&lt;li&gt;Cheque se sua senha foi vazada (&lt;a href="https://haveibeenpwned.com/" rel="noopener noreferrer"&gt;https://haveibeenpwned.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Não use contas pessoais dentro da sua empresa&lt;/li&gt;
&lt;li&gt;Mantenha todos os seus softwares atualizados (especialmente o Windows)&lt;/li&gt;
&lt;li&gt;Bom senso&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Bônus: Isso pode ser útil no Desenvolvimento de Jogos?
&lt;/h3&gt;

&lt;p&gt;Sim! Isso é uma técnica bem comum hoje em dia (Abrir builds e procurar por segredos), você, como um desenvolvedor de jogos, pode usar isso para adicionar segredos nos seus jogos, ou fazer um jogo em que PRECISA abrir o jogo para encontrar pistas. Mas pense nisso como um conteúdo que não é necessário para a Gameplay, só uma piada ou extra para os fãs hardcore.&lt;/p&gt;

&lt;p&gt;É possível, e você pode fazer isso também.&lt;/p&gt;




&lt;h2&gt;
  
  
  Referências (E outros links)
&lt;/h2&gt;

&lt;p&gt;History of CyberSecurity, Avast : &lt;a href="https://blog.avast.com/history-of-cybersecurity-avast#the-1950s" rel="noopener noreferrer"&gt;https://blog.avast.com/history-of-cybersecurity-avast#the-1950s&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A History of Information Security :&lt;br&gt;
&lt;a href="https://www.ifsecglobal.com/cyber-security/a-history-of-information-security/" rel="noopener noreferrer"&gt;https://www.ifsecglobal.com/cyber-security/a-history-of-information-security/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity Assembly Definitions : &lt;a href="https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html" rel="noopener noreferrer"&gt;https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dotpeek from Jetbrains : &lt;a href="https://www.jetbrains.com/pt-br/decompiler/" rel="noopener noreferrer"&gt;https://www.jetbrains.com/pt-br/decompiler/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The amazing history of programming with Olga Stern : &lt;a href="https://www.youtube.com/watch?v=bJWWbql0QIQ" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=bJWWbql0QIQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tutorial Inspecting Unity Exported Assets&lt;br&gt;
&lt;a href="https://www.vg-resource.com/thread-31141.html" rel="noopener noreferrer"&gt;https://www.vg-resource.com/thread-31141.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jacquard's Loom machine:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=MQzpLLhN0fY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=MQzpLLhN0fY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How to Be a Hacker:&lt;br&gt;
&lt;a href="http://www.catb.org/%7Eesr/faqs/hacker-howto.html" rel="noopener noreferrer"&gt;http://www.catb.org/~esr/faqs/hacker-howto.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search Security - What is a Hacker? :&lt;br&gt;
&lt;a href="https://searchsecurity.techtarget.com/definition/hacker" rel="noopener noreferrer"&gt;https://searchsecurity.techtarget.com/definition/hacker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity AssetStudio :&lt;br&gt;
&lt;a href="https://github.com/Perfare/AssetStudio/releases" rel="noopener noreferrer"&gt;https://github.com/Perfare/AssetStudio/releases&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CyberSecurity vs Information Security:&lt;br&gt;
&lt;a href="https://www.simplilearn.com/information-security-vs-cyber-security-article" rel="noopener noreferrer"&gt;https://www.simplilearn.com/information-security-vs-cyber-security-article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73hkwbl3yoz8j80nv9yz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73hkwbl3yoz8j80nv9yz.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>cybersecurity</category>
      <category>security</category>
      <category>programming</category>
    </item>
    <item>
      <title>[Hack] PicoCTF: Low Level Binary Intro - Intro to Debuggers</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Fri, 16 May 2025 14:00:00 +0000</pubDate>
      <link>https://dev.to/falme/hack-picoctf-low-level-binary-intro-intro-to-debuggers-3jd7</link>
      <guid>https://dev.to/falme/hack-picoctf-low-level-binary-intro-intro-to-debuggers-3jd7</guid>
      <description>&lt;p&gt;This &lt;a href="https://play.picoctf.org/playlists/2" rel="noopener noreferrer"&gt;PicoCTF Playlist&lt;/a&gt; section is called Intro to Debuggers, the challenges will go deeper into how to use the Debugger, specifically GDB, a common debugger and disassembler. After some explanations of how to use the GDB, we can do the challenges.&lt;/p&gt;

&lt;p&gt;I am also using a Virtual Machine with Ubuntu to solve these challenges.&lt;/p&gt;




&lt;h2&gt;
  
  
  GDB baby step 1
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you figure out what is in the eax register at the end of the main function? Put your answer in the picoCTF flag format: picoCTF{n} where n is the contents of the eax register in the decimal number base. If the answer was 0x11 your flag would be picoCTF{17}. Disassemble this (file).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So what we need to do is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get the file (debugger0_a) to disassemble&lt;/li&gt;
&lt;li&gt;Disassemble the main function with GDB&lt;/li&gt;
&lt;li&gt;Gather the value of eax register at the end of main function&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In summary, we need to gather a assembly dump from the requested file, just like in the previous challenges.&lt;/p&gt;

&lt;p&gt;So after downloaded the file, we can disassemble the main function with the following command in shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./debugger0_a
gdb ./debugger0_a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and inside gdb:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; disassemble main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Making these actions, gdb returns with the following dump:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x0000000000001129&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;endbr64&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000000112d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000000112e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000001131&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000001134&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000001138&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mh"&gt;0x86342&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000000113d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000000113e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's kinda hard for me to read this one, maybe if we change to we are used to, the intel syntax, for that we will:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set &lt;/span&gt;disassembly-flavor intel
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; disassemble main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and that returns the following dump:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x0000000000001129&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;endbr64&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000000112d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000000112e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000001131&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000001134&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000001138&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x86342&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000000113d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000000113e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Really better, now, we need to find the final result to EAX register. The funny part is that there's only one command that affects EAX:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x0000000000001138&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x86342&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, the value of EAX is &lt;code&gt;0x86342&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But we actually need the decimal value, so we put it in our python script &lt;a href="https://github.com/Falme-SideProjects/python-hex-to-dec/blob/main/HexToDec.py" rel="noopener noreferrer"&gt;HexToDec.py&lt;/a&gt;, then we can have the answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;HexToDec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="mh"&gt;0x86342&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We take the result with picoCTF{value} and we have the flag:&lt;/p&gt;

&lt;p&gt;
  Answer:GDB baby step 1
  &lt;br&gt;
picoCTF{549698}&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  GDB baby step 2
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you figure out what is in the eax register at the end of the main function? Put your answer in the picoCTF flag format: picoCTF{n} where n is the contents of the eax register in the decimal number base. If the answer was 0x11 your flag would be picoCTF{17}. Debug this (file).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The description is the same as the last one, but this time, we are playing with breakpoints and loops in the program. The exercise is to start looking into dynamic analysis.&lt;/p&gt;

&lt;p&gt;Static analysis is what we have done before, looking through code to understand what it does. Dynamic analysis study the code through execution and debugging (breakpoints).&lt;/p&gt;

&lt;p&gt;Doing the same assembly dump as the previous exercise, we gather this instruction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x0000000000401106&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;endbr64&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401111&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401115&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x1e0da&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040111c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0xc&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x25f&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401123&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040112a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;jmp&lt;/span&gt;    &lt;span class="mh"&gt;0x401136&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040112c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040112f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;add&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401132&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;add&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x1&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401136&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401139&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="nb"&gt;cmp&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0xc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040113c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;jl&lt;/span&gt;     &lt;span class="mh"&gt;0x40112c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040113e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401141&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401142&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can see 2 problems that we not faced before.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;EAX register is being called in multiple places&lt;/li&gt;
&lt;li&gt;we have JUMPs in the instruction, indicating a possible loop&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The loop can be found as the following pattern:&lt;/p&gt;

&lt;p&gt;At main+51 we have a comparison:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x0000000000401139&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="nb"&gt;cmp&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0xc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this comparison is less than a value, jump to another line; JL (Jump if Less)&lt;br&gt;
So in this case, we are checking if &lt;code&gt;[rpb-0xc]&lt;/code&gt; is less than &lt;code&gt;EAX&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;If so, we jump to the line main+38, so we go backwards and do it again. That way we find a loop&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x000000000040113c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;jl&lt;/span&gt;     &lt;span class="mh"&gt;0x40112c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So, with that information, we can assure that we will not count every single time that it loops and add a value to EAX.&lt;/p&gt;

&lt;p&gt;In fact, we will go to the end of the program, and just read what EAX is, like a good dynamic analysis want us to do.&lt;/p&gt;

&lt;p&gt;First, we add a breakpoint to the end of the main function before the return. the &lt;code&gt;main+59&lt;/code&gt; line is a good place to do this. So we go to gdb and do the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./debugger0_b
gdb ./debugger0_b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and inside gdb we set up a breakpoint, where it will pause the execution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;break&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;main+59
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And run the program normally through the GDB debugger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After a little moment, it will stop with the following message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;Breakpoint&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x0000000000401141&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;main &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and now the program is paused as we asked on line &lt;code&gt;main+59&lt;/code&gt; , you can check the address, is the same number. Now we can ask for the value of EAX, that will show the result for the flag in hexadecimal and decimal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; info registers eax
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We take the result with picoCTF{value} and we have the flag:&lt;/p&gt;

&lt;p&gt;
  Answer:GDB baby step 2
  &lt;br&gt;
picoCTF{307019}&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  GDB baby step 3
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Now for something a little different. 0x2262c96b is loaded into memory in the main function. Examine byte-wise the memory that the constant is loaded in by using the GDB command x/4xb addr. The flag is the four bytes as they are stored in memory. If you find the bytes 0x11 0x22 0x33 0x44 in the memory location, your flag would be: picoCTF{0x11223344}. Debug this (file).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After a brief explanation about how to read Memory in GDB, the exercise is presented.&lt;/p&gt;

&lt;p&gt;We need to find the bytes in the memory address of the file &lt;code&gt;debugger0_c&lt;/code&gt; . The tip is the value &lt;code&gt;0x2262c96b&lt;/code&gt; in the main function.&lt;/p&gt;

&lt;p&gt;So first of all, we need to disassemble the main function, same as before, resulting in the following assembly code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x0000000000401106&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;endbr64&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401111&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401115&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x2262c96b&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040111c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040111f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401120&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;following this, the value &lt;code&gt;0x2262c96b&lt;/code&gt; is moved (MOV at +15) to the memory address $RBP-0x4.&lt;/p&gt;

&lt;p&gt;First some explanations. RBP register is the Register Base Pointer, it point to the base of the Stack Frame, and the addition of the values is through the negative numbering.&lt;/p&gt;

&lt;p&gt;So usually we go for something like RBP-0x4 or RBP-0x8, this is adding values from the RBP (Register Base Pointer) to the RSP (Register Stack Pointer).&lt;/p&gt;

&lt;p&gt;So we are moving the value &lt;code&gt;0x2262c96b&lt;/code&gt; to the Register Base Pointer position Minus 4.&lt;/p&gt;

&lt;p&gt;Add a breakpoint at main+25 and run the program:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;break&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;main+25
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And call the values inside RBP-0x4. where &lt;code&gt;x/&lt;/code&gt; is the command to call the memory reading, we want 4 bytes (4) in hexadecimal (x) each with byte-sized (b) resulting the command &lt;code&gt;4xb&lt;/code&gt; .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; x/4xb &lt;span class="nv"&gt;$rbp&lt;/span&gt;&lt;span class="nt"&gt;-0x4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resulting in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x7fffffffddbc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mh"&gt;0x6b&lt;/span&gt;    &lt;span class="mh"&gt;0xc9&lt;/span&gt;    &lt;span class="mh"&gt;0x62&lt;/span&gt;    &lt;span class="mh"&gt;0x22&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Well, actually the value returned is inverted from the original data &lt;code&gt;0x2262c96b&lt;/code&gt; . It's because we are dealing with Little endian.&lt;/p&gt;

&lt;p&gt;We have Big Endian and Small Endian. Will add two images from a video (no longer listed) from C3rb3ru5d3d53c explaining this visually:&lt;/p&gt;

&lt;h3&gt;
  
  
  Big Endian
&lt;/h3&gt;

&lt;p&gt;Normally "correct" the way we read the hexadecimal values.&lt;/p&gt;

&lt;p&gt;Where&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;M : is the Most Significant Byte&lt;/li&gt;
&lt;li&gt;L : is the Least Significant Byte&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F213j4ywj4v2ywog92yxm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F213j4ywj4v2ywog92yxm.png" alt="Big Endian"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Little Endian
&lt;/h3&gt;

&lt;p&gt;Normally "inverted" the way we read the hexadecimal values.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4lslhjanoamrau4wo4l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4lslhjanoamrau4wo4l.png" alt="Little Endian"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the exercise asked for us to write down the flag as we read them, so, as Little endian is on the screen.&lt;/p&gt;

&lt;p&gt;simply an exercise to just read a value in memory and understand Little endian.&lt;/p&gt;

&lt;p&gt;We take the result with picoCTF{value} and we have the flag:&lt;/p&gt;

&lt;p&gt;
  Answer:GDB baby step 3
  &lt;br&gt;
picoCTF{0x6bc96222}&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  GDB baby step 4
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;main calls a function that multiplies eax by a constant. The flag for this challenge is that constant in decimal base. If the constant you find is 0x1000, the flag will be picoCTF{4096}. Debug this (file).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This exercise is very simple, is to show that we can call and disassemble many functions, not only main. we need to find a constant number that multiplies with EAX.&lt;/p&gt;

&lt;p&gt;So me make the same as the other exercises to disassemble the main function returning the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x000000000040111c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;endbr64&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401120&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401121&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401124&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;sub&lt;/span&gt;    &lt;span class="n"&gt;rsp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401128&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040112b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040112f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x28e&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401136&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040113d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401140&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;edi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401142&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;call&lt;/span&gt;   &lt;span class="mh"&gt;0x401106&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;func1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401147&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040114a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040114d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;leave&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040114e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The line main+38 calls another function called "func1". Maybe the multiplication is there. Lets check it out&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; disassemble func1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns us the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x0000000000401106&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;endbr64&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040110e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401111&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x0000000000401114&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;imul&lt;/span&gt;   &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x3269&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040111a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000000000040111b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the line func+14 we have a multiplication with EAX, maybe the value 0x3269 is what we need.&lt;/p&gt;

&lt;p&gt;But we actually need the decimal value, so we put it in our python script &lt;a href="https://github.com/Falme-SideProjects/python-hex-to-dec/blob/main/HexToDec.py" rel="noopener noreferrer"&gt;HexToDec.py&lt;/a&gt;, then we can have the answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;HexToDec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="mh"&gt;0x3269&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We take the result with picoCTF{value} and we have the flag:&lt;/p&gt;

&lt;p&gt;
  Answer:GDB baby step 4
  &lt;br&gt;
picoCTF{12905}&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  ASCII FTW
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This program has constructed the flag using hex ascii values. Identify the flag text by disassembling the program. You can download the file from here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the challenge of the module. The mission is to find the flag with GDB in bytes, and then convert to ASCII/String.&lt;/p&gt;

&lt;p&gt;First, let's look into the main function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="mh"&gt;0x0000555555555169&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;endbr64&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555516d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555516e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555171&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;sub&lt;/span&gt;    &lt;span class="n"&gt;rsp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555175&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555517e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rax&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555182&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;xor&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555184&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x70&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555188&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x2f&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x69&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555518c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x2e&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x63&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555190&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x2d&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x6f&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555194&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x2c&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x43&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555198&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x2b&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x54&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555519c&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x2a&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x46&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551a0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x29&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x7b&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551a4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x41&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551a8&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x27&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x53&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551ac&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x26&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x43&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551b0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x25&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x49&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551b4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x24&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x49&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551b8&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x23&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551bc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;83&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x22&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x49&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551c0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x21&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x53&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551c4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551c8&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x1f&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x45&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551cc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;   &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x1e&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x41&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551d0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;103&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x1d&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x53&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551d4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;107&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x1c&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x59&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551d8&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;111&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x1b&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x5f&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551dc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;115&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x1a&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x38&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551e0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;119&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x19&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x39&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551e4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x36&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551e8&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x17&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551ec&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;131&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x16&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x46&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551f0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;135&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x15&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551f4&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;139&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x41&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551f8&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;143&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x13&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x46&lt;/span&gt;
&lt;span class="mh"&gt;0x00005555555551fc&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;147&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x12&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x7d&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555200&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;151&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;movzx&lt;/span&gt;  &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;BYTE&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555204&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;155&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;movsx&lt;/span&gt;  &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;al&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555207&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;158&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;esi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555209&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;lea&lt;/span&gt;    &lt;span class="n"&gt;rdi&lt;/span&gt;&lt;span class="p"&gt;,[&lt;/span&gt;&lt;span class="n"&gt;rip&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mh"&gt;0xdf4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;        &lt;span class="c1"&gt;# 0x555555556004
&lt;/span&gt;&lt;span class="mh"&gt;0x0000555555555210&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;167&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x0&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555215&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;172&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;call&lt;/span&gt;   &lt;span class="mh"&gt;0x555555555070&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="nd"&gt;@plt&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555521a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;177&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;nop&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555521b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;178&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555521f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;182&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;xor&lt;/span&gt;    &lt;span class="n"&gt;rax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;0x28&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555228&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;191&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;je&lt;/span&gt;     &lt;span class="mh"&gt;0x55555555522f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;198&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555522a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;193&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;call&lt;/span&gt;   &lt;span class="mh"&gt;0x555555555060&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;__stack_chk_fail&lt;/span&gt;&lt;span class="nd"&gt;@plt&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="mh"&gt;0x000055555555522f&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;198&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;leave&lt;/span&gt;
&lt;span class="mh"&gt;0x0000555555555230&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;199&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have many addition of bytes into the memory from main+27 (RBP-0x30) to main+147 (RBP-0x12).&lt;/p&gt;

&lt;p&gt;So we can add a breakpoint at somewhere like main+155, just after the values was added to memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;break&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt;main+155
&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then read the memory from the RBP-0x30.&lt;/p&gt;

&lt;p&gt;So the question is, how we read and why start from -0x30.&lt;/p&gt;

&lt;p&gt;Because this negative position, we are incrementing the values to read, so making the reading start from RBP-0x30 it will goes after to -0x2f, then -0x2e, etc...&lt;/p&gt;

&lt;p&gt;and to read the string we will change the type from byte (x) to string (s). Same as the last one we've done, but changing this we got&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;(&lt;/span&gt;gdb&lt;span class="o"&gt;)&lt;/span&gt; x/1sb &lt;span class="nv"&gt;$rbp&lt;/span&gt;&lt;span class="nt"&gt;-0x30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another this is, we usually read a lot of bytes, but in this case we do &lt;code&gt;1sb&lt;/code&gt;, we are reading 1 string. This is kinda weird in a length sense, but this will output each "String" and not "Character" from the memory.&lt;/p&gt;

&lt;p&gt;Reading this value from memory we receive directly the flag to put into the answer.&lt;/p&gt;

&lt;p&gt;
  Answer:ASCII FTW
  &lt;br&gt;
picoCTF{ASCII_IS_EASY_8960F0AF}&lt;br&gt;


&lt;/p&gt;




</description>
      <category>cybersecurity</category>
      <category>ctf</category>
      <category>assembly</category>
      <category>python</category>
    </item>
    <item>
      <title>[GameDev][Unity3D] Using URP 2D and SpriteMask</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Fri, 26 Apr 2024 22:35:36 +0000</pubDate>
      <link>https://dev.to/falme/gamedevunity3d-using-urp-2d-and-spritemask-3bkn</link>
      <guid>https://dev.to/falme/gamedevunity3d-using-urp-2d-and-spritemask-3bkn</guid>
      <description>&lt;p&gt;The Problem: I decided to add URP to a project, to make a specific light in a scene, but because of that the SpriteMask that hides a border is not working anymore.&lt;/p&gt;

&lt;p&gt;Solution: Find a shader that replicates the SpriteMask Component.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a SpriteMask?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbot8jbazehx2mqhubfb5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbot8jbazehx2mqhubfb5.jpg" alt="Image description" width="764" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's very similar to the Photoshop/Illustrator mask, it have a texture that's the image to be shown, and other image that will set the alpha limits to be rendered. With URP2D in Unity this makes not work as expected anymore.&lt;/p&gt;

&lt;p&gt;So I've found a shader that make the SpriteMask work in a URP 2D environment. I do now know the original author of the shader, but I decided to store in a github repository, with materials and prefabs, you can find it here : &lt;a href="https://github.com/Falme/Unity-URP-2D-SpriteMask/tree/main" rel="noopener noreferrer"&gt;https://github.com/Falme/Unity-URP-2D-SpriteMask/tree/main&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>unity3d</category>
    </item>
    <item>
      <title>[Hack] picoCTF - Mod 26</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Sun, 21 Apr 2024 16:12:13 +0000</pubDate>
      <link>https://dev.to/falme/hack-picoctf-mod-26-3a77</link>
      <guid>https://dev.to/falme/hack-picoctf-mod-26-3a77</guid>
      <description>&lt;p&gt;This is a challenge from the &lt;a href="https://play.picoctf.org/practice/challenge/144?category=2&amp;amp;page=1" rel="noopener noreferrer"&gt;picoCTF picoGym&lt;/a&gt;, the challenge description follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Cryptography can be easy, do you know what ROT13 is? 
cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_uJdSftmh}"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is pretty straightforward, we can use a website to decrypt the ROT13 encrypted message.&lt;/p&gt;

&lt;p&gt;But in this case, I used a bash script to do this for me. Here's the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Tring to find a flag using ROT13&lt;/span&gt;
&lt;span class="c"&gt;# Where $1 is cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_uJdSftmh}&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"== ROT13 =="&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'N-ZA-Mn-za-m'&lt;/span&gt; &lt;span class="s1"&gt;'A-Za-z'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;tr&lt;/code&gt; command is a substitution command, in this case, we will make the A to be N, B to be O and so on. This is the meaning of ROT13, it will shift each char 13 places:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft75cpwmhrd5l2fctly66.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft75cpwmhrd5l2fctly66.png" alt=" " width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's bidirectional, so no worries of the ordering.&lt;/p&gt;

&lt;p&gt;Running the script, the flag is revealed:&lt;/p&gt;

&lt;p&gt;
  Answer:Flag
  &lt;br&gt;
Flag : picoCTF{next_time_I'll_try_2_rounds_of_rot13_hWqFsgzu}&lt;br&gt;


&lt;/p&gt;

</description>
      <category>bash</category>
      <category>cybersecurity</category>
      <category>programming</category>
    </item>
    <item>
      <title>[Hack] PicoCTF: Low Level Binary Intro - Intro to Assembly</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Mon, 18 Sep 2023 11:00:00 +0000</pubDate>
      <link>https://dev.to/falme/hack-picoctf-low-level-binary-intro-intro-to-assembly-4gm5</link>
      <guid>https://dev.to/falme/hack-picoctf-low-level-binary-intro-intro-to-assembly-4gm5</guid>
      <description>&lt;p&gt;This &lt;a href="https://play.picoctf.org/playlists/2" rel="noopener noreferrer"&gt;PicoCTF Playlist&lt;/a&gt; section is called Intro to Assembly, the challenges will go deeper into assembly values, I've already played with some low level code like &lt;a href="https://hex-rays.com/ida-free/#download" rel="noopener noreferrer"&gt;IDA&lt;/a&gt; and &lt;a href="https://microcorruption.com/" rel="noopener noreferrer"&gt;Microcorruption&lt;/a&gt;, but maybe it will be fun to revisit some concepts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bit-O-Asm-1
&lt;/h2&gt;

&lt;p&gt;The first challenge is pretty simple, we have an assembly dump file, and we need to know what is the value in the EAX.&lt;/p&gt;

&lt;p&gt;So, what is an assembly dump? &lt;br&gt;
The files like and executable can be read as low level language, and this can be interpreted like a line by line command. This can be used for reverse engineering, taking these commands and transforming into C++ for example, so the users can understand and re-compile the original code.&lt;/p&gt;

&lt;p&gt;With that in mind, the computer also have some registers, that store values for computer calculation, one of them is called EAX, and we need the value stored in them.&lt;/p&gt;

&lt;p&gt;Here's the dump file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;endbr64&lt;/span&gt; 
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The values in assembly works just like a variable in a programming language, so in line &lt;code&gt;&amp;lt;+15&amp;gt;&lt;/code&gt; we have &lt;/p&gt;

&lt;p&gt;&lt;code&gt;MOV&lt;/code&gt; (move the value to) &lt;br&gt;
&lt;code&gt;EAX, 0x30&lt;/code&gt; (from &lt;code&gt;0x30&lt;/code&gt; to &lt;code&gt;EAX&lt;/code&gt;, making &lt;code&gt;EAX = 0x30&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;But we actually need the decimal value, so we put it in our python script &lt;a href="https://github.com/Falme-SideProjects/python-hex-to-dec/blob/main/HexToDec.py" rel="noopener noreferrer"&gt;HexToDec.py&lt;/a&gt;, then we can have the answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;HexToDec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="mh"&gt;0x30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We take the result with picoCTF{value} and we have the flag:&lt;/p&gt;

&lt;p&gt;
  Answer:Bit-O-Asm-1
  &lt;br&gt;
picoCTF{48}&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Bit-O-Asm-2
&lt;/h2&gt;

&lt;p&gt;This one have the same solution and steps as the last one, actually all the challenges in this document have the same steps, with something more to it.&lt;/p&gt;

&lt;p&gt;This one should teach that a value can be pointed to another address, in this case we want the value in &lt;code&gt;EAX&lt;/code&gt;, but the value is actually a line above, that's because assembly can have relative addresses. The address is &lt;code&gt;RBP&lt;/code&gt;(register) &lt;code&gt;-0x4&lt;/code&gt;(minus 4 from the register address).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;endbr64&lt;/span&gt; 
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x9fe1a&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The solution is the decimal value of 0x9fe1a, so we put it in our python script &lt;a href="https://github.com/Falme-SideProjects/python-hex-to-dec/blob/main/HexToDec.py" rel="noopener noreferrer"&gt;HexToDec.py&lt;/a&gt;, then we can have the answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;HexToDec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="mh"&gt;0x9fe1a&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  Answer:Bit-O-Asm-2
  &lt;br&gt;
picoCTF{654874}&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Bit-O-Asm-3
&lt;/h2&gt;

&lt;p&gt;This one teaches us operations, like multiplication and addition in assembly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;endbr64&lt;/span&gt; 
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0xc&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x9fe1a&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0xc&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;imul&lt;/span&gt;   &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;add&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x1f5&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;eax&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this case we need to track where the &lt;code&gt;EAX&lt;/code&gt; is/was, and can have the last result (because it will be modified through the dump file)&lt;/p&gt;

&lt;p&gt;For multiplication and addition for Hex values, we will use python terminal and make the calculations there. Just type &lt;code&gt;python&lt;/code&gt; in terminal/cmd and we are set:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pbt8uciy3j0uzk1ipkg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pbt8uciy3j0uzk1ipkg.png" alt=" " width="582" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;At &lt;code&gt;&amp;lt;+29&amp;gt;&lt;/code&gt; we have the set of value to &lt;code&gt;EAX&lt;/code&gt;, value at address &lt;code&gt;RBP-0xC&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;At &lt;code&gt;&amp;lt;+15&amp;gt;&lt;/code&gt; the value to &lt;code&gt;RBP-0xC&lt;/code&gt; is set to &lt;code&gt;0x9fe1a&lt;/code&gt;, making &lt;code&gt;EAX=0x9fe1a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;At &lt;code&gt;&amp;lt;+32&amp;gt;&lt;/code&gt; the EAX is multiplied by the value at address &lt;code&gt;RBP-0x8&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;At &lt;code&gt;&amp;lt;+22&amp;gt;&lt;/code&gt; the value to &lt;code&gt;RBP-0x8&lt;/code&gt; is set to &lt;code&gt;0x4&lt;/code&gt;, making &lt;code&gt;EAX=0x9fe1a*0x4 = 0x27F868&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;At &lt;code&gt;&amp;lt;+36&amp;gt;&lt;/code&gt; we have the value &lt;code&gt;0x1f5&lt;/code&gt; added to &lt;code&gt;EAX&lt;/code&gt;, making it &lt;code&gt;EAX=0x27F868+0x1f5 = 0x27FA5D&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The solution is the decimal value of 0x27FA5D, so we put it in our python script &lt;a href="https://github.com/Falme-SideProjects/python-hex-to-dec/blob/main/HexToDec.py" rel="noopener noreferrer"&gt;HexToDec.py&lt;/a&gt;, then we can have the answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;HexToDec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="mh"&gt;0x27FA5D&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  Answer:Bit-O-Asm-3
  &lt;br&gt;
picoCTF{2619997}&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Bit-O-Asm-4
&lt;/h2&gt;

&lt;p&gt;This one teaches us comparisons and branching code (also known as if, elseif, else) and jumps.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;endbr64&lt;/span&gt; 
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;push&lt;/span&gt;   &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;rsp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;     &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;edi&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;QWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="n"&gt;rsi&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x9fe1a&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="nb"&gt;cmp&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x2710&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;jle&lt;/span&gt;    &lt;span class="mh"&gt;0x55555555514e&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;sub&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x65&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;jmp&lt;/span&gt;    &lt;span class="mh"&gt;0x555555555152&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;add&lt;/span&gt;    &lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="mh"&gt;0x65&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;mov&lt;/span&gt;    &lt;span class="n"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;DWORD&lt;/span&gt; &lt;span class="n"&gt;PTR&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;rbp&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mh"&gt;0x4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;pop&lt;/span&gt;    &lt;span class="n"&gt;rbp&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;+&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;    &lt;span class="n"&gt;ret&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;At the line &lt;code&gt;&amp;lt;+22&amp;gt;&lt;/code&gt; it compares(CMP) the values at &lt;code&gt;RBP-0x4&lt;/code&gt; address and &lt;code&gt;0x2710&lt;/code&gt; and the result will be stored.&lt;/li&gt;
&lt;li&gt;At the line &lt;code&gt;&amp;lt;+29&amp;gt;&lt;/code&gt; it checks the Compare operation if the result is equal or less of the last values [other way to see is &lt;code&gt;(RBP-0x4) &amp;lt;= 0x2710&lt;/code&gt;]. If it's true (if &lt;code&gt;RBP-0x4&lt;/code&gt; is less or equal &lt;code&gt;0x2710&lt;/code&gt;) then jump to the line &lt;code&gt;&amp;lt;+37&amp;gt;&lt;/code&gt;, if it does not, then keep going through the line &lt;code&gt;&amp;lt;+31&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is kinda difficult to explain, but the J in &lt;code&gt;jmp&lt;/code&gt; or &lt;code&gt;jle&lt;/code&gt; means jump, that's kinda a GOTO another line. And the &lt;code&gt;cmp&lt;/code&gt; is a Compare, something like an IF command.&lt;/p&gt;

&lt;p&gt;Going step by step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Line &lt;code&gt;&amp;lt;+22&amp;gt;&lt;/code&gt; Compare the &lt;code&gt;RBP-0x4&lt;/code&gt; address and &lt;code&gt;0x2710&lt;/code&gt; values&lt;/li&gt;
&lt;li&gt;Line &lt;code&gt;&amp;lt;+15&amp;gt;&lt;/code&gt; Set value at &lt;code&gt;RBP-0x4&lt;/code&gt; address to &lt;code&gt;0x9fe1a&lt;/code&gt;, making the comparison &lt;code&gt;0x2710&lt;/code&gt; and &lt;code&gt;0x9fe1a&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Line &lt;code&gt;&amp;lt;+29&amp;gt;&lt;/code&gt; Compare if &lt;code&gt;0x9fe1a&lt;/code&gt; is equal or less than &lt;code&gt;0x2710&lt;/code&gt;, it is not, the statement is false, so No Jump happens&lt;/li&gt;
&lt;li&gt;Line &lt;code&gt;&amp;lt;+31&amp;gt;&lt;/code&gt; subtract (&lt;code&gt;SUB&lt;/code&gt;) value at &lt;code&gt;RBP-0x4&lt;/code&gt; address by &lt;code&gt;0x65&lt;/code&gt;, making it &lt;code&gt;RBP-0x4=0x9fe1a-0x65 = 0x9FDB5&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Line &lt;code&gt;&amp;lt;+35&amp;gt;&lt;/code&gt; Jump (&lt;code&gt;jmp&lt;/code&gt;) to the line &lt;code&gt;&amp;lt;+41&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Line &lt;code&gt;&amp;lt;+41&amp;gt;&lt;/code&gt; Set &lt;code&gt;EAX&lt;/code&gt; value as the value at &lt;code&gt;RBP-0x4&lt;/code&gt;. So &lt;code&gt;EAX=0x9FDB5&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The solution is the decimal value of 0x9FDB5, so we put it in our python script &lt;a href="https://github.com/Falme-SideProjects/python-hex-to-dec/blob/main/HexToDec.py" rel="noopener noreferrer"&gt;HexToDec.py&lt;/a&gt;, then we can have the answer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;python3&lt;/span&gt; &lt;span class="n"&gt;HexToDec&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="mh"&gt;0x9FDB5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  Answer:Bit-O-Asm-4
  &lt;br&gt;
picoCTF{654773}&lt;br&gt;


&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Hack] PicoCTF: Low Level Binary Intro - Warmup</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Mon, 11 Sep 2023 11:00:00 +0000</pubDate>
      <link>https://dev.to/falme/hack-picoctf-low-level-binary-intro-warmup-1jc7</link>
      <guid>https://dev.to/falme/hack-picoctf-low-level-binary-intro-warmup-1jc7</guid>
      <description>&lt;p&gt;I'm coming back to the &lt;a href="https://play.picoctf.org/playlists/2" rel="noopener noreferrer"&gt;PicoCTF Playlist&lt;/a&gt; challenges, and finishing the Warmup list. So in this text we will go through the challenges and solving them.&lt;/p&gt;




&lt;h2&gt;
  
  
  ASCII Numbers
&lt;/h2&gt;

&lt;p&gt;For this challenge, I'll need to get a collection of Hexadecimal values and convert it to ASCII characters and reveal the flag. I could convert by hand, but I want to do a python script for that.&lt;/p&gt;

&lt;p&gt;First, we need to Trim the Hexadecimal values like "0x30 0x40" to be a list array of only simple hex values like [30,40]. That's the code for that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="c1"&gt;# Text like "0x30 0x40 0x50" convert to array
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;TrimHexString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;originalString&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="c1"&gt;#Split the values to an array
&lt;/span&gt;    &lt;span class="n"&gt;hexValues&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;originalString&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Check if need to trim the 0x from hex text
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hexValues&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# If does have 0x, remove it
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0x&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;hexValues&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;

    &lt;span class="c1"&gt;#return final list array
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hexValues&lt;/span&gt;

&lt;span class="nc"&gt;TrimHexString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0x10 0x20 0x30&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then taking this list and concatenate to a whole string, like taking from [30,40,50] to "304050". Making possible to call the bytes.fromhex().decode("utf-8") so we can convert the hex to ASCII easily:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="c1"&gt;# Join all hex arrays to a single string 
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ConcatenateHexList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hexList&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hexList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then call everything with the first argument from command line and show the results of conversion with decode("utf-8"):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="c1"&gt;# Get the first value from command line to trim and join
&lt;/span&gt;&lt;span class="n"&gt;hexConcatenated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ConcatenateHexList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;TrimHexString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;

&lt;span class="c1"&gt;# decode the hex to ascii and show results
&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hexConcatenated&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and calling the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 HexToASCII.py &lt;span class="s2"&gt;"0x70 0x69 0x63 0x6f 0x43 0x54 0x46 0x7b 0x34 0x35 0x63 0x31 0x31 0x5f 0x6e 0x30 0x5f 0x71 0x75 0x33 0x35 0x37 0x31 0x30 0x6e 0x35 0x5f 0x31 0x6c 0x6c 0x5f 0x74 0x33 0x31 0x31 0x5f 0x79 0x33 0x5f 0x6e 0x30 0x5f 0x6c 0x31 0x33 0x35 0x5f 0x34 0x34 0x35 0x64 0x34 0x31 0x38 0x30 0x7d"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We get the flag:&lt;/p&gt;

&lt;p&gt;
  Answer:ASCII Numbers
  &lt;br&gt;
picoCTF{45c11_n0_qu35710n5_1ll_t311_y3_n0_l135_445d4180}&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Picker I
&lt;/h2&gt;

&lt;p&gt;This is a random number generator service, this one have a NetCat call from the PicoCTF servers, with that it also provide us a source code (python script). &lt;/p&gt;

&lt;p&gt;Accessing the netcat, provides me a possibility to roll a getRandomNumber(), but always return 4. It's really random? &lt;a href="https://xkcd.com/221/" rel="noopener noreferrer"&gt;We will never know.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdl4he12s0ycqhaiivmde.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdl4he12s0ycqhaiivmde.png" alt=" " width="504" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Looking through the source file, we can check that the getRandomNumber() is useless, but it also has a method called "win()" which call a file called "flag.txt". Wait, we want that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftii8sh56oj3vwrcjp3v9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftii8sh56oj3vwrcjp3v9.png" alt=" " width="649" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;calling this method instead getRandomNumber, we receive a bunch of hex values:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb1d1ch6d98gltgmhn8y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb1d1ch6d98gltgmhn8y.png" alt=" " width="786" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lucky us, we have a script specifically for that, so calling the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 HexToASCII.py &lt;span class="s2"&gt;"0x70 0x69 0x63 0x6f 0x43 0x54 0x46 0x7b 0x34 0x5f 0x64 0x31 0x34 0x6d 0x30 0x6e 0x64 0x5f 0x31 0x6e 0x5f 0x37 0x68 0x33 0x5f 0x72 0x30 0x75 0x67 0x68 0x5f 0x36 0x65 0x30 0x34 0x34 0x34 0x30 0x64 0x7d"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We have a result, and the response is our flag:&lt;/p&gt;

&lt;p&gt;
  Answer:Picker I
  &lt;br&gt;
picoCTF{4_d14m0nd_1n_7h3_r0ugh_6e04440d}&lt;br&gt;


&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[GameDev] Unity3D, C# and String Security</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Tue, 15 Aug 2023 11:00:00 +0000</pubDate>
      <link>https://dev.to/falme/gamedev-unity3d-c-and-string-security-3j5n</link>
      <guid>https://dev.to/falme/gamedev-unity3d-c-and-string-security-3j5n</guid>
      <description>&lt;p&gt;This is originally a presentation to a company that I worked on but never had the chance to present to my co-workers (because it was ~Too Dangerous~..., it's not)&lt;/p&gt;

&lt;p&gt;The original name of the presentation was &lt;strong&gt;Introduction to CyberSecurity (And why never put passwords inside code)&lt;/strong&gt; as an introduction to security to the company and my co-workers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Will We Talk About?
&lt;/h2&gt;

&lt;p&gt;I am a Unity3D developer and all the companies that I've worked on uses Unity3D/C# as the main Engine, so many examples here will be oriented to that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e10ejglxc2pb92crij6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5e10ejglxc2pb92crij6.jpg" alt=" " width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So We will talk about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What Is CyberSecurity (quick one)&lt;/li&gt;
&lt;li&gt;What is Compilation and Decompilation&lt;/li&gt;
&lt;li&gt;A simple decompilation and password reading&lt;/li&gt;
&lt;li&gt;What is Dotpeek and How to use with Unity&lt;/li&gt;
&lt;li&gt;Unity with IL2CPP and PlayMaker&lt;/li&gt;
&lt;li&gt;Inevitability and Git&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;References and Other Links&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also, this text is for &lt;strong&gt;DEFENSE ONLY&lt;/strong&gt;, many/most/almost all games and software programs have a document that you sign to use that you should not open the code of the game (that's what we will do today). There are many companies that release a game and in the next day the secret assets for Halloween or Christmas is all over the internet, making a hell for the marketing of the project that was hiding it to be a surprise, but more dangerous than that, having the API key available for players that can access the Ranking of a competitive game, cash or similar.&lt;/p&gt;

&lt;p&gt;We are here to help you to prevent (but still possible) hackers to access what they should not. In this document case, the strings/keys/words inside your game.&lt;/p&gt;

&lt;p&gt;But first, I guess you are "just" a Game Developer, so let's talk about cybersecurity!&lt;/p&gt;




&lt;h2&gt;
  
  
  What is CyberSecurity?
&lt;/h2&gt;

&lt;p&gt;The definition of CyberSecurity reads as:&lt;/p&gt;

&lt;p&gt;“Protection of information and information systems from unauthorized access, use, disclosure, disruption, modification, or destruction to provide confidentiality, integrity, and availability.”&lt;/p&gt;

&lt;p&gt;There are many terms is this paragraph, but we will focus on:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Protection of information and information systems from unauthorized access&lt;/strong&gt; : Where the information of a game is the data that shouldn't be accessed from players&lt;/p&gt;

&lt;p&gt;And for knowledge of some aspects of this document: Confidentiality, Integrity and Availability (Most known as C.I.A.)&lt;/p&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Confidentiality : Is basically giving access to those who should access that information and deny the access to those who shouldn't access that information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrity : Means that the information that the user receive is reliable and no one modified it before or after the transaction. This guarantees that the information is 100% the same from the sender to the receiver.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Availability : That guarantee that the information need to be available at the time it is requested, so it needs to keep, for instance, a website on to access your game, a hacker doing a DDoS on your website (website is down) shouldn't happen based on the Availability principle. &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But the Availability does not mean that the information need to be at all times available, just when it need and to those who should.&lt;/p&gt;

&lt;h3&gt;
  
  
  So How Were Protections in the Past?
&lt;/h3&gt;

&lt;p&gt;Around the 1960s, there were only passwords and Physical protections, That means that the computer (accessible mostly on Universities) have a room with a lock on it that protects the computers to be accessed. &lt;/p&gt;

&lt;p&gt;This makes things very physical and did not have something like antivirus or even the idea of Virus. But did not take too long to that be a reality.&lt;/p&gt;

&lt;p&gt;Around the 1970s, there was the concept of Antivirus and Virtual protection, especially because the ARPANET was taking force around the country of the USA. But specially because a man called Bob Thomas created the first known virus: The Creeper.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk5980yf50yyateehcaj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftk5980yf50yyateehcaj.png" alt=" " width="584" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bob Thomas created a program that auto-replicated itself and spread through the network of computers, it did nothing harmful, just printed the text "I'M THE CREEPER: CATCH ME IF YOU CAN" on the screen.&lt;/p&gt;

&lt;p&gt;The consequence of this creation, makes Ray Tomlinson to create a new program that eliminate the creeper program called "Reaper".&lt;/p&gt;

&lt;p&gt;With that, we had our first virus (Creeper) and antivirus (Reaper).&lt;/p&gt;

&lt;p&gt;Ok, The Creeper was actually a Worm, a self-propagate program through the network, but these names (virus, antivirus, worms) was not a thing until 1980s where the personal computers and as we know the internet was around.&lt;/p&gt;

&lt;p&gt;With time, virus, worms, antivirus and similar has become more and more complex. Nowadays, information is more valuable than anything, and we need to secure it the proper way.&lt;/p&gt;

&lt;h3&gt;
  
  
  HACKERS!?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbiq9hymdd2h725lvxvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbiq9hymdd2h725lvxvw.png" alt=" " width="260" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hackers from the definition written by Wesley Chai:&lt;/p&gt;

&lt;p&gt;"A hacker is an individual who uses computer, networking or other skills to overcome a technical problem. The term also refers to anyone who uses their abilities to gain unauthorized access to systems or networks in order to commit crimes. A hacker may, for example, steal information to hurt people via identity theft or bring down a system and, often, hold hostage in order to collect a ransom.&lt;/p&gt;

&lt;p&gt;The term hacker has historically been a divisive one, sometimes being used as a term of admiration for individuals who exhibit a high degree of skill and creativity in their approach to technical problems. However, the term is also commonly applied to individuals who use this skill for illegal or unethical purposes."&lt;/p&gt;

&lt;p&gt;So, many words, but we need to talk about some of the words used in this:&lt;/p&gt;

&lt;p&gt;Hacker, before the cybersecurity term applied, was used for people who tinker code or make some mess that work for a program, or a clever solution for a limited system.&lt;/p&gt;

&lt;p&gt;Hacker commit crimes is a misleading phrasing, we should separate in hats:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;White Hat&lt;/strong&gt; : Ethical Hacker, do not commit crime&lt;br&gt;
&lt;strong&gt;Black Hat&lt;/strong&gt; : Uses hacking for unauthorized access (usually cybercrime)&lt;br&gt;
&lt;strong&gt;Gray Hat&lt;/strong&gt; : Uses hacking for his own benefit, maybe some TI worker at day and cybercriminal at night for his own good&lt;/p&gt;

&lt;p&gt;Wrapping it up, hackers can be beneficial finding security flaws on your system, your company (with permission to test your system, obviously) and find ways to make it more secure. But the same way can be beneficial, it can be harmful with cybercrime, stealing information, spying on unaware users, etc.&lt;/p&gt;


&lt;h2&gt;
  
  
  What is Compilation and Decompilation
&lt;/h2&gt;

&lt;p&gt;When you, yes You, the game developer, makes a code for a game and need to release to the public (making an .exe for example) you need to make a compilation of your code. For simplicity, we will define as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compilation&lt;/strong&gt;:&lt;br&gt;
C# Code → To → Machine Code&lt;/p&gt;

&lt;p&gt;The machine code is not readable by developers/humans. But if we have only the compiled code, and we need to read it, the process needed is called &lt;strong&gt;Decompilation&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decompilation&lt;/strong&gt;:&lt;br&gt;
Machine Code → To → C# Code (Human Readable)&lt;/p&gt;

&lt;p&gt;For this case, we will only make readable the C# code from the original program. Usually, the Decompilation must have the possibility to recompile the code to an executable again. That's the real goal.&lt;/p&gt;


&lt;h2&gt;
  
  
  A simple decompilation and password reading
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9ui52q4i1jzrmi1mlo3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9ui52q4i1jzrmi1mlo3.png" alt=" " width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you pass through the decompilation process, maybe the final code is not the same as the original, but it surely acts like the original one. That's because in the compilation process the code (C#) need to be converted in another language to be processed to machine language, some (mostly) C# features are not present and need to be adapted.&lt;/p&gt;

&lt;p&gt;In the example above, we have a original code that check if the password in a variable equals "S3Cr37"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"S3Cr37"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"you have access"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and after we passed through the process of decompilation, the code is something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(!(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"S3Cr37"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

   &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;object&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="s"&gt;"you have access"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kinda different, but they do the same thing, the low level code works as "Jumping from one line to another" so the decompiled code prefers to exit the method on a failed verification (that explains the &lt;code&gt;return;&lt;/code&gt; call);&lt;/p&gt;

&lt;p&gt;But we must not miss the point, our "Secret Password" is still visible, this could be your secret password, secret key or Secret Address for a page.&lt;/p&gt;

&lt;p&gt;So, before understanding how to prevent, let's see how it works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Dotpeek and How to use with Unity
&lt;/h2&gt;

&lt;p&gt;We are using Unity as an example for this exercise, if you need, I'll be uploading the &lt;a href="https://github.com/Falme/Unity3D-String-Hack" rel="noopener noreferrer"&gt;example project and the source code&lt;/a&gt; in the GitHub (But it's so simple you could do it yourself).&lt;/p&gt;

&lt;p&gt;We will create a Unity project with the standard configurations, add a script to the default scene called "Secret.cs" with our secret code. Just that and make a Windows build (sorry Linux users D:)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Falme/Unity3D-String-Hack/releases/tag/Build" rel="noopener noreferrer"&gt;Here's our build&lt;/a&gt;, Let's crack this Secret.cs;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But Hey, this is just amateur insecure stuff, right?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not at all, many big games that you know have this simple insecure thing that make you able to read their code, here are some examples (Do Not do anything with these open codes):&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdd1d28zdgtnx1pf235x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhdd1d28zdgtnx1pf235x.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Take note about INSIDE, that have a +/-, this is a special case, we will talk about it as well)&lt;/p&gt;

&lt;p&gt;The real danger is about the secret content that should not be accessible to the public/players.&lt;/p&gt;

&lt;p&gt;With the build, now we need to download a tool called &lt;a href="https://www.jetbrains.com/pt-br/decompiler/" rel="noopener noreferrer"&gt;DotPeek&lt;/a&gt; from JetBrains. The tool is a decompiler, so we can disassemble the .DLLs from the Unity build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Stop to explain how DLLs works with Unity
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finwkmw2oxum2pzgwa1a0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finwkmw2oxum2pzgwa1a0.png" alt=" " width="785" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For default, all the scripts that you (developer) create in the engine will be compiled in an Assembly Definition called &lt;strong&gt;Assembly-CSharp.dll&lt;/strong&gt;, remember this name, it will be important in the future.&lt;/p&gt;

&lt;p&gt;This makes Engine Unity Code stable and separated from the developer code. If you don't want all your code in one DLL, you'll need to create an Assembly Definition in your project to make it separated, but the references STILL points to Assembly-CSharp.&lt;/p&gt;

&lt;p&gt;Ok, back to hacking.&lt;/p&gt;

&lt;h3&gt;
  
  
  After finished downloading DotPeek
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faz0pu6din2441mo91l4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faz0pu6din2441mo91l4f.png" alt=" " width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After you download Dotpeek, you will need to find out if the target build is compatible to this attack. To know that, you'll need to find the build folder and find a DLL in the path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\PathToBuild\BuildName\BuildName_Data\Managed\Assembly-CSharp.dll
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this path and DLL exists, your attack can be done. This happens because Unity have a standard option in Player Settings &amp;gt; Other Settings &amp;gt; Configuration &amp;gt; Scripting Backend called Mono&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bdz64h0595ztjqd4s0j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1bdz64h0595ztjqd4s0j.png" alt=" " width="358" height="49"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It makes build much faster, but sacrifices part of other things like performance and security. &lt;/p&gt;

&lt;p&gt;So, enough talking, open your DotPeek, and select "File &amp;gt; Open" and select your target &lt;strong&gt;Assembly-CSharp.dll&lt;/strong&gt; (I told you this was important):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfw7oos6yxfl294ait3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfw7oos6yxfl294ait3j.png" alt=" " width="352" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkwerphnbycxtdq82vku.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdkwerphnbycxtdq82vku.png" alt=" " width="303" height="72"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbfglhiqdttswm8pwa55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbfglhiqdttswm8pwa55.png" alt=" " width="425" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After loading the project, you'll select the Assembly-CSharp field, right-click and select the Export to Project..., select a folder and wait for the decompiler to finish working.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frygupyxb8x704mj4kq8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frygupyxb8x704mj4kq8e.png" alt=" " width="430" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After exporting, you will have the C# files from the original project to be human-readable (kinda different, but readable).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hou5ck9jlzr0hpegzro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hou5ck9jlzr0hpegzro.png" alt=" " width="800" height="258"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations, you got the secret password!&lt;/p&gt;

&lt;p&gt;But wait, how can I prevent this?&lt;/p&gt;




&lt;h2&gt;
  
  
  Unity with IL2CPP and PlayMaker
&lt;/h2&gt;

&lt;p&gt;A way to make things a little difficult for the person who is opening your code is to change the &lt;strong&gt;Script Backend&lt;/strong&gt; to &lt;strong&gt;IL2CPP (Intermediate Language To C++)&lt;/strong&gt; At "Edit &amp;gt; Project Settings &amp;gt; Other Settings &amp;gt; Configuration"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgd2jdaqxd1hvzdcfisx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgd2jdaqxd1hvzdcfisx.png" alt=" " width="698" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What it does is not put your code directly in to a DLL, but converting your C# code a Intermediate Language (Microsoft Intermediate Language) to C++ and then compiling to machine code.&lt;/p&gt;

&lt;p&gt;Making this process, it will not create an Assembly-CSharp.dll&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb4np2jm341vugnyradg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffb4np2jm341vugnyradg.png" alt=" " width="425" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  No problem with that?
&lt;/h3&gt;

&lt;p&gt;Yes, there's a problem, and it's that a String is still a String. We will find our secret code again, but now with some Linux Bash commands.&lt;/p&gt;

&lt;p&gt;With our new files compiled to the build, we need to go to the file "global-metadata.dat" at&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\PathToBuild\BuildName\BuildName_Data\il2cpp_data\Metadata\global-metadata.dat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will use &lt;a href="https://apps.microsoft.com/store/detail/windows-subsystem-for-linux/9P9TQF7MRM4R" rel="noopener noreferrer"&gt;WSL (Windows Subsystem for Linux)&lt;/a&gt;, that's a Linux inside your Windows 10/11, if you don't have it, you can download it in the Microsoft Store, it's free.&lt;/p&gt;

&lt;p&gt;With WSL, we will use this command to our file global-metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;strings global-metadata.dat | &lt;span class="nb"&gt;grep &lt;/span&gt;S3Cr37
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;strings&lt;/code&gt; lists all strings inside a file&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grep&lt;/code&gt; Highlight/Only Show if an argument is true/found&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;S3Cr37&lt;/code&gt; is the argument we want to find&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With that, we can see that our Secret Code can be found in our build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkbo7zw2ghdutvivdt78.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkbo7zw2ghdutvivdt78.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, of course we knew beforehand what was the code we need to find. But If we knew from previous builds what words to discard or if we use a wordlist to find relevant values, we can still find some interesting results, including our code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Time for PlayMaker
&lt;/h3&gt;

&lt;p&gt;First, I'm not saying that PlayMaker is safer, this is just a curiosity that make sense in this document.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://assetstore.unity.com/packages/tools/visual-scripting/playmaker-368" rel="noopener noreferrer"&gt;PlayMaker&lt;/a&gt; is a tool for Visual Scripting, similar to Blueprints for Unreal, but not official for Unity. The curious case is that INSIDE uses it, and this makes their code not convertible to code directly, but converted to Assets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj4kp8bd76iftfdxdx2s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foj4kp8bd76iftfdxdx2s.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This makes it harder to find information in the code from the previous techniques that we used.&lt;/p&gt;

&lt;p&gt;The conversion of your code to Asset can also be used in different ways like:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using Scriptable Objects: Where you put your key to an Asset&lt;/li&gt;
&lt;li&gt;Using PlayMaker or Other Visual Scripting : Same as above, but this influences your developer team&lt;/li&gt;
&lt;li&gt;Using External Services : Still using Scriptable Objects, but this one calls a service outside, keeping your data/access outside the game (We will talk about this one later)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the case of the PlayMaker, what it does is to convert the visual scripting data into a &lt;strong&gt;resources.assets&lt;/strong&gt; data. So if you decide to open the resources.assets file in a &lt;code&gt;strings&lt;/code&gt; bash command (as we talked above) you will only get rubbish.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wvy3bvga4k9ljxp6957.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8wvy3bvga4k9ljxp6957.png" alt=" " width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  So, can it be opened?
&lt;/h3&gt;

&lt;p&gt;Yes... Kinda... you'll need some fancy study and tools to do that, what I can tell you is how to show Assets in a build.&lt;/p&gt;

&lt;p&gt;We will use a tool called &lt;a href="https://github.com/Perfare/AssetStudio" rel="noopener noreferrer"&gt;AssetStudio&lt;/a&gt;. It's free and can be accessed in a Github repository.&lt;/p&gt;

&lt;p&gt;As this example, we will take a project with PlayMaker and open it with AssetStudio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9tkshcnp0an8hq81i0h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9tkshcnp0an8hq81i0h.png" alt=" " width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As shown in the above image, we can find, open and export these PlayMakerAssemblies and PlayMakerFSM files to our system and maybe find something useful. I'll stop here about the PlayMaker, but if you want to know more, play with it, make your PlayMaker example code and try to find some secret content.&lt;/p&gt;

&lt;p&gt;Bonus: AssetStudio is also used to find images, sounds, music, models, textures and every other thing that Unity categorize it as an Asset, that can be exported and read. That's how many models and information can be found so fast after a launch of a game.&lt;/p&gt;




&lt;h2&gt;
  
  
  Inevitability and Git
&lt;/h2&gt;

&lt;p&gt;So... What we learned until now?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All options above was terrible&lt;/li&gt;
&lt;li&gt;No code is 100% secure&lt;/li&gt;
&lt;li&gt;What we are doing is only delaying the hacker to find the key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This can be resumed with the "Infinite Monkey Theorem" (Hiding the Monkey identity for security):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqkwrulvevs6vzhq1n03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnqkwrulvevs6vzhq1n03.png" alt=" " width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The theorem says that &lt;em&gt;a monkey hitting keys at random on a typewriter keyboard for an infinite amount of time will almost surely type any given text, including the complete works of William Shakespeare&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;With our case, what the hackers have is time, so, with time and patience, the hacker will find your hiding key (also it's not only one monkey if your game is published in Steam).&lt;/p&gt;

&lt;h3&gt;
  
  
  So how the hackers can find my key?
&lt;/h3&gt;

&lt;p&gt;Here are some examples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub and Bitbucket files&lt;/strong&gt;: They can access/hack the .git files at some point and going right in the source of your game, and this is not impossible, many games AAA had this incident, the Git example is only because there's also history of all your commits, making possible other attacks (maybe?)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Two-Factor Authentication and Obsolete login methods&lt;/strong&gt;: Some users don't have Two-Factor Authentication, on GitHub, on Unity, on Google Play Store, on Steam, you name it. This makes sure that the login need your authentication. &lt;a href="https://www.youtube.com/watch?v=gYs9nS8LlZ8" rel="noopener noreferrer"&gt;Here's a funny video of Gabe Newell asking to be hacked, but the Two-Factor Auth blocks it.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Low-Hanging Fruit&lt;/strong&gt;: Making the basics is essential, but hackers love to go to those who don't do the basics, because it's easier to hack. So if you don't do the simple basics (like change to IL2CPP) they will use an automation code to find you faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Encrypted Strings and Code&lt;/strong&gt;: Making encryption is good for everyone, to send email or to keep an access secret. But make sure to not keep the key de decrypt in the same drawer as the locker and make sure your encryption is good, because if it's just a ROT13 encryption, it will not make a difference.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Any other ways to make it more secure?
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Use External Services like &lt;a href="https://azure.microsoft.com/pt-br/products/playfab" rel="noopener noreferrer"&gt;PlayFab&lt;/a&gt;&lt;/strong&gt;: PlayFab is a service where you can put data, rankings and actually remote code, so if you need to send a score to a competitive game, you can have remote code to check if this is a correct (or viable) score to be added, but more than that, check if the transaction is legit, looking through data of the player and, if needed, banning them. This way your key/service is not in your game, so your build is safe.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This remote content can also be applied to game events content, where you can put a Asset Bundle (or Addressables) in a CDN server/service and release when the time has come, so the content Assets is not in your build (yet)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Permissions for Reading and Modifying&lt;/strong&gt;: Make sure that some data in the server (sending requests to a server) cannot be modified if it should not be modified. It's easy to not pay attention to that because we don't think of the day when someone will delete/modify our data, but make sure this is true.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Do the basics and more&lt;/strong&gt;: I see other fields like Software development or Web Development being so cautious about security (ok, not that much, but they make the basics) and game development make no case about that. And sometimes the solution is so simple. So take care of your project, do not keep any secret that shouldn't be read in your builds, specially if it is online, triple check it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusion and Recommendations
&lt;/h2&gt;

&lt;p&gt;Let's recap:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Unity Builds with Script Backend as IL2CPP&lt;/li&gt;
&lt;li&gt;No compromising strings inside Scripts&lt;/li&gt;
&lt;li&gt;Use recommended protection for Git Servers (GitHub, Bitbucket, etc.) with &lt;a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent" rel="noopener noreferrer"&gt;SSH RSA Keys&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;If you need to register a value, use external services that have an authentication layer&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Other Security Recommendations outside GameDev
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Do not open suspicious Links or Emails (even from friends)&lt;/li&gt;
&lt;li&gt;Activate &lt;a href="https://docs.github.com/en/authentication/securing-your-account-with-two-factor-authentication-2fa/configuring-two-factor-authentication" rel="noopener noreferrer"&gt;Two-Factor Authentication&lt;/a&gt; for every service (Steam, Github, Google, etc...)&lt;/li&gt;
&lt;li&gt;Use Antivirus (better than nothing)&lt;/li&gt;
&lt;li&gt;Check if your password had been exposed (&lt;a href="https://haveibeenpwned.com/" rel="noopener noreferrer"&gt;https://haveibeenpwned.com/&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Do not use personal accounts inside your company&lt;/li&gt;
&lt;li&gt;Keep all softwares programs Up to date (specially Windows)&lt;/li&gt;
&lt;li&gt;Common sense&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Bonus: Can it be useful in Game Development?
&lt;/h3&gt;

&lt;p&gt;Yes! This is a thing very common nowadays (opening builds and checking for secrets), you, as a game developer, can use this to add secret content in your games, or making a game where you NEED to open the game to find clues. But mostly is a content that is not necessary for the gameplay, just a joke for the hardcore fans.&lt;/p&gt;

&lt;p&gt;And you can do it as well.&lt;/p&gt;




&lt;h2&gt;
  
  
  References (And other links)
&lt;/h2&gt;

&lt;p&gt;History of CyberSecurity, Avast : &lt;a href="https://blog.avast.com/history-of-cybersecurity-avast#the-1950s" rel="noopener noreferrer"&gt;https://blog.avast.com/history-of-cybersecurity-avast#the-1950s&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A History of Information Security :&lt;br&gt;
&lt;a href="https://www.ifsecglobal.com/cyber-security/a-history-of-information-security/" rel="noopener noreferrer"&gt;https://www.ifsecglobal.com/cyber-security/a-history-of-information-security/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity Assembly Definitions : &lt;a href="https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html" rel="noopener noreferrer"&gt;https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dotpeek from Jetbrains : &lt;a href="https://www.jetbrains.com/pt-br/decompiler/" rel="noopener noreferrer"&gt;https://www.jetbrains.com/pt-br/decompiler/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The amazing history of programming with Olga Stern : &lt;a href="https://www.youtube.com/watch?v=bJWWbql0QIQ" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=bJWWbql0QIQ&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tutorial Inspecting Unity Exported Assets&lt;br&gt;
&lt;a href="https://www.vg-resource.com/thread-31141.html" rel="noopener noreferrer"&gt;https://www.vg-resource.com/thread-31141.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jacquard's Loom machine:&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=MQzpLLhN0fY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=MQzpLLhN0fY&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How to Be a Hacker:&lt;br&gt;
&lt;a href="http://www.catb.org/%7Eesr/faqs/hacker-howto.html" rel="noopener noreferrer"&gt;http://www.catb.org/~esr/faqs/hacker-howto.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search Security - What is a Hacker? :&lt;br&gt;
&lt;a href="https://searchsecurity.techtarget.com/definition/hacker" rel="noopener noreferrer"&gt;https://searchsecurity.techtarget.com/definition/hacker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity AssetStudio :&lt;br&gt;
&lt;a href="https://github.com/Perfare/AssetStudio/releases" rel="noopener noreferrer"&gt;https://github.com/Perfare/AssetStudio/releases&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CyberSecurity vs Information Security:&lt;br&gt;
&lt;a href="https://www.simplilearn.com/information-security-vs-cyber-security-article" rel="noopener noreferrer"&gt;https://www.simplilearn.com/information-security-vs-cyber-security-article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73hkwbl3yoz8j80nv9yz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73hkwbl3yoz8j80nv9yz.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>cybersecurity</category>
      <category>security</category>
    </item>
    <item>
      <title>[Hack] CTF Challenge - VulnBegin Flags</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Sat, 05 Aug 2023 09:00:00 +0000</pubDate>
      <link>https://dev.to/falme/hack-ctf-challenge-vulnbegin-flags-209l</link>
      <guid>https://dev.to/falme/hack-ctf-challenge-vulnbegin-flags-209l</guid>
      <description>&lt;p&gt;Sometimes I find very interesting the puzzle of Capture the Flag (CTF), where I can use some of my time to dive into a problem that I have no idea of "How the heck am I going to solve this?". And then, after some hours, in bed, I get up saying "I know!!" and try my new idea, maybe it's right, maybe it's wrong, but it's very satisfying.&lt;/p&gt;

&lt;p&gt;This one is about the CTF Challenge Website, more specific the Vuln Begin Challenge, with 9 Flags to be found. &lt;/p&gt;

&lt;p&gt;In my case, the website will be relative from time to time (every time a new instance of the CTF challenge), so, for this document I'll refer to the URL as "mymachine.vulnbegin.co.uk/".&lt;/p&gt;

&lt;p&gt;So, Here's my journey to find all the flags:&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 1
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8451w92a3nmj5l4zq8vb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8451w92a3nmj5l4zq8vb.png" alt=" " width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the website says, "There's not much here!", no effective button, no form, no flags inside the Inspect element, So I need to do alternative ways to find the flags.&lt;/p&gt;

&lt;p&gt;Usually I start looking for robots.txt, which maybe have some files or folders paths, usually used to filter these folders to not allow to be found from robots (like the Google search) and keep it secret.&lt;/p&gt;

&lt;p&gt;So I looked in mymachine.vulnbegin.co.uk/robots.txt to see if it has some hidden file/path&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi2wv6flwhtoxxqilnn32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi2wv6flwhtoxxqilnn32.png" alt=" " width="272" height="125"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, with that info, there's a disallowed folder called /secret_d1rect0y/ . I go to the address and I have found the first flag:&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 1
  &lt;br&gt;
[^FLAG^2B22E2CB70E218510802B0359488F6A2^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 2
&lt;/h2&gt;

&lt;p&gt;This flag was kinda problematic, I get the idea, but I will address the problem soon.&lt;/p&gt;

&lt;p&gt;This one need to find a subdomain in the mymachine.vulnbegin.co.uk, but the subdomain is not easy to be accessed from bruteforce or wordlists. &lt;br&gt;
For that we need to go to the &lt;code&gt;crt.sh&lt;/code&gt; to search the Certificates from the &lt;code&gt;vulnbegin.co.uk&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7073jbjjqsw4wuriocq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7073jbjjqsw4wuriocq6.png" alt=" " width="548" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This image show a problem, that the address in the input is &lt;code&gt;http://vulnbegin.co.uk/&lt;/code&gt;, but with the &lt;code&gt;http://&lt;/code&gt; or &lt;code&gt;/&lt;/code&gt; at the end will not find the certificates that I need, and I wasted a lot of time in this simple string problem.&lt;/p&gt;

&lt;p&gt;after changing it to only &lt;code&gt;vulnbegin.co.uk&lt;/code&gt; I got the correct results with the subdomain that I was looking for:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzbff9ji8bqsmr39tr0wq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzbff9ji8bqsmr39tr0wq.png" alt=" " width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that I found the &lt;code&gt;v64hss83&lt;/code&gt; subdomain, and accessing the page &lt;code&gt;v64hss83.mymachine.vulnbegin.co.uk&lt;/code&gt; we access the Flag:&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 2
  &lt;br&gt;
[^FLAG^047524FE61AE6B5FD1D184994C7322FC^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 3
&lt;/h2&gt;

&lt;p&gt;Finding the subdomains of mymachine.vulnbegin.co.uk/, can be useful, and it's recommended in the useful tools page the FFuF to enumerate the subdomains, for that, I used the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffuf &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-w&lt;/span&gt; subdomains.txt &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-u&lt;/span&gt; http://FUZZ.mymachine.vulnbegin.co.uk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ffuf&lt;/code&gt; calls the application &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-w subdomains.txt&lt;/code&gt; use a wordlist to scan &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-u http://FUZZ.mymachine.vulnbegin.co.uk&lt;/code&gt; define the address to enumerate, where FUZZ word is the placeholder to test possible correct values &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With that, it returns with a possible subdomain called &lt;a href="http://server.mymachine.vulnbegin.co.uk" rel="noopener noreferrer"&gt;http://server.mymachine.vulnbegin.co.uk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6ganhugz3v6hz8a8rtb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6ganhugz3v6hz8a8rtb.png" alt=" " width="767" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Checking the page, we find the flag:&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 3
  &lt;br&gt;
[^FLAG^E858ED9649E57BECE9ACD1A4C60D3446^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 4
&lt;/h2&gt;

&lt;p&gt;The CTFChallenge Useful tools recommends the use of DNSRecon to check information about the mymachine.vulnbegin.co.uk/ DNS. So I run the&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dnsrecon &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; mymachine.vulnbegin.co.uk &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-D&lt;/span&gt; ./subdomains.txt &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-t&lt;/span&gt; std &lt;span class="nt"&gt;--xml&lt;/span&gt; dnsrecon.xml &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--lifetime&lt;/span&gt; 5.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dnsrecon&lt;/code&gt; calls the application&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d mymachine.vulnbegin.co.uk&lt;/code&gt; set the domain to check&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-D ./subdomains.txt&lt;/code&gt; uses the wordlist subdomains from the Useful tools page and bruteforce for information&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-t std&lt;/code&gt; call for standard scan&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--xml dnsrecon.xml&lt;/code&gt; export results to an XML called dnsrecon.xml&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--lifetime 5.0&lt;/code&gt; keeps the lifetime of scan to 5.0 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With the scan, it reveals new information about the DNS and with that, the Flag&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizf855m5mb698f1a76a5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizf855m5mb698f1a76a5.png" alt=" " width="699" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 4
  &lt;br&gt;
[^FLAG^BED649C4DB2DF265BD29419C13D82117^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 5
&lt;/h2&gt;

&lt;p&gt;After Calling the FFuF to find some hidden pages inside the mymachine.vulnbegin.co.uk/* I have found a page called cpadmin:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzfskhrqoiwrbqhx6cqz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwzfskhrqoiwrbqhx6cqz.png" alt=" " width="721" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Checking this page, we can find a login page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ngm5t9z7qeh9lkstj4e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ngm5t9z7qeh9lkstj4e.png" alt=" " width="740" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the first thing to do is to do the basic login test: Put admin/admin in login and password. My surprise is that the result tells me that is an invalid password, but not login, so there's an admin user, I just need to find the correct password:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxjj2cmk4lrb8mtxxtv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwxjj2cmk4lrb8mtxxtv3.png" alt=" " width="669" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For that I'll use Hydra to brute force the password, the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hydra &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-l&lt;/span&gt; admin &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-P&lt;/span&gt; ~/wordlists/passwords.txt &lt;span class="se"&gt;\&lt;/span&gt;
mymachine.vulnbegin.co.uk &lt;span class="se"&gt;\&lt;/span&gt;
http-form-post &lt;span class="s2"&gt;"/cpadmin/login:username=^USER^&amp;amp;password=^PASS^:Password is invalid"&lt;/span&gt; &lt;span class="nt"&gt;-V&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;will do the work.&lt;/p&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hydra&lt;/code&gt; calls the program for brute force&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-l admin&lt;/code&gt; set the login fixed as the word 'admin'&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-P ~/wordlists/passwords.txt&lt;/code&gt; calls a password wordlist to test&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;http-form-post&lt;/code&gt; is the method-form for hydra to attack&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/cpadmin/login:&lt;/code&gt; is the path to the login page address&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;username=^USER^&amp;amp;password=^PASS^&lt;/code&gt; is the information body to send to login form requisition, where ^USER^ will be replaced by the user value and ^PASS^ will be replaced by the password value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Password is invalid&lt;/code&gt; is the identifier in page to check if the login was successful or not, in this case we are only checking for the password validation, as we know the login value&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-V&lt;/code&gt; verbose flag, so we can see all the hydra attempts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After some tries, we found our secret password for login:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidxihwan3i4szh9lcs8g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fidxihwan3i4szh9lcs8g.png" alt=" " width="747" height="124"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;after inputting the correct password, we will be presented with the Flag:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpedqj9pw5frb8u3h550.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkpedqj9pw5frb8u3h550.png" alt=" " width="559" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 5
  &lt;br&gt;
[^FLAG^93D7491FB4B054FB5C5AC3E0292BE41C^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 6
&lt;/h2&gt;

&lt;p&gt;After making a login as Admin in the cplogin page, it says that a configuration file was available, so I will use a wordlist to find new content with the session cookie from login. &lt;br&gt;
To do that I'll use FFuF to Fuzz the content of the page with a Cookie Header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffuf &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-w&lt;/span&gt; ~/wordlists/content.txt &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-u&lt;/span&gt; http://mymachine.vulnbegin.co.uk/cpadmin/FUZZ &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Cookie: token=2eff535bd75e77b6c70ba1e4dcb2873"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ffuf&lt;/code&gt; calls the program&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-w ~/wordlists/content.txt&lt;/code&gt; uses a wordlist called content&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;http://mymachine.vulnbegin.co.uk/cpadmin/FUZZ&lt;/code&gt; is where I want to find new content and FUZZ is the string to be tested&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-H "Cookie: token=2eff535bd75e77b6c70ba1e4dcb2873"&lt;/code&gt; is the Cookie session to make the page think that I am logged in (actually the session cookie IS the thing that checks if I am logged in)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After making through all the wordlist, we found some pages:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pylwcoaif1g61p4jnk1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0pylwcoaif1g61p4jnk1.png" alt=" " width="740" height="110"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's check the &lt;code&gt;env&lt;/code&gt; page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9a0bhsgbt0xe2mhc8sa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd9a0bhsgbt0xe2mhc8sa.png" alt=" " width="452" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With that we found the Flag and some hint for the next flag&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 6
  &lt;br&gt;
[^FLAG^F6A691584431F9F2C29A3A2DE85A2210^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 7
&lt;/h2&gt;

&lt;p&gt;The address &lt;code&gt;server.mymachine.vulnbegin.co.uk&lt;/code&gt; has returned "Not Authenticated" from some previous flags, maybe with this new Header parameter &lt;code&gt;"X-Token: 492E64385D3779BC5F040E2B19D67742"&lt;/code&gt; we can be authenticated in the server subdomain. &lt;br&gt;
So using the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://server.mymachine.vulnbegin.co.uk/ &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Token: 492E64385D3779BC5F040E2B19D67742"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the new X-Token in the Header we can be Authenticated, and with that a new flag appears:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetls2bb7lfg1bei9cgw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetls2bb7lfg1bei9cgw6.png" alt=" " width="752" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 7
  &lt;br&gt;
[^FLAG^0BDC60CC5E283476E7107C814C18DCCF^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 8
&lt;/h2&gt;

&lt;p&gt;With the X-Token auth value, we can re-scan for new addresses, but now as the Host being the server. &lt;br&gt;
So calling the FFuF again to find content in the page but with 2 values on header, one being the X-Token to authenticate the access &lt;code&gt;-H "X-Token: 492E64385D3779BC5F040E2B19D67742"&lt;/code&gt; and the Host as server &lt;code&gt;-H "Host: server.mymachine.vulnbegin.co.uk"&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ffuf http://mymachine.vulnbegin.co.uk/user &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Token: 492E64385D3779BC5F040E2B19D67742"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Host: server.mymachine.vulnbegin.co.uk"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With these header values, we find a new access at /user/:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwukdxhsfx29lq4l222n0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwukdxhsfx29lq4l222n0.png" alt=" " width="744" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accessing the /user/ page we find a JSON with the following information:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{"id":27,"endpoint":"/user/27"}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And accessing the /user/27/ page we find another JSON with the following information:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{"id":27,"username":"vulnbegin_website","endpoint":"/user/27/info"}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And accessing the /user/27/info page we find another JSON with the Flag information.&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 8
  &lt;br&gt;
[^FLAG^7B3A24F3368E71842ED7053CF1E51BB0^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Flag 9
&lt;/h2&gt;

&lt;p&gt;In the last Flag there was ID information in /user/27/info, that means that a user have the identifier in the Database as 27. That reveals that other users may be available for reading information.&lt;br&gt;
The idea is to loop through the users until we find something useful or ideally the Flag.&lt;/p&gt;

&lt;p&gt;For that I'll use a loop from bash to gather information with curl:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;for &lt;/span&gt;i &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;0..5&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="k"&gt;do &lt;/span&gt;curl http://mymachine.vulnbegin.co.uk/user/&lt;span class="nv"&gt;$i&lt;/span&gt;/info &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Token: 492E64385D3779BC5F040E2B19D67742"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Host: server.mymachine.vulnbegin.co.uk"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;for i in {0..5};&lt;/code&gt; make it loop the next action 6 times (starts at zero, finishes at 5)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;do&lt;/code&gt; defines what action to do (next command will loop)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;curl http://mymachine.vulnbegin.co.uk/user/$i/info -H "X-Token: 492E64385D3779BC5F040E2B19D67742" -H "Host: server.mymachine.vulnbegin.co.uk";&lt;/code&gt; The command we saw last time, but now with $i in the place of the user ID, this will change to the loop number (from 0 to 5)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;done&lt;/code&gt; identifier of finishing the loop command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After looping 6 times, we have our flag at ID 5:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1v5hlmmy42c8oh8tcraf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1v5hlmmy42c8oh8tcraf.png" alt=" " width="759" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  Answer:Flag 9
  &lt;br&gt;
[^FLAG^3D82BE780F46EE86CE060D23E6E80639^FLAG^]&lt;br&gt;


&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This was a journey, many of the solutions I've seen before, but the CTF that have a correct sequence to find a flag, and other flag, and another flag... It's kinda motivating to find the next one (I also found 2 flags on VulnLayers, the next free CTF, but I'll not finish it so soon). &lt;/p&gt;

&lt;p&gt;The CTF Challenge gives me a feeling of Escape the room games, where I find the solution of a puzzle, but also gives me a hint to what should I look for next. &lt;/p&gt;

&lt;p&gt;But in the negative side, if I find the answer of a puzzle in a wrong order, it can be very confusing to finish the CTF/Escape the room as a whole. In the CTFChallenge case, I skipped the Flag 2, and found the result of Flag 3, 4 and 5, this makes the line of thought very hard to follow.&lt;/p&gt;

&lt;p&gt;As a lesson, I need to have more patience and make my steps very clear, one foot after another till I reach the end.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>bash</category>
      <category>ctf</category>
    </item>
    <item>
      <title>[Hack] PicoCTF : GET aHEAD</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Mon, 24 Jul 2023 09:00:00 +0000</pubDate>
      <link>https://dev.to/falme/hack-picoctf-get-ahead-g3n</link>
      <guid>https://dev.to/falme/hack-picoctf-get-ahead-g3n</guid>
      <description>&lt;p&gt;Passing through the &lt;a href="https://play.picoctf.org/practice/challenge/" rel="noopener noreferrer"&gt;picoCTF&lt;/a&gt; web challenges, the chosen challenge is called "GET aHEAD", which means that's something about requests of a web page, maybe a GET request, or something in the Header parameters response.&lt;/p&gt;

&lt;p&gt;First, let's look at the page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjfsnozo8dxywc2f71yj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjjfsnozo8dxywc2f71yj.png" alt=" " width="800" height="104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A simple page that changes the background of the page.&lt;br&gt;
If the user selects Red, the page background-color changes to red. &lt;br&gt;
If the user selects Blue, the page background-color changes to blue.&lt;/p&gt;

&lt;p&gt;First let's check the requisition on the &lt;a href="//postman.com/"&gt;Postman&lt;/a&gt;, maybe I can find something useful there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cwj8ze66roffml2slvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cwj8ze66roffml2slvl.png" alt=" " width="800" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First I did a GET Request, but nothing useful came in the header response. Playing a little with the options, I found the request for HEAD, and then tried to send a standard request:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh3t6n0px5dfesarb8kt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxh3t6n0px5dfesarb8kt.png" alt=" " width="368" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With only that change, the response headers have the final CTF flag :&lt;/p&gt;

&lt;p&gt;
  Answer:Flag
  &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o968pelbqbpuit8gt6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4o968pelbqbpuit8gt6l.png" alt=" " width="800" height="130"&gt;&lt;/a&gt;&lt;br&gt;
Flag : picoCTF{r3j3ct_th3_du4l1ty_70bc61c4}&lt;br&gt;


&lt;/p&gt;

&lt;p&gt;That was a simple flag, to make the user learn that not only exists the GET and POST Request Methods.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>[Hack] PicoCTF: Warmed Up</title>
      <dc:creator>Falme Streamless</dc:creator>
      <pubDate>Mon, 17 Jul 2023 09:00:00 +0000</pubDate>
      <link>https://dev.to/falme/hack-picoctf-warmed-up-4jpk</link>
      <guid>https://dev.to/falme/hack-picoctf-warmed-up-4jpk</guid>
      <description>&lt;p&gt;I'm starting to tackle the challenges of PicoCTF, a website/platform to test/challenge myself on Capture the Flag puzzles, learning the basics of cybersecurity and maybe make it useful for game development, web development and life in general.&lt;/p&gt;

&lt;p&gt;So the first ones are very basic, the objective is to learn along, and for that, I'll be starting with the Playlists.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8pnii00akhsfz6t6my2h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8pnii00akhsfz6t6my2h.png" alt=" " width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As it says in the webpage : "Playlists are collections of challenges, sometimes with readings or games, that are curated to help students learn a particular topic."&lt;/p&gt;

&lt;p&gt;And I'll start with Low Level Binary Intro, that can be helpful with my current job (Game Development).&lt;/p&gt;

&lt;p&gt;The first one is actually a game and a sanity check called "Obedient Cat"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fylmbuj3wvymgohqlkt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fylmbuj3wvymgohqlkt.png" alt=" " width="565" height="244"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sanity Check is a simple test to check if everything is happening as expected on the basic level. In this case, I just need to download the flag in a file and read the content inside. There's a flag for this one.&lt;/p&gt;

&lt;p&gt;After the sanity check, we reach the main challenge of this post, called "Warmed Up". &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hw97p4xedw64e08zg3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hw97p4xedw64e08zg3w.png" alt=" " width="481" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This challenge is really easy, just using the DuckDuckGo web search as "0x3D in decimal" should give us the answer. But I know that I'll need to use python in this playlist. So, I'll go further and create a Hexadecimal to Decimal converter in python.&lt;/p&gt;

&lt;p&gt;I currently have &lt;code&gt;Python 3.10.8&lt;/code&gt; version. So let's begin.&lt;/p&gt;

&lt;p&gt;The idea is to make a Hex string and each char value multiply by 16.&lt;/p&gt;

&lt;p&gt;For example: 0xA9D = A*16*16 + 9*16 + D&lt;br&gt;
That's the same as = 10*(16^2) + 9*(16^1) + 13*(16^0) = 2717&lt;/p&gt;

&lt;p&gt;So first, I'll make a method to convert the single Hex char to a decimal number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#List/Dictionary of numbers above 9
#To be called from a loop
&lt;/span&gt;&lt;span class="n"&gt;associationList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;A&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;B&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;C&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;D&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;E&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;F&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ToDecimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hexChar&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="c1"&gt;#First try the string/char range of numbers
&lt;/span&gt;    &lt;span class="c1"&gt;#If there's a match of the key, return value
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;associationList&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;hexChar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c1"&gt;#Try to return a valid number, if not, return -1
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hexChar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Method ToDecimal(char) will make my value 'F' to be converted to 15, but also make my value '6' to be converted to 6 (as an integer)&lt;/p&gt;

&lt;p&gt;Now I need to create a method that get the Hex value inputted from the user and convert it to decimal values and sum them.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;HexToDec&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="c1"&gt;#Total Sum after calculations
&lt;/span&gt;    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="c1"&gt;#Try to parse the user input, if cannot, show error
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;#Go through all input chars backwards
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])):&lt;/span&gt;

            &lt;span class="c1"&gt;#Multiply the respective position Hexadecimal
&lt;/span&gt;            &lt;span class="c1"&gt;#To the decimal value
&lt;/span&gt;            &lt;span class="n"&gt;multiplier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ToDecimal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;pow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;#Sum/Add to the final result
&lt;/span&gt;            &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;multiplier&lt;/span&gt;

        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Not valid arguments or missing argument&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nc"&gt;HexToDec&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this code, I can pass the Hexadecimal value through the parameters calling something like : &lt;code&gt;python HexToDec.py 2e87&lt;/code&gt; and it will return me 11911.&lt;/p&gt;

&lt;p&gt;But after making many things that does not solve the original problem, let's go back and solve it:&lt;/p&gt;

&lt;p&gt;I need to know the value of 0x3D in Decimal, and putting it in the python code it returns me...&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; 61&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;So I just need to append the 61 to the format of CTF Flag &lt;code&gt;picoCTF{61}&lt;/code&gt; and:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpiogpxcg2h84n2xdqckm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpiogpxcg2h84n2xdqckm.png" alt=" " width="360" height="41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And that's it, a very super complicated solution to a simple problem.&lt;/p&gt;

&lt;p&gt;Here's the final &lt;a href="https://github.com/Falme-SideProjects/python-hex-to-dec/blob/main/HexToDec.py" rel="noopener noreferrer"&gt;Python File&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cybersecurity</category>
    </item>
  </channel>
</rss>
