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


 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  [ASM]Syscall no me funciona + fallo de segmentacion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [ASM]Syscall no me funciona + fallo de segmentacion  (Leído 2,937 veces)
ny0x


Desconectado Desconectado

Mensajes: 336


Ver Perfil
[ASM]Syscall no me funciona + fallo de segmentacion
« en: 14 Junio 2009, 06:11 »

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


En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.512


La mano invisible del mercado me robo la billetera


Ver Perfil WWW
Re: [ASM]Syscall no me funciona + fallo de segmentacion
« Respuesta #1 en: 14 Junio 2009, 08:29 »

¿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


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
YST


Desconectado Desconectado

Mensajes: 966


I'm you


Ver Perfil WWW
Re: [ASM]Syscall no me funciona + fallo de segmentacion
« Respuesta #2 en: 14 Junio 2009, 09:14 »

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.
En línea



Yo le enseñe a Kayser a usar objetos en ASM
ny0x


Desconectado Desconectado

Mensajes: 336


Ver Perfil
Re: [ASM]Syscall no me funciona + fallo de segmentacion
« Respuesta #3 en: 14 Junio 2009, 15:50 »

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
En línea

YST


Desconectado Desconectado

Mensajes: 966


I'm you


Ver Perfil WWW
Re: [ASM]Syscall no me funciona + fallo de segmentacion
« Respuesta #4 en: 14 Junio 2009, 18:21 »

Toma documentación sobre las syscalls

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



Yo le enseñe a Kayser a usar objetos en ASM
ny0x


Desconectado Desconectado

Mensajes: 336


Ver Perfil
Re: [ASM]Syscall no me funciona + fallo de segmentacion
« Respuesta #5 en: 14 Junio 2009, 19:38 »

gracias por la documentacion, estan muy buenos los ejemplos y estan en fasm   ;-)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[?] Fallo de segmentación - C
Programación C/C++
8789poli 3 2,818 Último mensaje 14 Diciembre 2010, 19:50
por 8789poli
Mensaje ¿nucleo? fallo de segmentacion ::: Desactivando la protección
GNU/Linux
Garfield07 2 2,009 Último mensaje 1 Enero 2011, 01:03
por Garfield07
Fallo de segmentación al agregar mas nodos en una lista.
Programación C/C++
samur88 0 1,861 Último mensaje 19 Enero 2011, 15:08
por samur88
Fallo de segmentacion con fgets y Array de cadenas. « 1 2 »
Programación C/C++
samur88 12 3,947 Último mensaje 7 Marzo 2011, 00:37
por samur88
Fallo de segmentacion
Programación C/C++
_niu 9 2,744 Último mensaje 29 Agosto 2011, 02:58
por _niu
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines