Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Karcrack en 21 Enero 2013, 02:59 am



Título: [Micro-rutina] strlen - ANSI
Publicado por: Karcrack en 21 Enero 2013, 02:59 am
Me he visto en la necesidad de diseñar una rutina strlen() lo más pequeña posible... He acabado con esto...
15bytes:
Código
  1. strlen:
  2.    pop  edx
  3.    pop  edi
  4.    push -1
  5.    pop  ecx
  6.    xor  eax, eax
  7.    repne scasb
  8.    not  ecx
  9.    mov  eax, ecx
  10.    jmp  edx
(No cumple el Intel ABI, pero puedo asumir que EDI se modifique y así me ahorro 2bytes)

¿Alguien ve la forma de recortarlo más?


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: xv0 en 21 Enero 2013, 18:43 pm
Hola

Código
  1. push -1  
  2. pop  ecx

El push son dos bytes, pop uno, si el valor de ecx fuera cero podrías hacer un not y serian dos bytes.

¿Puedes hacer eso?

Un saludo.


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: fary en 21 Enero 2013, 19:19 pm
Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4.     Cadena     db 'mDrinky',0
  5.     longitud   dd ?
  6. .code
  7. start:
  8.    push Cadena
  9.    call StrLen
  10.  
  11.    mov [longitud],eax
  12.    invoke GlobalAlloc,GPTR,1024
  13.    push eax
  14.    invoke wsprintfA,eax,"%d",[longitud]
  15.    pop eax
  16.    invoke MessageBox,0,eax,0,MB_OK
  17.  
  18.    ret
  19.  
  20.  
  21.    StrLen:  ; 14 bytes
  22.        pop edx
  23.        pop ecx
  24.        push -1
  25.        pop eax
  26.        bucle:
  27.        inc eax
  28.        cmp byte[ecx+eax],0
  29.        jne bucle
  30.        jmp edx
  31.  
  32. .end start
  33.  

14 Bytes
;D


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: mr.blood en 21 Enero 2013, 19:44 pm
No se si ya se puede acortar mas... yo creo que no.

13 bytes 14 bytes

Código
  1. include 'C:\FASM\include\win32ax.inc'
  2. .data
  3. Mensaje db "mrblood",0
  4. .code
  5. start:
  6. push Mensaje
  7. call strlen
  8. ret
  9. strlen:
  10. pop ebx
  11. pop edi
  12. mov eax,edi
  13. buc:
  14. inc eax
  15. cmp byte [eax],0
  16. jne buc
  17. sub eax,edi
  18. jmp ebx
  19.  
  20. .end start

EDITO:

Olvidadlo, no retorna correctamente. Lo mas corto son 14 bytes hasta el momento.

P.D.: Drinky, quiero ese beso xD

Sa1uDoS


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Karcrack en 21 Enero 2013, 20:09 pm
Ninguna de vuestras aproximaciones parece funcionar con una cadena nula ;) >:D

Además la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1.


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Eternal Idol en 21 Enero 2013, 20:59 pm
Además la función debe incluir el byte nulo en el tamaño. Por lo tanto, con una cadena nula debe devolver 1.

No, una cadena vacia tiene un tamaño de 0 caracteres.


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: fary en 21 Enero 2013, 21:04 pm
La mia si funciona con una cadena nula  :rolleyes:


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Karcrack en 21 Enero 2013, 23:56 pm
No, una cadena vacia tiene un tamaño de 0 caracteres.
No la función que yo quiero :laugh:

La mia si funciona con una cadena nula  :rolleyes:
Devuelve 0 y quiero que sea 1 :-\ Fuera de esa necesidad tu código haría mejor el clone de strlen() y cumple el intel ABI :)


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Eternal Idol en 22 Enero 2013, 00:04 am
No la función que yo quiero :laugh:

Entonces no es strlen()  :silbar:


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: MCKSys Argentina en 22 Enero 2013, 02:22 am
Optimizando el code de mDrinky para que dé 1 con un str de largo 0 ( :P), queda de 13 bytes:

Código
  1. strlena:
  2.    pop edx
  3.    pop ecx
  4.    xor eax, eax
  5. bucle:
  6.    inc eax
  7.    cmp byte ptr [ecx+eax],0
  8.    jne bucle
  9.    jmp edx
  10.  


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: fary en 22 Enero 2013, 08:56 am
Optimizando el code de mDrinky para que dé 1 con un str de largo 0 ( :P), queda de 13 bytes:

Código
  1. strlena:
  2.    pop edx
  3.    pop ecx
  4.    xor eax, eax
  5. bucle:
  6.    inc eax
  7.    cmp byte ptr [ecx+eax],0
  8.    jne bucle
  9.    jmp edx
  10.  

si  :) lo unico que si es una cadena no le suma ese byte nulo.


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: Karcrack en 22 Enero 2013, 12:15 pm
El asunto es que estoy parcheando un PE que tiene una función con este comportamiento (Cadena NULA = 1, etc...) Quería inyectar un poco de código sin necesidad de redireccionarme a/crear codecaves. Substituyendo la función por una de 20bytes tenía más que suficiente para lo que quería inyectar :)

Me encantan este tipo de threads :rolleyes: ;-)
A ver si acabo una función RC4 y vemos cuanto la podemos recortar >:D


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: xv0 en 5 Marzo 2013, 20:31 pm
La mia devuelve 1 si la cadena es núla, el código esta escrito en unix-like.

Código
  1. .section .data
  2.  
  3. cadena:
  4. .ascii ""
  5.  
  6. .section .text
  7. .globl _start
  8.  
  9. _start:
  10.  
  11. pushq $cadena
  12. popq %rbx
  13.  
  14. C.0:
  15. incb %bl
  16. incb %dl
  17. cmpb %al, (%rbx)
  18. jne C.0
  19. movl %edx, %edi
  20. movb $0x1, %al
  21.  
  22. syscall

14 bytes C.0.

Kdump:
Código:
CALL  exit(0x1)

Un saludo.


Título: Re: [Micro-rutina] strlen - ANSI
Publicado por: mr.blood en 4 Abril 2013, 02:14 am
Hoy viendo esta (http://www.rinconsolidario.org/eps/asm8086/CAP6.html) pagina recorde este tema e hice una funcion de 10 bytes.

Código
  1. include 'C:\FASM\include\win32ax.inc'
  2.  
  3. .code
  4. start:
  5. push ebp
  6. mov ebp, esp
  7.  
  8. push mensaje
  9. call strlen
  10.  
  11. leave
  12. ret
  13.  
  14. strlen:
  15. pop edx
  16. pop edi
  17. xor ecx, ecx
  18. bucle:
  19. inc ecx
  20. SCASB
  21. jnz bucle
  22. jmp edx
  23. .end start
  24. .data
  25. mensaje db "Mr.BlooD",0
  26.  

Sa1uDoS