Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: lapras en 7 Noviembre 2009, 19:06 pm



Título: imprimir los bits que hay en una direccion de memoria
Publicado por: lapras en 7 Noviembre 2009, 19:06 pm
La verdad que no tengo ni idea de como hacerlo lo que mas me hacerco es esto:
Código:
.text
.global main

main:

movl 1, %eax
movl %eax, u
movl $u, %ecx
addl $48, %ecx


movl $3, %edx
movl $1, %ebx
movl $4, %eax
int $0x80

.data

u:
.string "0"
Quisiera mostrar lo que hay en la direccion 1 de la memoria, no se ni siquiera si se puede o esta protegido :-\


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: Eternal Idol en 7 Noviembre 2009, 19:48 pm
La direccion 1 seguro que no es valida, mejor intenta con la de tu main, asi sabras el codigo binario de las instrucciones  ::)

PD. No mire el codigo pero depuralo con el gdb en todo caso.


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: lapras en 7 Noviembre 2009, 22:29 pm
para poner los bits seria una strig? mira el ccodigo porfa que seguro que lo tengo todo mal :(


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: Eternal Idol en 7 Noviembre 2009, 22:38 pm
Si, de unos y ceros ...

¿Y si usas la g/libc? Tenes disponible la funcion printf (http://www.cplusplus.com/reference/clibrary/cstdio/printf/) por ejemplo, seria mucho mas simple y podrias imprimirlo en hexadecimal ... cuando ya la domines podes incluso depurarla y ver que hace exactamente.


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: Yurix en 13 Noviembre 2009, 16:06 pm
Hola , puedes hacer eso con este codigo:
http://foro.elhacker.net/asm/codigos_de_yuri_grille-t257809.0.html;msg1269217#msg1269217

saludos
Cualquier duda me dices!


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: lapras en 29 Noviembre 2009, 16:52 pm
siiiiiiii, gracias Yurix es justo lo que buscaba.
Perdon que he estado estos dias ocupado con examenes y  no he mirado el foro casi.
Bueno ahora luego te digo que tal ;)
Para que ensamblador es el codigo?

EI: juntando mensajes.

buf no entiendo na  :-[
Que es bt?
lpBinario es todo una variable?
numero seria la celdilla de memoria?


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: Eternal Idol en 29 Noviembre 2009, 19:36 pm
http://pdos.csail.mit.edu/6.828/2007/readings/i386/BT.htm

lpBinario es un puntero a cadena, numero es el entero (de un byte) a convertir.

Mira el ejemplo de llamada:
invoke IntToBin,0A0h,addr binario


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: Yurix en 2 Diciembre 2009, 17:53 pm

Veo que este código no lo pillan mucho los novatos (eso no quiere decir que sea un master)  , voy a poner otro código que es mas fácil de entender. Espéralo hoy mismo , lo estoy escribiendo .... :

Te lo explico con lujo de detalles ::
-----------------------------------------------------
   mov eax, number ;<< El numero que se "convierte"

   mov ecx,020h  ; Longitud total de los bits + 1 , es decir 20h es 32 en decimal

mov ebx,offset buff - 1 ; Binario es la string donde se alojara el numero convertido

aun3:
    shr eax,1  ; Esto es "botar" 1bit hacia la derecha.
    adc BYTE PTR[ebx+ecx], 30h
loop aun3
-------------------------------------------------------

SHR , es lo mismo que hacer (>>) en otro lenguaje X , como C. Lo que hacemos es botar un bit hacia la derecha , cada bit expulsado activa el flag C *(carry flag) si es un 1 , si es un 0 no lo activa. Esto lo usamos para ir construyendo la cadena ASCII "01110101011".

ADC , es una suma común + el bit del flag C , es decir , sumas 30h *(que es el CERO) y si el flag C esta activo se suma 1bit , lo que da como resultado el 31h (el UNO)

El loop es mas fácil , tu mueves a ecx la cantidad de veces que quieres que se repita el show .Ej>

mov ecx,10

hola:
xor eax,eax  < Se repite 10 veces..
loop hola

Loop comprobara que ecx no sea CERO , si no lo es saltara a hola: , con cada salto se decrementa en 1 ecx , hasta llegar un momento en que sea CERO .
-----
BYTE PTR[ebx+ecx] < Con esto lo que hago es apoyarme en ECX (que va de mayor a menor gracias al loop) para hacer el adc en ese lugar , la "base" es ebx que indica el lugar que reservamos para hacer esta operación.

Te recuero que TIENE QUE SER UN LUGAR QUE ESTE "BACIO" con 0000s

Gózalo


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: lapras en 3 Diciembre 2009, 19:47 pm
madre mia que lujo, tampoco hacia falta que te molestases tanto, hombre
 ya casi  lo pillo ;D
Lo del SRH me recuerda cuando en los bancos de micolegio ,hay unos que para hacerse hueco empujan la fila y se cae el del otro lado  :xD :xD :xD :xD :xD :xD el que se queda fuera seria el que se queda en el registro de acarreo y el que empuja seria un CERO ¿lo he entendido?

Código:
IntToBin  proc Numero:BYTE,lpBinario:DWORD
esto que es ??yo he provado a compilarlo y me da error en esa linea.
gracias


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: Eternal Idol en 3 Diciembre 2009, 21:27 pm
tuket: PROC (http://msdn.microsoft.com/en-us/library/01d2az3t(VS.80).aspx).


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: lapras en 4 Diciembre 2009, 14:12 pm
ah! es un macro de MASM? claro por es me daba error en esa linea(lo intentaba ensamblar con NASM)


Título: Re: imprimir los bits que hay en una direccion de memoria
Publicado por: Yurix en 4 Diciembre 2009, 16:26 pm

Eso , es como en un banco o como en la vida !  unos salen y otros entran  ;)

No es molestia para mi compartir con los demas la caca que se de asm!  es mi deber como macho alfa  :xD