Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Garfield07 en 31 Diciembre 2010, 17:41 pm



Título: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Garfield07 en 31 Diciembre 2010, 17:41 pm
Bueno, tengo un code sencillo, sencillamente escribe una A en la terminal... Por algo se empieza  :P
La cosa es que no escribe nada...
Código
  1. global _start
  2.  
  3. section .code
  4. _start:
  5. mov eax, 0x4   ; write (1, "A", 1);
  6. mov ebx, 0x1
  7. mov ecx, 0x42
  8. mov edx, 0x2
  9. int 80H
  10.  
  11. mov eax, 1 // return 0;
  12. xor ebx, ebx
  13. int 80H
  14.  
Citar
nano code.s
nasm -f elf -o code.o code.s
ld -m elf_i386 -o code code.o
chmod 777 *
./code

Bueno, donde esta el fallo? Recuerden que es mi primer code xD...
Alguna idea en algo tan simple?

Pd: De paso, ahora mismito me voy a leer un libro de ASM, a ver si descubro algo  :P


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Eternal Idol en 31 Diciembre 2010, 18:19 pm
El segundo parametro (ecx) es una CADENA y no un caracter.

http://linux.die.net/man/2/write


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Garfield07 en 31 Diciembre 2010, 18:34 pm
Entonces como lo hago para escribir una sola A? Y para poner la cadena sin usar data?


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Eternal Idol en 31 Diciembre 2010, 18:57 pm
Con pasar una direccion de memoria donde haya una 'A' (0x41) y que count (edx) sea 1 es suficiente. Para no usar .data podrias usar la pila ... proba ... no uso *NIX y encima es 31 de Diciembre  :silbar:


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Garfield07 en 31 Diciembre 2010, 19:05 pm
Pero como paso una direccion, algo asi como un puntero? le meto la A en la pila y le paso el ESP?
Código
  1. push 0x42
  2. pop ebx
  3.  

Feliz nochevieja y gracias ! Ahora modifico !


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Eternal Idol en 31 Diciembre 2010, 19:21 pm
Como te dije no uso *NIX asi que lo vas a tener que probar vos el codigo:

Código
  1. push ecx ;no importa lo que haya, despues ponemos la 'A'
  2. ;no sera una cadena terminada correctamente
  3. ;pero como especificamos el tamaño en count no importa
  4. mov byte ptr [esp], 041h ;sintaxis MASM
  5. mov eax, 0x4   ; write (1, "A", 1);
  6. mov ebx, 0x1 ;fd <<
  7. mov ecx, esp ;buffer <<
  8. mov edx, 0x1 ;count <<
  9. int 80H
  10. pop ecx
  11.  


Feliz año nuevo.


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Garfield07 en 1 Enero 2011, 01:05 am
Bueno, muchisimas gracias por el code de nuevo xD... pero no me va... juntando codes:
Código
  1. global _start
  2.  
  3. section .code
  4. _start:
  5. push ecx
  6. mov byte ptr [esp], 041h
  7. mov eax, 0x4
  8. mov ebx, 0x1
  9. mov ecx, esp
  10. mov edx, 0x1
  11. int 80H
  12. pop ecx
  13.  
  14.  
  15. mov eax, 1
  16. xor ebx, ebx
  17. int 80H
La cosa es que me da fallo de segmentación. Con la compilacion de antes...
Como es? (perdooooona)

 Esto de ASM es buscar nuevas formas de hacer las cosas. En C la cosa no es tan dificil, pero ASM me resulta muchisimo mas entretenido ...
Bueno, poco a poco se agranda el expediente !!!

PD1: Feliz año nuevo otra vez!
PD2: Ahora que lo pienso, muchisimas gracias ... Ahora que me doy cuenta tu me has ayudado a empezar tanto en ASM como en C. Jaja cuando desaparezcas como Rojodos dire que fuistes tu quien me enseño lo que era un programa xD....


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: 08l00D en 1 Enero 2011, 01:40 am
Código
  1. global _start
  2.  
  3. section .code
  4. _start:
  5. push ecx
  6. mov byte [esp], 041h
  7. mov eax, 0x4
  8. mov ebx, 0x1
  9. mov ecx, esp
  10. mov edx, 0x1
  11. int 80H
  12. pop ecx
  13.  
  14.  
  15. mov eax, 1
  16. xor ebx, ebx
  17. int 80H
  18.  
La sintaxis  no es igual en masm y nasm ... la linea que te puso eternal idol para copiar la letra a la pila es para masm, incluso lo puso como comentario en el codigo... en nasm para especificar el tamaño del dato a apuntar es con la palabra byte sola (en el caso de un byte obviamente)...
PD: Un buen libro que podes leer es Professional Assembly Language... es muy completo y de lectura facil y comprensible..

Saludos y feliz año nuevo


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Garfield07 en 1 Enero 2011, 01:47 am
Feliz año nuevo y muchas gracias xD!!!
Pd: Me confundi al leer el comentario crei que ponia nasm fallo mio xD..


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Eternal Idol en 1 Enero 2011, 13:27 pm
De nadas  ::)


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Garfield07 en 1 Enero 2011, 17:12 pm
Bueno, me ha salido otra dudilla pequeña...
Por qué lo haceis asi ?
Código
  1. global _start
  2.  
  3. section .code
  4. _start:
  5. push ecx
  6. mov byte [esp], 041h
  7. mov eax, 0x4
  8. mov ebx, 0x1
  9. mov ecx, esp
  10. mov edx, 0x1
  11. int 80H
  12. pop ecx
  13.  
  14. mov eax, 1
  15. xor ebx, ebx
  16. int 80H
  17.  
  18.  
Primero, push y pop sobran.
Segundo, deja bytes nulos xD... (mala constumbre  :P)
Comparando, en la mia me ahorro 12 bytes al acabar toda la compilacion  :silbar: :silbar: :silbar:
Código
  1. global _start
  2.  
  3. section .code
  4. _start:
  5.  
  6. mov byte [esp], 0x41
  7. mov al, 0x4
  8. mov bl, 0x1
  9. mov ecx, esp
  10. mov dl, 0x1
  11. int 80H
  12.  
  13. mov al, 1
  14. xor ebx, ebx
  15. int 80H
  16.  

Bueno, ahora para usar el code simplemente compilo
Código:
nasm -f elf hello.s
y miro cuanto ocupa
Código:
wc -c hello
¿Correcto? Ahora eso lo uso como shellcode no?
Alguien me puede corregir xD?


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Eternal Idol en 1 Enero 2011, 19:13 pm
En realidad por logica push y pop no sobran, estas sobreescribiendo la direccion de retorno, que se guarda en la pila, es cierto que salis con una interrupcion del programa PERO si queres hacer eso en una funcion cuando hagas ret te vas a arrepentir. No hay bytes nulos, su valor sera el mismo que tenian antes, el unico que cambia es el que nos interesa ...


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Garfield07 en 1 Enero 2011, 20:00 pm
Código
  1. mov eax, 0x4
  2.  
No tengo mucha idea de esto, pero gracias por el consejo ...
Y luego... ¿por qué no? Al moverlos asi el valor de eax puede ser cualquiera... Ahhhhhhhhh, como yo lo hago no "limpio" eax?. De la otra forma solo modifico una parte, la otra se queda igual...
Muchisimas gracias estoy apavado  perdona xD...


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Eternal Idol en 1 Enero 2011, 20:57 pm
La verdad es que no me habia referido a eso, ni habia visto ese cambio pero si podria ser un problema si EAX es por ejemplo 0xFFFFFFFF ...


Título: Re: Escribir 'A' en mi primer programa : ¿No funciona?
Publicado por: Garfield07 en 1 Enero 2011, 21:27 pm
Aparte, solucionado esto, para hacer la shellcode tendria que compilar sin linkear...
asi?
Código:
nasm shellcode.s
y me generaria "shellcode"
luego
Código:
hexdump shellcode
y tengo mi shellcode xD no?

¿No iria esto en bugs y exploits? Lo pongo aqui porque a lo mejor para shellcode tendria que modificar algo mas no?
por ejemplo, se suele compilar...
Código
  1. BITS 32   ;Esto es lo que se cambia por segment .code, etc...
  2.  
  3. mov byte [esp], 0x41
  4. mov al, 0x4
  5. mov bl, 0x1
  6. mov ecx, esp
  7. mov dl, 0x1
  8. int 80H
  9.  
  10. mov al, 1
  11. xor ebx, ebx
  12. int 80H
  13.  
Correcto ?
Luego me tendre que repasar lo que se sobre BoF pero weno ahora mismito la shellcode jaja.
Como es?