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
| |-+  Programación General
| | |-+  ASM (Moderador: Eternal Idol)
| | | |-+  Codigos Inutiles !!!
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Codigos Inutiles !!!  (Leído 3,741 veces)
Yurix

Desconectado Desconectado

Mensajes: 72


Paz para la guerra y guerra por la paz


Ver Perfil
Codigos Inutiles !!!
« en: 13 Julio 2009, 20:36 pm »

Hola de nuevo a todos , como dije en el post sobre de Ascii a binario quiero hacer con la ayuda de todos una recopilación de tips sobre optimización , mejor uso de las instrucciones etc ...
-----------------------------
Todos los que quieran ayudar , estoy haciendo un pequeño escrito sobre instrucciones inútiles y quisiera que mandaran tips sobre estos temas , ej de instrucción inútil

"inc cl" ;<< Nada mas inútil que usar este code debe de estar prohibido , sabes por que ?
Porque es mejor hace "inc ecx" y el resultado es el mismo y nos ahorramos un byte

00401000 >    FEC1          inc     cl
00401002      41            inc     ecx

Ley numero 1 > Nunca incrementes un registro low como es el caso de "al cl dl bl"
Parece sencillo pero lo he visto en algunos casos (personales) XD
------------------------------------------------------------------------------------------------
Otro caso es este:
(Objetivo : Poner en 7 a eax)

Sobre el tema:
B8 07000000   mov     eax, 7
también tiene de positivo que son 3 bytes 00 y a la hora de comprimir mucho mejor.

Pero como curiosidad se me ocurre que podemos también comernos un byte:
Código:
00401000     33 C0          xor eax,eax
00401002     B0 07          mov al,7
o
Código:
00401000     33 C0          xor eax,eax
00401002     04 07         add al,7

Y se me ocurre esta de 5 bytes:
Código:
00401002      B0 07         mov al,7
00401004      0FB6C0        movzx eax,al

E incluso haciendo pruebas he intentado exprimir para conseguir 3 bytes:
Código:
00401007      6A 07         push 7
00401009      58            pop eax

Gracias a Karmany por aportar estos códigos y en especial por el de>
Código:
00401007      6A 07         push 7
00401009      58            pop eax
Que es muy usado en los shell code para ahorrar espacio.

-----------------------------------------------------------------------------------------------

Ahora veamos un ejemplo de código inútil en un shell code  publicado en Milw0rm.com

Código
  1. 00401000 > $ 33C0           XOR EAX,EAX        ; |
  2. 00401002   . B8 8F7A837C    MOV EAX,kernel32.Beep       ; |
  3. 00401007   . 68 00040000    PUSH 400                             ; |/Duration = 1024. ms
  4. 0040100C   . 68 00030000    PUSH 300                            ; ||Frequency = 300 (768.)
  5. 00401011   . FFD0           CALL EAX                                 ; |\Beep
  6. 00401013   . 33C0           XOR EAX,EAX                           ; |
  7. 00401015   . B8 FACA817C    MOV EAX,kernel32.ExitProcess          ; |
  8. 0040101A   . FFD0           CALL EAX                                 ; \ExitProcess


Díganme que código sobra en este ejemplo???? Fácil

-----------------------------------------------------------------------------------------------
Otro ejemplo de código sobrante >
----------------------------------------------------------------------
Mirando un code para el ordenamiento quicksort. Veo código que sobra y mejor dicho que se puede optimizar un poco.El ejemplo mas claro es al final.

Código
  1. ;Original:
  2.        pushad
  3.        mov edi,vector
  4.        push dword[edi + 11 * 4]
  5.        push dword[edi + 10 *4 ]
  6.        push dword[edi + 9 * 4]
  7.        push dword[edi + 8 * 4]
  8.        push dword[edi + 7 * 4]
  9.        push dword[edi + 6 * 4]
  10.        push dword[edi + 5 * 4]
  11.        push dword[edi + 4 * 4]
  12.        push dword[edi + 3 * 4]
  13.        push dword[edi + 2 * 4]
  14.        push dword[edi + 1 * 4]
  15.        push dword[edi]
  16.        push formato
  17.        call [printf]
  18.        add esp,52
  19.        popad
  20. ret
----------------------------------------------------------------------

Aquí esta la optimizacion del código:

Puedo usar casi cualquier registro ya que cuando se empieza se guardan todos con la instrucción pushad y luego los recuperan con popad.

Código
  1.        pushad ; Se guardan los registros en la pila
  2.        mov edi,vector
  3. repetir:
  4. mov eax,2c ; 2c es 44 pero en hexadecimal.
  5. push    dword ptr ds:[eax+edi]  ; Ponemos a eax en 44
  6. sub eax,4 ; y vamos restando 4
  7. jnz repetir ; Hasta que lleguamos a 0
  8.  
  9. ; El resto es lo mismo
  10.  
  11. push dword[edi]
  12.        push formato
  13.        call [printf]
  14.        add esp,52
  15.        popad ; Se recuperan todos los registros
  16. ret


Le he dejado en el código optimizado algo que aun se puede optimizar mas , sabes que es ? Esfuérzate un poco y dímelo

Lo han resuelto:
Karcrack (No terminado completamente) (Le falta poco :silbar:)

Saludos
---------------------------------------------------------------------------------------------------------------------
Salida Malvada:
[/b]

Esta es una forma de salir usando un stack overflow , es decir se llama a la misma funcion , como solo hay llamadas la pila se llena hasta el tope y sale a windows

Olly:
0040AF82  |$  E8 FBFFFFFF   call    kills.0040AF82

Asm:
salir:
call salir

La pregunta es , para que sirve esto, simplemente nos ahorramos unos bytes.
Otra forma de salir es poniendo un RET en el entry point del programa ya que en la pila
esta la direccion de retorno hacia el sistema.Pero les doy un ejemplo para salir de nuestro
programa en el momento que querramos , no solo al comienzo

Un ejemplo para hacer esto en nuestras aplicaciones. >

Código
  1. .code
  2. entrypoint:
  3.  
  4. mov     eax , dword ptr ds:[esp]
  5. mov     dword ptr ds:[salir], eax
  6. ;---------------------------------
  7. .
  8. .Tu programa ...
  9. .
  10. .
  11. .
  12. ;---------------------------------
  13. call dword ptr ds:[salir] ; Salida "Especial" sin ExitProcess

Y tenemos que reservar 4 bytes para la variable "salir" , esto nos representa un ahorro
de 30 bytes (WAO) en nuestro programa si por ejemplo lo comprimimos ...

Saludos y espero que les sea util.



« Última modificación: 20 Julio 2009, 22:03 pm por Yurix » En línea



http://kapetres.wordpress.com/ < Mi blog sobre ASM

Parece que alguien no quiere que la info sea liebre >

Alguien lo movio a ese lugar.
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.937


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Codigos Inutiles !!!
« Respuesta #1 en: 13 Julio 2009, 20:46 pm »

Compara el valor final de ecx en estos dos casos:

Código
  1. xor ecx, ecx
  2. mov cl, 0FFh
  3. inc cl

Código
  1. xor ecx, ecx
  2. mov cl, 0FFh
  3. inc ecx



XOR EAX, EAX
Para despues poner en eax la direccion de una funcion de la API no tiene utilidad.


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
Yurix

Desconectado Desconectado

Mensajes: 72


Paz para la guerra y guerra por la paz


Ver Perfil
Re: Codigos Inutiles !!!
« Respuesta #2 en: 13 Julio 2009, 21:13 pm »

XOR EAX, EAX
Para despues poner en eax la direccion de una funcion de la API no tiene utilidad.

Exacto , sobran los XORs

-------------------------
El resultado es el mismo en nuestro objetivo >> CL << por eso digo que es mejor hacer inc ecx que inc cl ya que es mas corto , 1 byte  :o , claro que todo depende cuando se use  :laugh:
Gracias Eternal por tocar el tema. ;-)

Código

xor ecx, ecx
mov cl, 0FFh
inc cl

Resultado 00000000

Código

xor ecx, ecx
mov cl, 0FFh
inc ecx

Resultado 00000100
« Última modificación: 13 Julio 2009, 21:34 pm por Yurix » En línea



http://kapetres.wordpress.com/ < Mi blog sobre ASM

Parece que alguien no quiere que la info sea liebre >

Alguien lo movio a ese lugar.
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Codigos Inutiles !!!
« Respuesta #3 en: 14 Julio 2009, 16:50 pm »

Yurix, esto es un poco offtopic, pero por favor, comenta los codigos que pones, que me cuesta mucho leer tus post ;)
MOD: Mucho mejor ;)
« Última modificación: 16 Julio 2009, 17:39 pm por Karcrack » En línea

karmany
Colaborador
***
Desconectado Desconectado

Mensajes: 1.614


Sueñas que sueñas


Ver Perfil WWW
Re: Codigos Inutiles !!!
« Respuesta #4 en: 14 Julio 2009, 23:30 pm »

Sobre el tema:
B8 07000000   mov     eax, 7
también tiene de positivo que son 3 bytes 00 y a la hora de comprimir mucho mejor.

Pero como curiosidad se me ocurre que podemos también comernos un byte:
Código:
00401000     33 C0          xor eax,eax
00401002     B0 07          mov al,7
o
Código:
00401000     33 C0          xor eax,eax
00401002     04 07         add al,7

Y se me ocurre esta de 5 bytes:
Código:
00401002      B0 07         mov al,7
00401004      0FB6C0        movzx eax,al

E incluso haciendo pruebas he intentado exprimir para conseguir 3 bytes:
Código:
00401007      6A 07         push 7
00401009      58            pop eax




« Última modificación: 14 Julio 2009, 23:38 pm por karmany » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Páginas web inútiles que te alegrarán el día
Noticias
wolfbcn 0 1,513 Último mensaje 24 Mayo 2014, 01:48 am
por wolfbcn
25 sitios web completamente inútiles pero adictivos
Noticias
wolfbcn 0 1,170 Último mensaje 15 Diciembre 2016, 21:35 pm
por wolfbcn
Lenguajes inutiles?
Dudas Generales
xknov 6 2,737 Último mensaje 6 Julio 2019, 23:58 pm
por xor.eax
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines