Lincoln Arantes Posted September 15, 2019 Posted September 15, 2019 Ola, a todos que gostam de pentear bytes! Fico alegre de ver que estão visualizando meus posts. Hoje trago a vocês o debug de dois programas feitos em duas linguagens diferentes, acompanhe: Um exemplo simples de engenharia reversa. Veja o código no compilador Assembly On line: Para entender melhor, foi criado um executável no Nasm exatamente na syntax Intel: Depois debugamos o arquivo hello no edb debuger. Note que o código é o mesmo, porém nos registradores que possuem textos são colocadas outras informações. como no caso do registrador edx que é observado o hexadecimal 0xe, que significa o número decimal 14. No registrador ecx é colocado um endereço de memória que está associado à mensagem mente binaria que é mostrada na tela do programa. Agora vamos criar um executável na linguagem de programação c e comparar os dois resultados do final do post. Veja o código: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #include <stdio.h> int main (void){ printf("mente binaria"); return 0; } ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Note que o código é bastante simples, para que fique mais fácil de entender. Abaixo, observe o programa rodando normalmente. Agora vamos debugá - lo: Agora observe que o programa nos mostrou os códigos Assembly, note que são diferentes. Podemos concluir que ambos os programas fazem a mesma coisa, porém quando são debugados trazem códigos diferentes, isso ocorre porque eles foram compilados em compiladores diferentes. Portando é possível observar também que quando o programa é feito na linguagem Assembly, o debugue nos mostra códigos mais limpos e fáceis de ser entendidos. Se você gosta de programar, aprenda a programar em Assembly e seja um grande escovador de bytes! Autor: Lincoln César dos Reis Arantes (ADS - Graduado) E-mail: lincolnsetelagoas@yahoo.com.br
Felipe.Silva Posted December 2, 2019 Posted December 2, 2019 Não, eles não fazem a mesma coisa. O código em Assembly é para 32-bit e faz uma chamada para a syscall write do kernel Linux. Já o código em C é compilado para 64-bit e faz uma chamada para a função printf() da libc. Os código são diferentes porque são diferentes. Além disso C é uma linguagem de alto nível, então é de se esperar que haja mais código no executável do que o programador consegue enxergar. C ainda é minimalista, mas experimenta ler o código de outras linguagens de alto nível para ver a diferença absurda. Ah, e só porque o resultado é o mesmo não quer dizer que esteja fazendo a mesma coisa. Vou ilustrar com números: 4 + 5 = 9 18 / 2 = 9 Só porque as duas operações resultam em 9, não quer dizer que façam a mesma coisa. Linguagem de programação é muito mais do que você digita, e mais ainda do que você pode ver no terminal.
Recommended Posts
Archived
This topic is now archived and is closed to further replies.