Ir para conteúdo
Faça parte da equipe! (2024) ×

[ÓllyDBG] Engenharia Reversa v1


Surfistinha£
 Compartilhar

Posts Recomendados

Bom o download do aplicativo está no seguinte link :

É necessário se cadastrar para acessar o conteúdo.

Scan do aplicativo :

É necessário se cadastrar para acessar o conteúdo.

 

-------------------------------------------------------------------------------------------------------------------

Bom nesse tutorial vamos forçar nosso aplicativo a mostrar a mensagem "Numero correto" mesmo que o numero da váriavel (B) seja diferente do numero digitado no Edit.

 

O Dissasembly/Debugger que usarei nesse tutorial se chama "Ollydbg", é bem famoso ele por isso googleie e faça o download dele.

 

1º Vamos observar como o aplicativo responde quando digitarmos alguma coisa no campo

e clicamos no botão "Verificar".

 

imagem1kv.png

 

2ºBom vimos que apareceu essa indesejavel mensagem, precisamos modificar nosso programa de maneira que ele mostre a mensagem "Numero correto" mesmo que o numero da váriavel (B) seja diferente da váriavel (A), então, abra o ollydbg, na parte superior esquerda do olly vá no menu File e depois clique em Open, ou simplesmente precione a tecla (F3), logo após, selecione o nosso aplicativo(Surfista_olly_v1.exe), ao abrir você vera muitas linhas(muitas mesmo), mas não se assuste com isso, isso são códigos assembly :

 

imagem2d.png

 

3ºBom para chegarmos no endereço da memória que devemos procurar precisamos ter um ponto de referência, ou seja, vamos procurar pela frase que aparece quando digitamos o número errado, ou seja, "Numero incorreto".

 

Clico botão direito no meio do programa, vá em Search For > All Referenced text strings

 

Abrira uma tela como essa :

 

imagem3pq.png

 

Viu ? Ali encima :

 

É necessário se cadastrar para acessar o conteúdo.

 

Bom o motivo de ter 2 frases iguais eu vou explicar no meio do tutorial, vamos ver uma coisa

 

É necessário se cadastrar para acessar o conteúdo.

 

Bom achamos a mensagem que procuramos, apareceu 2 frases iguais, porque eu coloquei assim ? Uma frase é o título da MessageBox e a outra é o Texto da MessageBox, os endereços são 004501FE e 00450103, é bom anota-los no bloco de notas, bom de um clique-duplo encima de :

É necessário se cadastrar para acessar o conteúdo.

 

Você vai ser levado para essa parte do código :

 

imagem5e.png

 

Bom primeiro quero que prestem atenção naquela parte da esquerda que eu coloquei um retangulo vermelho encima , aquele conjunto é a ação ocorrida quando apertamos o botão "Verificar" ... voltando ao assunto vamos dar de cara com essa parte do código, vamos observar essa parte :

É necessário se cadastrar para acessar o conteúdo.

 

Bom quando eu fiz a função de exibir a MessageBox coloquei assim :

 

MessageBoxA(handle, 'Numero incorreto.', 'Numero incorreto', 0);

 

a parte handle significa no programa essa parte : 00450208 | 8BC3 | MOV EAX,EBX

a parte 'Numero incorreto' : 00450103 | .68 48024500 | PUSH Project1.00450248 | ASCII "Numero incorreto."

a outra parte do numero incorreto : 004501FE | .68 48024500 | USH Project1.00450248 | ASCII "Numero incorreto."

E o 0 é o : 004501FC | . 6A 00 | PUSH 0 | ..

 

No assembly as coisas meio que ficam ao-contrarias acostume-se

 

Bom agora vamos ao que interessa, dando apenas um click no "004501FC | . 6A 00 | PUSH 0 |" na parte de abaixo vai aparecer isso :

 

imagemgc.png

 

Olhando melhor notamos ali cercado de vermelho : Jump from 004501DF .. bom isso significa que o endereço que contém o PUSH 0(endereço 004501FC) ... é uma referência de pulo do endereço 004501DF, ou seja, exite alguma função no endereço 004501DF que faz pular para o endereço 004501FC e começar a montar a MessageBox que não queremos ver ...

 

Aperte CTRL+G e procure por 004501DF você vai parar em outra parte do código procure por esse lugar onde está escrito esses códigos :

É necessário se cadastrar para acessar o conteúdo.

 

Bom você ainda nao deve ter entendido nada mas apartir de agora vai entender algo...

 

Bom esses EDX, EAX vamos colocar na nossa mente que eles são váriaveis, se vc leu o começo do tópico e leu sobre as váriaveis do programa voce pode continuar ...

Vamos colocar na nossa cabeça que oque digitarmos no Edit ele vai para a váriavel A, e nessa parte do código o valor da váriavel A vai para a váriavel EDX.

 

Entendo melhor vamos ver assim :

 

004501D8 | MOV EDX,415FCE9

O 004501D8 é o endereço.

 

 

MOV EDX,415FC89

é o seguinte, o comando MOV ele move algum valor para alguma váriavel, neste caso ele vai mover (MOV) o valor encontrado no endereço 415FC89 para a váriavel EDX ... vamos entender assim

 

MOV variavel,valor(pode ser o endereço ou um valor em hexadecimal) que queremos mandar para a variavel.

 

Espero que tenham entendido então vamos continuar ...

 

004501DD | CMP EDX,EAX

 

CMP = Comparação, esse endereço ele faz uma comparação, compara o valor EAX com o EDX, na verdade eu acho que ele faz o seguinte, ele faz EDX-EAX .

 

bom é +/- assim essa parte vamos continuar, a ultima linha q vamos ver é a :

 

004501DF | JNZ SHORT Project1.004501FC

 

Essa é uma das linhas principais que devemos estudar.

 

esse JNZ significa algo parecido com Jump if not is Zero , JNZ tb significa JNE(jump if not equal) ... oq essa sigla poderosa faz , ele é uma continuação da linha anterior, a CMP, na subtração q eu falei no endereço 004501DD, se o resuldado da 0 (só dara 0 se o codigo digitado bate com o codigo real do programa) ele ignora a linha da JNZ, se nao der 0, se eu n me engano ele coloca uma tal de Zero Flag(algo assim), e a linha JNZ entende assim:

 

Bom endereço 004501DD tudo bem com você, qual foi o resultado de sua subtração ?

CMP fala : Bom deu um numero ae que não é igual a zero, a minha parte acabou agora é a sua JNZ.

 

Então JNZ calcula, como o valor nao é 0 ele pula para o endereço Project.004501FC( ou endereço 0045010FC)

 

Endereço 004501FC = 004501FC | . 6A 00 | PUSH 0 |

 

É o começo da MessageBox do numero incorreto.

 

Então temos 3 maneiras de burlar o sistema.

 

 

no endereço 004501DD está CMP EDX,EAX ... em vez de ele subtrair EAX do EDX vamo fazer o seguinte, vamos subtrair o EDX do EDX, é meio estranho mas da certo porque, se ele subtrair ele mesmo concerteza vai dar Zero.

 

Então vamos a prática.

 

De um simples clique sobre o endereço 004501DD e aperte a tecla Espaço/Space

 

abrira uma caixa escrito CMP EDX,EAX

 

mude de CMP EDX,EAX para CMP EDX,EDX depois feche a janelinha.

 

depois no meio da tela clique botão direito e vá em Copy to executable > All modifications

 

abrira outra janela aperte o botão Copy All e abrira outra janela DENOVO ! clique botao direito no meio dela e vá em Save File de um nome ao seu executavel editado e salve, faça um teste agora digite qualquer numero que vai dar certo.

 

2ºMétodo.

 

No 1º Metodo vimos a parada do CMP .. agora vamos ver o redirecionamento da JNZ se o resultado for 0.

 

Vamos voltar ao endereço 004501DF

 

004501DF | JNZ SHORT Project1.004501FC

 

Veja no final que á um redirecionamento se nao der 0(no caso redireciona para o endereço 004501FC).

 

Bom a minha idéia é, bom aqui ele redireciona ao endereço que começa a message box de numero incorreto, ótimo, vou fazer redirecionar para a messagebox do numero correto !

 

Vamos achar onde começa a MessageBox do numero correto, primeiro vamos fazer como que começa a do numero incorreto :

 

É necessário se cadastrar para acessar o conteúdo.

 

Blz ele começa com um Push 0 e nas linhas 2 e 3 com as mensagens de titulo e corpo e em 4 um MOV EAX,EBX vamo procurar com isso mas em vez de ASCII "Numero incorreto." procuraremos por "Numero correto.".

 

Ele está um pouco acima das 4 linhas da do numero incorreto.

 

É necessário se cadastrar para acessar o conteúdo.

 

Bom achamos oque queriamos note que na linha do JNZ é redirecionado para o endereço 004501FC, clique no endereço aperte Espaço/Space

 

Mude de JNZ SHORT 004501FC para JNZ SHORT 004501E1, clique em Assemble e de Cancel, no meio da tela botao direito Copy to executable>All modifications e clique em Copy All, abrira outra janela botao direito no meio dela e clique em Save File , de o nome e pronto, teste o programa, coloque qualquer numero, WUAALAAAAA conseguimos novamente.

 

3ºMétodo

 

Esse é simples mas eu ainda nao sei explicar

 

Você troca a sigla JNZ por uma JZ de assemble , os procedimentos para salvar, etc, vai funcionar.

 

 

 

Créditos

 

Surf (EU)

 

Bom é isso galera esper ter ajudado qualquer dúvida só falar !

Link para o comentário
Compartilhar em outros sites

  • 2 semanas atrás...

vai em Downloads de drivers NVIDIA

Escolha a opção "Drives para Gráficos".

Instale o software que o seu navegador te notificar.

Ele fara um scan e ira mostrar qual o melhor driver compativel com o seu sistema e a sua placa.

 

Se não resolver, vá no google e digite: Omega Drivers

 

Escolha Nvidia e procure um driver que seja compativel com a sua placa.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas atrás...

Não li todo más você está no caminho de ASM.

 

Não sei seu potencial,ou seu conhecimento atual,más suas ideias estão fora do padrão correto de assembler.

 

JNZ é um salto condicional.

EAX é um mennemonico que declara valor igual a zero.

EDX é um acumulador de alto valor.

 

E depois que você localiza o texto,é mais simples,procurar pelas referencias.

Vamos entender assim :

 

Vai no mapa da memória,onde mostra as sections(tabelas),analisadas pelo processador.

Depois vamos procurar o texto que no seu caso,é " Numero incorreto. "

 

Depois de localizar vamos procurar pelas as referencias, logo apos seremos mandados pra a windows das variaveis de referencias.

Iremos localizar o código da função,e de acordo com a função fazer a modificação.

 

No caso da tua função é simples,ele declara que o valor de EDX é igual há 415FCE9.

Ou seja,move o valor pra EDX,que acumula,na função.

Depois faz a comparação se EDX é igual a 0,ou seja compara com EAX.

 

Se a comparação,for positiva ele dá um salto condicional(condição dada pelo CMP),pra a mensagem box do texto de numero incorreto.

 

Uma maneira bem simples,tenham em mente,é subistituir os saltos condicionais,por saltos incondicionais (JMP) pra a rotina da STACK que fará o programa rodar.

Ou obter o resultado desejado.

 

Vou começar a postar aqui,mais sobre assembler,trazer uma boas funções e exercicios.

 

[ADM]Hero.

Link para o comentário
Compartilhar em outros sites

Este tópico está impedido de receber novos posts.
 Compartilhar

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...

Informação Importante

Nós fazemos uso de cookies no seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies , caso contrário, vamos supor que você está bem para continuar.