Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Debci en 2 Abril 2010, 12:19 pm



Título: Mi segundo programa en ASM
Publicado por: Debci en 2 Abril 2010, 12:19 pm
Hola a todos, esta vez he querido leer un caracter de stdin pero hay segmentation fault, es porque alamaceno lo leido en esi y no soy capaz de derteminar la length de este para darselo al sys_write, es basicamente un programa de echo:

Código
  1. section .text
  2.   global _start ;parida que necesita el linker xD
  3.  
  4. _start: ;entry point
  5.        pop ebx
  6.        pop ebx
  7.        pop ebx
  8.        pop ebx
  9.        mov eax,5
  10.        add     ebx,ecx
  11. mov edx,len ;Longitud del mensaje
  12. mov ecx,msg ;Mensaje que vamos a escribir
  13. mov ebx,1 ;file descriptor (stdout)
  14. mov eax,4 ;llama de sistema numero 4 (sys_write)
  15. int 80h ;call al kernel para que ejecute las sentencias
  16.        pushad ;Guardamos registros
  17.        pushfd ;Guardamos flags
  18.        mov     eax, 3 ;sys_read(3)
  19.        mov     ebx, 0 ;stdin (0)
  20.        mov     ecx, esi ;Guardamos la string en esi
  21.        mov     edx, 1 ;nnumero de bytes a leer
  22.        int     80h ;llamada al kernel de linux
  23.        popfd ;re-establecemos flags
  24.        popad ;re-establecemos registros
  25.        ret ;retorno para llamar al procedimiento
  26.  
  27.        mov edx,length2 ;longitud del mensaje
  28. mov ecx,esi ;mensaje a escribir
  29.        mov ebx,1 ;file descriptor (stdout)
  30.        mov eax,4 ;llamada a sistema numero 4 (sys_write)
  31. int 80h ;linux esta aqui!
  32.        mov     eax,1 ;llamada a sistema numero 1 (sys_exit)
  33. int 80h ;llamada al kernel, linux acabará con la ejecución del proceso
  34.  
  35.  
  36.  
  37. section .data
  38.  
  39. msg db 'Hola mundo!',10 ;la primera cadena
  40. mensaje2 db 'a',10
  41. len equ $ - msg ;longitud de nuestra cadena
  42. length2 equ  $ - mensaje2
  43.  


Saludos


Título: Re: Mi segundo programa en ASM
Publicado por: bizco en 3 Julio 2010, 17:41 pm
Citar
popfd ;re-establecemos flags
        popad ;re-establecemos registros
        ret ;retorno para llamar al procedimiento


no tengo experiencia en asm en linux, pero ¿ese ret? ¿donde va a parar?

otra cosa, en este codigo y en el otro veo que haces mucho pop ¿por alguna razon en concreto?


Título: Re: Mi segundo programa en ASM
Publicado por: Debci en 3 Julio 2010, 17:49 pm
Citar
popfd ;re-establecemos flags
        popad ;re-establecemos registros
        ret ;retorno para llamar al procedimiento


no tengo experiencia en asm en linux, pero ¿ese ret? ¿donde va a parar?

otra cosa, en este codigo y en el otro veo que haces mucho pop ¿por alguna razon en concreto?
Para sacar los argumentos de la pila, el primero es el argc y los otros son respectivamente arg[0] (filename) arg[1](argumento)
Y los voy depositando en ebx, asi de la pila los 3 primeros valores son esos, por tanto el tercer valor de la pila y por tanto el ultimo en estar en EBX es el argumento para trabajar el programa de maner dinamica.

Saludos


Título: Re: Mi segundo programa en ASM
Publicado por: Eternal Idol en 3 Julio 2010, 20:18 pm
Tenes que pasar una direccion de memoria en ecx, ahora estas poniendo el VALOR que haya en esi. ¿Cual es ese valor? Igual depuralo con el gdb asi ves donde esta el problema exactamente ...