Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: ny0x en 14 Junio 2009, 06:11 am



Título: [ASM]Syscall no me funciona + fallo de segmentacion
Publicado por: ny0x en 14 Junio 2009, 06:11 am
hola tengo un problema, estoy tratando de aprender algo de las syscalls de linux con asm pero tengo un problema, mi codigo no funciona, el comportamiento es el siguiente.

se supone que pide un texto e imprime su longitud pero sucede:
pide texto, falla de segmentacion
la consola toma lo que tecle y me dice como que si lo hubiera escrito como un comando ejemplo:
si en el programa pongo hola
no me imprime nada y despues la terminal me dice
bash: ola comando no encontrado

mi code es el siguiente

Código
  1. include '/home/nyox/include/linux.inc'
  2. format ELF executable
  3. entry start
  4. segment readable executable
  5.  
  6. start:
  7. mov eax,SYS_READ
  8. mov ebx, STDIN
  9. mov ecx,texto
  10. mov edx,size
  11. int 0x80
  12.  
  13. push texto
  14. call strlen
  15. push eax
  16. push numtexto
  17. call itoa
  18.  
  19. push numtexto
  20. call strlen
  21.  
  22. mov edx,eax
  23. mov eax, SYS_WRITE
  24. mov ebx, STDOUT
  25. mov ecx, numtexto
  26. int 0x80
  27.  
  28.  
  29. mov eax, SYS_EXIT
  30. xor ebx,ebx
  31. int 0x80
  32.  
  33. strlen:
  34. push edi
  35. xor ecx,ecx
  36. mov edi, [esp + 8]
  37. not ecx
  38. xor eax,eax
  39. cld
  40. repne scasb
  41. not ecx
  42. pop edi
  43. add eax,ecx
  44. dec eax
  45. retn 4
  46.  
  47. strrev:
  48.        push ebp
  49.        mov ebp,esp
  50.        push edi
  51.        mov edi,[ebp + 8]
  52.        push edi
  53.        call strlen
  54.        xor ecx,ecx
  55.        dec eax
  56.        jmp LL1
  57.        LL0:
  58.                dec eax
  59.                inc ecx
  60.                cmp ecx,eax
  61.                jge LL2
  62.        LL1:
  63.                mov dl,byte[edi + ecx]
  64.                xchg byte[edi + eax],dl
  65.                mov byte[edi + ecx],dl
  66.                jmp LL0
  67.  
  68.        LL2:
  69.        pop edi
  70.        pop ebp
  71. retn 4
  72.  
  73. itoa:
  74.      push ebp
  75.      mov ebp,esp
  76.      pushad
  77.      mov edi,[ebp + 8]
  78.      mov eax,[ebp + 12]
  79.      mov ebx,10
  80.      L@@1:
  81.        xor edx,edx
  82.        div ebx
  83.        xchg eax,edx
  84.        or eax,48
  85.        stosb
  86.        mov eax,edx
  87.        cmp eax,0
  88.        jnz L@@1
  89.        inc edi
  90.        mov byte[edi],al
  91.        push dword[ebp + 8]
  92.        call strrev
  93.      popad
  94.      pop ebp
  95. retn 8
  96.  
  97. numtexto db 5 dup(0)
  98. texto db 10 dup(0)
  99. size dd 9
  100.  

SYS_WRITE = 4
SYS_READ = 3
STDIN = 0
STDOUT = 1

el codigo rula perfectamente en win aunque no es lo mismo porque uso printf y scanf asi que supongo que mi error esta en el uso de las syscalls a ver si me pueden echar una mano

el code en win es

Código
  1. format PE console
  2. entry start
  3. include 'c:\fasm\include\win32ax.inc'
  4. .code
  5.  
  6. start:
  7.        invoke scanf,"%s",texto
  8.  
  9.        push texto
  10.        call strlen
  11.        push eax
  12.        push numtexto
  13.        call itoa
  14.  
  15.        push numtexto
  16.        call strlen
  17.  
  18.        invoke printf,numtexto
  19. leave
  20. ret
  21.  
  22. strlen:
  23.        push edi
  24.        xor ecx,ecx
  25.        mov edi, [esp + 8]
  26.        not ecx
  27.        xor eax,eax
  28.        cld
  29.        repne scasb
  30.        not ecx
  31.        pop edi
  32.        add eax,ecx
  33.        dec eax
  34.        retn 4
  35.  
  36. strrev:
  37.        push ebp
  38.        mov ebp,esp
  39.        push edi
  40.        mov edi,[ebp + 8]
  41.        push edi
  42.        call strlen
  43.        xor ecx,ecx
  44.        dec eax
  45.        jmp LL1
  46.        LL0:
  47.                dec eax
  48.                inc ecx
  49.                cmp ecx,eax
  50.                jge LL2
  51.        LL1:
  52.                mov dl,byte[edi + ecx]
  53.                xchg byte[edi + eax],dl
  54.                mov byte[edi + ecx],dl
  55.                jmp LL0
  56.  
  57.        LL2:
  58.        pop edi
  59.        pop ebp
  60. retn 4
  61.  
  62. itoa:
  63.      push ebp
  64.      mov ebp,esp
  65.      pushad
  66.      mov edi,[ebp + 8]
  67.      mov eax,[ebp + 12]
  68.      mov ebx,10
  69.      L@@1:
  70.        xor edx,edx
  71.        div ebx
  72.        xchg eax,edx
  73.        or eax,48
  74.        stosb
  75.        mov eax,edx
  76.        cmp eax,0
  77.        jnz L@@1
  78.        inc edi
  79.        mov byte[edi],al
  80.        push dword[ebp + 8]
  81.        call strrev
  82.      popad
  83.      pop ebp
  84. retn 8
  85. section '.data' data readable writeable
  86. numtexto        db      5 dup(0)
  87. texto   db      10 dup(0)
  88. size    dd      9
  89.  
  90. section '.idata' import data readable
  91. library msvc,'msvcrt.dll'
  92. import msvc,printf,'printf',scanf,'scanf'
  93.  

no cambia mucho solo el uso de entrada y salida

gracias de antemano


Título: Re: [ASM]Syscall no me funciona + fallo de segmentacion
Publicado por: Eternal Idol en 14 Junio 2009, 08:29 am
¿En que instruccion exactamente da el fallo? Podes usar gdb para depurarlo y averiguar esto. Deberias comprobar que el sys_read devuelva un valor de retorno que indique la finalizacion exitosa de la funcion.

¿No deberian estar los datos en otra sección? Algo como:

Código:
segment readable writeable
numtexto db 5 dup(0)
texto db 10 dup(0)
size dd 9


Título: Re: [ASM]Syscall no me funciona + fallo de segmentacion
Publicado por: YST en 14 Junio 2009, 09:14 am
Luego lo veo bien ( Cuando me pase a linux que estoy en win ) , pero veo un error que es
Código
  1. segment readable executable

Hay no le das la propiedad de writeable para poder escribir en las variables.


Título: Re: [ASM]Syscall no me funciona + fallo de segmentacion
Publicado por: ny0x en 14 Junio 2009, 15:50 pm
perfecto ese era el error ahora si me funciona bien, era lo de writeable, me funciona de ambas maneras poniendo un nuevo segmento con readable writeable o asignandole la propiedad de escritura al segmento actual. Que error mas estupido  :laugh:

gracias EI y yst no se me habia ocurrido lo del segment

saludos

P.D Creo que SYS_READ incluye el retorno en la cadena porque me aparece con una longitud un caracter mas largo de lo que es


Título: Re: [ASM]Syscall no me funciona + fallo de segmentacion
Publicado por: YST en 14 Junio 2009, 18:21 pm
Toma documentación sobre las syscalls

http://sourceforge.net/project/downloading.php?group_id=173983&filename=lscr-160307.tar.gz&a=60287788


Título: Re: [ASM]Syscall no me funciona + fallo de segmentacion
Publicado por: ny0x en 14 Junio 2009, 19:38 pm
gracias por la documentacion, estan muy buenos los ejemplos y estan en fasm   ;-)