elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  ¿Cuál es la mejor forma de usar NASM?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Cuál es la mejor forma de usar NASM?  (Leído 3,709 veces)
Developer Diego

Desconectado Desconectado

Mensajes: 19



Ver Perfil
¿Cuál es la mejor forma de usar NASM?
« en: 29 Octubre 2014, 03:38 am »

Estoy aprendiendo ensamblador con NASM (Netwide Assembler) bajo Linux, tengo como herramientas los compiladores gcc, g++ también el enlazador ld que es usado de manera interna por estos compiladores, también para hacer ingeniería inversa o disassembly utilizo bokken y objdump para leer las extensiones .o, .out.

Si se pudiese dar una explicación más exhaustiva de ¿Cuál es la mejor forma de usarlo?

Un ejemplo mediante la arquitectura IA-32 para hacer operaciones como de lectura y escritura se tienen dos alternativas:

  • System calls de linux.
  • Usar las funciones externas de C como printf, scanf.

Usando las system calls o llamadas del sistema sería:

Código
  1. section .data
  2.    msg: db "Coding in asm", 10, 0 ;define a string
  3.    smsg: equ msg                       ;length of msg
  4.  
  5. section .text
  6.   global _start:
  7.  
  8.   ;define a macro for print
  9.   %macro print 2
  10.        mov eax, 4       ;call to the O.S. for write
  11.        mov ebx, 1       ;file descriptor
  12.        mov ecx, %1    ;put the msg
  13.        mov edx, %2    ;put the length of msg
  14.        int 80h            ; generate one interruption
  15.  
  16.        mov eax, 1       ;call to the system out
  17.        mov ebx, 0       ;pass one parameter
  18.        int 80h
  19.   %endmacro
  20.  
  21.    _global:
  22.         print msg, smsg

Para generar el código objeto y ejecutarlo se usa los sisguientes comandos
nasm -f elf msg.asm
ld -m elf_i386 -s -o msg msg.o
./msg

Usando las funciones externas de C

Código
  1. section .data
  2.    msg: db "Coding in asm", 10, 0 ;define a string
  3.  
  4. section .text
  5.    extern printf ;include the printf function in asm program
  6.    global main
  7.  
  8.    main:
  9.        push ebp        
  10.        mov ebp, esp   ;pass the reference of reg esp to ebp
  11.        push msg
  12.        call printf        ;print the current element in the stack
  13.        mov esp, ebp
  14.        pop ebp          ;free the stack
  15.        ret

« Última modificación: 7 Noviembre 2014, 22:53 pm por .:UND3R:. » En línea

-- The code is life --
Diego De Santiago Ruiz.
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: ¿Cuál es la mejor forma de usar NASM?
« Respuesta #1 en: 29 Octubre 2014, 03:51 am »

cuando publiques código, procura usar las etiquetas GeSHi o por lo menos code, lo hace más legible (aquí está con etiqueta ASM)


Código
  1. section .data
  2.    msg: db "Coding in asm", 10, 0 ;define a string
  3.    smsg: equ msg                       ;length of msg
  4.  
  5. section .text
  6.   global _start:
  7.  
  8.   ;define a macro for print
  9.   %macro print 2
  10.        mov eax, 4       ;call to the O.S. for write
  11.        mov ebx, 1       ;file descriptor
  12.        mov ecx, %1    ;put the msg
  13.        mov edx, %2    ;put the length of msg
  14.        int 80h            ; generate one interruption
  15.  
  16.        mov eax, 1       ;call to the system out
  17.        mov ebx, 0       ;pass one parameter
  18.        int 80h
  19.   %endmacro
  20.  
  21.    _global:
  22.         print msg, smsg
  23.  
Código
  1. section .data
  2.    msg: db "Coding in asm", 10, 0 ;define a string
  3.  
  4. section .text
  5.    extern printf ;include the printf function in asm program
  6.    global main
  7.  
  8.    main:
  9.        push ebp        
  10.        mov ebp, esp   ;pass the reference of reg esp to ebp
  11.        push msg
  12.        call printf        ;print the current element in the stack
  13.        mov esp, ebp
  14.        pop ebp          ;free the stack
  15.        ret
  16.  
« Última modificación: 29 Octubre 2014, 03:52 am por engel lex » En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: ¿Cuál es la mejor forma de usar NASM?
« Respuesta #2 en: 7 Noviembre 2014, 15:27 pm »

Citar
System calls de linux.
Usar las funciones externas de C como printf, scanf.


El resultado final es el mismo siempre.

Si usas syscalls de linux tendras que llamar a un par de syscalls extra seguramente y pasar mas de un parametro extra tambien. Los syscalls llamaran a los drivers  hecho, pasa lo que tiene que pasar.

Si usas las funciones de la libreria de C standard, lo que pasará es que primero tendras que llamar menos funciones y pasar menos parametros. La libreria de C se encargará de hacer los syscalls y los syscalls llamar a los drivers.
Si cierto, tienes mas codigo que se ejecuta, pero tendrias menos lineas de codigo y seguramente un par de chequeos extra.

Yo si tengro que programar lo hago en windows si, pero al final termino usando las libreria de C standart para rutinas de i/o. Menos tedioso.
Si hay que tener que tener controlado el tema de la convencion de llamadas. C utiliza cdesl y luego  syscalls de linux usan fastcall?  Es decir si mal no recuerdo algunos parametros se pasan en registros.

Pudes tranquilamente depurar los rutinas llamadas por c runtime y fijarte que syscalls termina haciendo.

Saludos
« Última modificación: 7 Noviembre 2014, 15:33 pm por _Enko » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
php vs mysql, ¿cual es la mejor forma de cifrar contraseñas? « 1 2 »
PHP
twoz 11 13,108 Último mensaje 26 Diciembre 2009, 20:18 pm
por [u]nsigned
[pregunta]cual es la mejor forma de hacer un uploader en vbs
Scripting
daryo 2 2,434 Último mensaje 30 Abril 2014, 02:09 am
por daryo
Mac OS X y Windows en el mismo ordenador, ¿cuál es la mejor forma?
Noticias
wolfbcn 0 1,700 Último mensaje 8 Octubre 2014, 21:39 pm
por wolfbcn
¿Cual es la mejor forma de montar u sistema RAID?
Windows
erniker 9 4,660 Último mensaje 23 Enero 2017, 16:37 pm
por Randomize
[C++][?] ¿Cuál es la mejor forma de afianzar los conocimientos de C++?
Programación C/C++
hllsfn 8 4,323 Último mensaje 1 Febrero 2017, 20:47 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines