Hack x Crack - Comunidad de Seguridad informática

Programación => ASM => Mensaje iniciado por: v4char en Enero 07, 2017, 10:59:26 am

Título: Dudas básicas sobre ensamblador
Publicado por: v4char en Enero 07, 2017, 10:59:26 am
Me he puesto a programar en ensamblador y nada más empezar tengo dudas con los compiladores veo que el codigo es distinto para nasm que para fasm y etc...
Luego veo que según el procesador al desensamblar los registros son distintos en 32 bits y 64bits.
Y tambien que en msdos y en linux se programa de forma diferencte.

Si alguien me puede explicar un poco lo basico o recomendarme algun libro sería de mucha ayuda.
Título: Re:Dudas básicas sobre ensamblador
Publicado por: ravenheart en Enero 07, 2017, 11:46:51 am
Los registros del 8086 original eran de 16 bits:
AX, BX, CX, DX, SI, DI, IP, SP, DS, FS. Probablemente me dejo alguno.
AX, BX, CX y DX son de propósito general, aunque CX se utiliza como contador en algunas instrucciones (REPx/LOOP). DX además se utiliza como expansión cuando el resultado de una operación es mayor que los operandos. Por ejemplo, al multiplicar dos números de 16 bits el resultado es de 32 bits, y se guarda en la combinación AX:DX.
SI y DI se utilizan, respectivamente, como origen y destino en ciertas instrucciones. IP es el puntero de instrucción, apunta a la siguiente instrucción que se va a ejecutar. SP es el puntero a la pila, y apunta a la siguiente dirección de memoria que se va a utilizar para almacenar datos en la pila (o podría ser a la última que se ha usado, no estoy seguro, pero creo que no).
DS y FS son registros de segmento. Estos se utilizaban combinados con otros registros en MSDOS para direccionar más de 64 kb en una misma aplicación. Por ejemplo, DI y SI se usaban junto con DS (Data Segment). Esto no tiene mucha relevancia hoy día, aunque en windows se utiliza uno de los registros de segmento (FS, creo) para gestión de errores (el llamado SEH, Structured Error Handling).

Con los 32 bits los registros se extendieron a (sorpresa, sorpresa) 32 bits. Se pueden seguir usando todos los registros pero además hay una versión extendida de 32 bits: EAX, EBX, ESI, ESP...

Y con los 64 bits se ampliaron a 64 bits, solo que ahora se llaman RAX, RBX, RIP...

Además, en los registros de propósito general (los que terminan en X), se puede acceder por separado a los dos bytes menos significativos del registro. AL es el byte menos significativo de AX  y AH el byte más significativo de AX.

Luego están los registros de coma flotante, que van numerados (FP0 a FP7 me parece recordar) y funcionan como una pila (insertas en FP0 y el resto se desplazan, si lo desbordas pierdes datos). Hace mucho que no toco esto y no lo he usado mucho así que igual me estoy confundiendo con algún otro micro.

Por último están las extensiones multimedia, MMX/SSE. Básicamente son muchos registros muy grandes (128 bits, creo que eran 8 registros en 32 bits y 16 en 64) numerados XMM0-7/15. Se utilizan para realizar la misma operación en varios datos pequeños. Por ejemplo, puedes cargar 16 bytes y sumarle 1 a cada uno. No es lo mismo que sumar 0x010101010101010101 al registro, porque el overflow/acarreo queda aislado en cada byte. Tiene operaciones específicas para trabajar con 16 bytes, 8 words (16 bits), 4 dwords (32) y creo que también con 2 qwords (64). Es muy útil para trabajar con vídeo, donde quieres aplicar una operación a cada byte sin que afecte a los bytes adyacentes.

Lo de NASM/MASM o linux/windows es simplemente una convención distinta en la forma de escribir el código. La sintaxis de AT&T (la típica en linux) es más intuitiva pero me parece que se usa bastante menos. Con la sintaxis de intel (la que se usa en windows habitualmente) en la mayoría de instrucciones se especifica primero el destino y luego el origen, y es un poco confuso al principio. Por ejemplo, MOV AX, CX copia el contenido de CX en AX.
Te recomiendo usar la de intel, aunque GCC utiliza la sintaxis de AT&T así que si quieres embeber ASM dentro de C bajo linux tendrás que usar esta última. Aprender las dos es una opción, pero el cambio de orden de los operandos es muy frustrante y es común que provoque errores.

Para mí el cambio más gordo al pasar de 32 a 64 bits, y no lo mencionas, es la convención de llamadas. En 32 bits todos los parámetros de una función se pasan en la pila, en orden inverso a como se declaran en C. Está hecho así para que sea fácil para un humano programar en ensamblador. En 64 bits, sin embargo, se ha optado por una convención de llamada optimizada para compiladores, y hay unas reglas bastante complejas en función del tamaño de los argumentos. Básicamente, se pasan en diferentes registros y lo que no cabe en registros se mete en la pila.

Las instrucciones del 8087 (el coprocesador de coma flotante) no me parecen muy útiles a día de hoy, porque con las SSE puedes hacer lo mismo muchísimo más deprisa (sacrificando un poco de precisión, creo, así que tiene su nicho). Las MMX/SSE son muy interesantes para código de alto rendimiento. Para conversión de enteros a coma flotante y viceversa, SSE es una puta maravilla, porque sin las instrucciones específicas es una operación costosísima.
Título: Re:Dudas básicas sobre ensamblador
Publicado por: v4char en Enero 07, 2017, 12:29:30 pm
Muchas gracias por la respuesta tengo otra duda más, yo hago un programa en asm y luego lo compilo y me devuelve un archivo .o y ese archivo punto .o lo puedo compilar, pero no entiendo muy bien lo que es el archivo punto .o y tambien que me recomiendas para empezar a programar me gustaria por ejemplo ejecutar asm sin sistema operativo, que tendria que saber para hacer eso, lo se estoy muy verde.

Muchas gracias.
Título: Re:Dudas básicas sobre ensamblador
Publicado por: ravenheart en Enero 07, 2017, 01:35:46 pm
Es como en c, el compilador te genera un fichero de código objeto y ese fichero lo vinculas (link) con otros para generar un ejecutable. No recuerdo cuál es el linker que se usa en linux.

Para ejecutar ensamblador sin SO tendrás que cargar tu código en el sector de arranque del disco. Si quieres hacer eso quizá puedas aprender algo del proyecto grub.
Título: Re:Dudas básicas sobre ensamblador
Publicado por: v4char en Enero 07, 2017, 03:35:45 pm
Que diferencia hay de poner?
Código: [Seleccionar]
[section .data]
msg DB 'Hola$'
a poner
Código: [Seleccionar]
msg:    db  "Hola", 0
Título: Re:Dudas básicas sobre ensamblador
Publicado por: Calantra en Enero 07, 2017, 07:33:23 pm
Que diferencia hay de poner?
Código: [Seleccionar]
[section .data]
msg DB 'Hola$'
a poner
Código: [Seleccionar]
msg:    db  "Hola", 0
Creo, que no estoy seguro, que la diferencia está en lo que usas para imprimir la cadena. Con la terminación en 0 delimitas el fin de la cadena como en C por lo que usaras algo así como printf y  con la terminación en $ usaras una interrupción software ,la 21h de microsoft por ejemplo, que usará $ para delimitar el final de la cadena. Si no es así que venga alguien y me corrija.

Un saludo.


Título: Re:Dudas básicas sobre ensamblador
Publicado por: v4char en Enero 07, 2017, 09:54:27 pm
Estoy viendo muchos tutoriales y siempre cambian la sintaxis, yo quiero aprender algo como esto https://gist.github.com/YouriAckx/a52010a05a430496ae11 (https://gist.github.com/YouriAckx/a52010a05a430496ae11) si alguien tiene un link tutorial videos etc... se agradece,
Título: Re:Dudas básicas sobre ensamblador
Publicado por: Sadistski en Enero 09, 2017, 01:20:31 am
http://ricardonarvaja.info/WEB/INTRODUCCION%20AL%20CRACKING%20CON%20OLLYDBG%20DESDE%20CERO/TODO%20EN%20UNO/

eh.... para que entiendas:

los primeros registros eran de 16 bits, que corresponden al procesador 8086... pero luego aparecieron mejores procesadores, pero en vez de hacer NUEVOS registros, AMPLIARON los que YA EXISTIAN.

primeros eran los de 16 bits
luego los de 32 bits
y por ultimo los de 64 bits...

y con respecto a la diferencia entre programas usados para programar, obviamente los programas pueden interpretar el codigo como quieran....

si tienes dudas sobre como programar en ASM en linux usa esto:

gcc nombrearchivo.c -S nombrearchivoASM.c

el -S permite que la salida sea en ASM... debe haber algo parecido en C++... saludos
Título: Re:Dudas básicas sobre ensamblador
Publicado por: Mano2 en Febrero 10, 2017, 10:59:46 am
no sé por qué no puedo ver el código... está escondido?
Título: Re:Dudas básicas sobre ensamblador
Publicado por: ravenheart en Febrero 14, 2017, 03:23:26 pm
y tambien que me recomiendas para empezar a programar me gustaria por ejemplo ejecutar asm sin sistema operativo, que tendria que saber para hacer eso, lo se estoy muy verde.

Me he encontrado con esto, quizá te resulte interesante.
https://tuhdo.github.io/os01/
Título: Re:Dudas básicas sobre ensamblador
Publicado por: mundonuevo en Marzo 25, 2021, 11:50:04 pm
gracias por informacion