Foi obtido um arquivo binário executável que, após sua execução, mostra um texto com um código numérico. Este código é gerado a partir de uma string de texto armazenada no próprio binário. Depois de listar o código asm, o arquivo binário foi excluído e não é possível acessá-lo, apenas o código asm copiado no final do exercício.
É Necessário ser capaz de reutilizar o referido algoritmo de geração de código, e é por isso que o trabalho de engenharia reversa é necessário para analisar o binário e reconstruir o código fonte de tal maneira que ele possa ser modificado e recompilado corretamente.
Pretendemos que:
divida o código em blocos básicos.
(Leve em conta as quebras existentes dentro da função e divida as linhas em blocos básicos de código.)
Faça o diagrama de fluxo com os blocos básicos.
(Uma vez que os blocos básicos do exercício anterior tenham sido obtidos, execute o fluxograma juntando os blocos básicos com setas.)
Existe alguma estrutura de controle?
Indica quais blocos básicos estão envolvidos.
Converta o código completo da função para o código C.
Com o que você aprendeu sobre a reconstrução de código, converta essa função main () em código C. Em <+36> o endereço da string indicada em negrito é carregado em eax.
"3jd9cjfk98hnd"
Em <+110> o endereço da string indicada em vermelho é carregado em eax "[+] Código gerado:% i \ n"
Compile o código gerado e indique o código resultante após sua execução.
Compile em 32bits adicionando a opção -m32 como indicado no seguinte comando: $ gcc source.c -o source -m32 Uma vez executado, um texto aparecerá na tela, indicando o texto completo.
Modifique o código fonte em C, para que ele gere um novo código a partir de outra string.
Modifique a string <+36> no código C, pela seguinte string: "Parabéns!" Compile o código C, execute e indique o texto completo obtido.
Código asm – x86 32 bits
dump of assembler code for function main:
0x0000054d <+0>: lea ecx,[esp+0x4]
0x00000551 <+4>: and esp,0xfffffff0
0x00000554 <+7>: push dword ptr [ecx-0x4]
0x00000557 <+10>: push ebp
0x00000558 <+11>: mov ebp,esp
0x0000055a <+13>: push ebx
0x0000055b <+14>: push ecx
0x0000055c <+15>: sub esp,0x10
0x0000055f <+18>: call 0x450 <
__x86.Get_pc_thunk.bx>
0x00000564 <+23>: add ebx,0x1a9c
0x0000056a <+29>: mov dword ptr [ebp-0x10],0x0
0x00000571 <+36>: lea eax,[ebx-0x19a0] ; “3jd9cjfk98hnd”
0x00000577 <+42>: mov dword ptr [ebp-0x14],eax
0x0000057a <+45>: sub esp,0xc
0x0000057d <+48>: push dword ptr [ebp-0x14]
0x00000580 <+51>: call 0x3e0 <strlen@plt>
0x00000585 <+56>: add esp,0x10
0x00000588 <+59>: mov dword ptr [ebp-0x18],eax
0x0000058b <+62>: mov dword ptr [ebp-0xc],0x0
0x00000592 <+69>: jmp 0x5ad <main+96>
0x00000594 <+71>: mov edx,dword ptr [ebp-0xc]
0x00000597 <+74>: mov eax,dword ptr [ebp-0x14]
0x0000059a <+77>: add eax,edx
0x0000059c <+79>: movzx eax,byte ptr [eax]
0x0000059f <+82>: movsx eax,al
0x000005a2 <+85>: imul eax,dword ptr [ebp-0x18]
0x000005a6 <+89>: add dword ptr [ebp-0x10],eax
0x000005a9 <+92>: add dword ptr [ebp-0xc],0x1
0x000005ad <+96>: mov eax,dword ptr [ebp-0xc]
0x000005b0 <+99>: cmp eax,dword ptr [ebp-0x18]
0x000005b3 <+102>: jl 0x594 <main+71>
0x000005b5 <+104>: sub esp,0x8
0x000005b8 <+107>: push dword ptr [ebp-0x10]
0x000005bb <+110>: lea eax,[ebx-0x1992] ; “[+] codigo generado: %i\n”
0x000005c1 <+116>: push eax
0x000005c2 <+117>: call 0x3d0 <printf@plt>
0x000005c7 <+122>: add esp,0x10
0x000005ca <+125>: mov eax,0x0
0x000005cf <+130>: lea esp,[ebp-0x8]
0x000005d2 <+133>: pop ecx
0x000005d3 <+134>: pop ebx
0x000005d4 <+135>: pop ebp
0x000005d5 <+136>: lea esp,[ecx-0x4]
0x000005d8 <+139>: ret
end of assembler dump.
Delivery term: Not specified