jueves, 20 de agosto de 2015

Programación Básica: Conociendo los saltos condicionales e incondicionales en Ensamblador

Saltos Condicionales e Incondicionales
Ya mas de 20 años han pasado, que tuve el gusto de conocer a nuestro gran amigo y bien ponderado ENSAMBLADOR (ASM) en la compañía de excelentes expertos CRACKER´s llamados:  

-- Caos Reptante --
-- SKUATER --

En la época de los inicios de la Ing Reversa (CRACKING) y que tuvimos el gusto   en varios grupos como TNT CRackerś Team - EVC - DBC - KIMERA - CHIck & Cream y muchísimos mas usando el IRC, pero en el IRC de aquellos tiempos en los cuales teniamos  que conectarnos con BLOWFISH todo bien encriptado y para mayor protección se nos asignaba una ip especifica de acceso y un login y password también único por si nos snifeaban el login y password no habría problema ya que si no sabian la IP que deberíamos de usar en la conexión para los menos avispados en esos tiempos de la seguridad no pudieran entrar y en el caso de poder también habia una protección como les decia arriba de BLOWFISH ENCRYPTIION si no tenian la clave exacta para cada uno valieron solo podían ver el texto todo encriptado.  :p



----------------------------------------------------------------------
 Le dejo aquí una imagen del NFO que usabamos en aquellos tiempos y para los que no saben por que se ponen las rayitas vean lo siguiente, al ser puro Texto en los NFOs ASCII y no contar con rich text se tenia que dividir con rayas cada apartado y con eso lograbas menos espacio y diferenciar todo bien  en el NFO.

En si facebook usa la misma tonalidad y funcionalidad de no poder usar rich text pues ahi esta el detalle..

---> digo para que sepan:

LINK DEL NFO:   https://defacto2.net/file/view/ad2928
--------------------------------------------------------------------




Como les decia ahí fue donde conocí el famoso y bien ponderado ASM  dejenme decirles que no me ha defraudado en cuanto a su uso, fiabilidad y rapidez a la hora de trabajar y así seguirá esta relación viento en popa y en siguientes lineas verán por que.


 INTRODUCCIÓN A ENSAMBLADOR Y SUS SALTOS CONDICIONALES

Como sabemos amigos este lenguaje llamado en ingles ASSEMBLER   y que todos lo abreviamos como ASM que es un lenguaje de bajo nivel y al ser creado contiene código máquina osea es ejecutado directamente en el microprocesador del cual su funcionamiento lógico seria el siguiente:

1.-  El programa lee el archivo hecho en ASM
2.-  El microprocesador sustituye cada uno de los códigos escritos por los nemónicos que se usan en sistema binario basados en la tecnología usada o elegida.

Amigos existen varios puntos a tomar en cuenta en cuanto a las características de ASM y algunas serian:

  • Por sus caracteristicas ASM es difícilmente portable.
Al decir esto significa que cuando nosotros programamos en un lenguaje de alto nivel normalmente debe de ser modificado para poderlo ejecutar en otro sistema con otro tipo de procesador y si cambias de arquitectura el 90% de los casos es necesario reescribirlo ASM no.

  • Su enorme velocidad de un programa cuando lo ejecutas y su menor consumo de memoria RAM y en algunos casos la ROM
  • Su menor espacio en disco duro.
  • Su mejor control en todas sus tareas al poder llamar directamente a las interrupciones.

Recordando que tenemos dos tipos principales de ASM que son:

ENSAMBLADORES BASICOS

ENSAMBLADORES MODULARES

Pero bueno dejemos la historia básica de ASM  ya que esto lo podrían leer en muchísimas paginas en Internet y pasemos a conocer los saltos condicionales que son usados en Asm y pondremos algunos ejemplos de su uso.


SALTOS CONDICIONALES Y SU USO EN LA PROGRAMACIÓN EN ASM


Un salto condicional en la lógica de programación lleva a cabo un cambio en la ejecución del programa con la cual pasamos a otra nueva posición o subrutina de código.
 ---ejemplo----
goto

Ejemplo:

parriba:  // auqi declaramos la etiqueta
 ...
 // salto directo a una etiqueta
 if (error) goto pabajo;
 ...
 if (repetir) goto parriba;

pabajo:  // declaración de etiqueta
----------------------------------------------
 
GOTO EJEMPLO EN C
 
#include <stdio.h>

int main()
{
etiqueta: //La etiqueta
printf("Uso del GOTO");
goto etiqueta;
} 
 --- fin ejemplo

Y así en muchos lenguajes de programación podremos encontrar el goto pero lo que nos interesa es como se identifica un salto INCONDICIONAL en ASM es muy simple, el MNEMONICO es JMP donde su valor hexadecimal de este  es EB.

un ejemplo de este alto condicional de un código desensamblado seria:

:004012B5 FF25C0C24F13   mov eax,01
:004012B8 FF25C0C24F00   Jmp 004FC2C0


donde con la instrucción MOV  movemos o colocamos el valor de 1 en el registro EAX  e inmediatamente saltamos incondicionalmente a la instrucción 004FC2C0.

---------------------
SALTOS CONDICIONALES
-----------------------------------

Estos si son realmente interesantes ya que con ellos podemos cambiar el flujo del programa basados en alguna comparación de valores hecha, es como lo que se usa en los programas SHAREWARE que para ser registrados comparan el no. de serie introducido con con el no. de serie valido y entonces deciden por medio de un salto condicional si esta registrado  o no.

y existen varios saltos condicionales tales como:



una verificación de un registro con salto condicional de un programa seria algo como esto:


donde insertamos un número de serie cualquiera y el programa internamente verificará si es valido o no con el siguiente código:

-------------------------------------------------------------------
00412244  |.  50                    PUSH EAX                                       ; /Arg2
00412245  |.  51                    PUSH ECX                                       ; |Arg1
00412246  |.  E8 B5F9FFFF           CALL dvdrippe.00411C00                         ; \dvdrippe.00411C00
0041224B  |.  83C4 08               ADD ESP,8
0041224E  |.  85C0                  TEST EAX,EAX
00412250      75 1A                 JNZ SHORT dvdrippe.0041226C

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

donde:

---> PUSH EAX en la dirección de memoria 412244 mete el Arg2 dentro del registro de memoria EAX temporalmente.



---> 
PUSH ECX en la dirección de memoria 412244 mete el Arg1 dentro del registro de memoria ECX temporalmente.

----> En la dirección de memoria 412246  CALL dvdrippe.00411C00   ejecuta el código que esta en la dirección de memoria y después regresa al flujo normal del programa.
---> 
0041224B  |.  83C4 08               ADD ESP,8    

donde esta instrucción Suma los dos operandos y guarda el resultado en el operando destino. 


 0041224E  |.  85C0                  TEST EAX,EAX

donde  esta instrucción realiza una conjunción, bit por bit de todos los valores pero recordando que tiene una diferencia con la instrucción AND, que es la de  no colocar el resultado  en el operando destino, solo modifica el valor de las banderas.

osea viendo aquí el código en funcionamiento compara que los valores sean iguales  0,0  - 1,1.

 
JNZ SHORT dvdrippe.0041226C

y aquí la instrucción que nos tiene en este proceso que es un salto condicional  JNZ   Salta si no es cero.

y así amigos podemos hablar y hablar de todos los saltos condicionales que existen en ensamblador y explicarlos uno a uno.   Y LO HAREMOS  PEROOOOO 

EN EL PRÓXIMO LIBRO QUE DES DE HACE MAS DE 5 AÑOS EH VENIDO ESCRIBIENDO Y QUE EN OCTUBRE 2017 SACAREMOS A LA VENTA.

PUEDEN VER EL ÍNDICE DEL LIBRO YA REGISTRADO CON ISBN AQUÍ.

http://ccat.edu.mx/cwhrep+110.html

 y esta es la portada:




 
CONFERENCIAS Y/O TALLERES EN TU UNIVERSIDAD?   contactame 

Li. Rodolfo H. Baz
www.rodolfohbaz.net
www.ccat.edu.mx

 

3 comentarios:

Crowdstrike -> Solución de errores de actualización de CrowdStrike con BitLocker habilitado

En este pequeño articulo ver como componer el problema de CROWDSTRIKE cuando esta habilitado el BITLOCKER, cabe resaltar que puede ser una e...