Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Vaagish en 11 Abril 2013, 22:45 pm



Título: Problema al limpiar variable
Publicado por: Vaagish en 11 Abril 2013, 22:45 pm
Hola!! Como andan ?
Bueno,, la consulta es facil hoy.. resulta que tengo un problema al limpiar una variable llamada buffer, la cual se modifica constantemente cuando llega un dato por una conexion con socket.. aca dejo el code y el problema detallado.

.data?

buffer      db 512 dup(?)       ;Bufer para guardar datos recibidos

Eso en la sección .data?, luego en la sección .code:

Recv:
invoke recv, sock, addr buffer, sizeof buffer, 0
   
cmp sock, 0
je EMsg
   
EMsg:
invoke MessageBox, 0, addr buffer, addr Titulo, MB_OK
jmp Recv

El problema es que el "buffer" siempre queda cargado con la mayor cantidad de bytes que se le hayan pasado, por ejemplo:

si cargo buffer con "Hola", y luego cargo buffer con "J" el buffer queda asi: "Jola"

Ya probe con: mov buffer, 0 pero no da resultado...

Tendria que recorrer el buffer byte por byte y si es <> de 0 borrarlo ?? Es esa la solucion ?

Desde ya muchas gracias !! :)


Título: Re: Problema al limpiar variable
Publicado por: MCKSys Argentina en 12 Abril 2013, 05:08 am
Probaste algo como:

Código
  1. mov eax, offset buffer
  2. mov byte ptr[eax], 0
  3.  

antes de hacer recv?


Título: Re: Problema al limpiar variable
Publicado por: Flamer en 12 Abril 2013, 06:06 am
Probaste algo como:

Código
  1. mov eax, offset buffer
  2. mov byte ptr[eax], 0
  3.  

antes de hacer recv?

mmm no dudo de ti fly tu sabes muncho pero solo pienso yo que con eso solo limpiarias la primera posicion de memoria de la variable, orita no estoy en la pc apenas calando pero eso es lo que pienso y con el tema pienso que tendras que saber la longitud de la variable y hacer un bucle y limpiar cada posicion de memoria

y si estoy mal corrijanme

saludos flamer


Título: Re: Problema al limpiar variable
Publicado por: Vaagish en 12 Abril 2013, 06:13 am
Jajajaja justo cuando estaba para responder, el foro me sugirio que mirara una nueva  respuesta...

Recien pruebo esa opcion de MCK y creo que si,, digo creo porque: O limpia el primer byte, o no lo remplaza.. la cadena queda igual.. Probablemente tenga que medir la longitud de la cadena y llenarla con ceros, si.. o al menos eso deberia funcionar..


Título: Re: Problema al limpiar variable
Publicado por: MCKSys Argentina en 12 Abril 2013, 14:29 pm
Cuando trabajas con cadenas terminadas en cero, si pones un cero al principio, lo demas ya no importa: la cadena tiene largo 0...  ;)

Ahora, si quieres escribir si o si TODO el buffer, usa memfill y listo.


Título: Re: Problema al limpiar variable
Publicado por: mr.blood en 12 Abril 2013, 15:35 pm
Jajajaja justo cuando estaba para responder, el foro me sugirio que mirara una nueva  respuesta...

Recien pruebo esa opcion de MCK y creo que si,, digo creo porque: O limpia el primer byte, o no lo remplaza.. la cadena queda igual.. Probablemente tenga que medir la longitud de la cadena y llenarla con ceros, si.. o al menos eso deberia funcionar..

Con que pongas un 0 en la posicion cadena[strlen(cadena)]=0 asi delimitas la cadena, no hace falta que limpies todo.

Sa1uDoS


Título: Re: Problema al limpiar variable
Publicado por: Flamer en 12 Abril 2013, 16:40 pm
Citar
Con que pongas un 0 en la posicion cadena
[strlen(cadena)]=0 asi delimitas la cadena,
no hace falta que limpies todo.
Sa1uDoS
delimitando la cadena como dises los bytes quedarian en memoria y se borrarian al sobreescribir en ellos pero tendria que tener cuidado de no hacer un llamado a la cadena y salgan a la luz.
Osea si la variable media 10 anteriormente y delimitas a 0 y empiesas a sobreescribir hasta el byte 5 tendrias que tener cuidado de no invocar del byte 6 en adelante.

Es muy buena opcion pero con cuidado

saludos flamer


Título: Re: Problema al limpiar variable
Publicado por: Vaagish en 12 Abril 2013, 19:45 pm
Impecable! memfill do the hard work!!

Citar
Osea si la variable media 10 anteriormente y delimitas a 0 y empiesas a sobreescribir hasta el byte 5 tendrias que tener cuidado de no invocar del byte 6 en adelante.

Exacto.. y yo preciso el buffer en un MessageBox.. siempre me tira el buffer con la mayor cantidad de bytes guardados..


Título: Re: Problema al limpiar variable
Publicado por: mr.blood en 12 Abril 2013, 22:05 pm
Cualquier funcion que trabaje con cadenas lee hasta el primer 0 que encuentra, porque cualquier funcion que mida la longitud de una cadena lee hasta el primer 0 que encuentra.

Sa1uDoS


Título: Re: Problema al limpiar variable
Publicado por: Flamer en 13 Abril 2013, 18:40 pm
Cualquier funcion que trabaje con cadenas lee hasta el primer 0 que encuentra, porque cualquier funcion que mida la longitud de una cadena lee hasta el primer 0 que encuentra.

Sa1uDoS
la mento desirte pero no son cadenas son posiciones de memoria y lo de delimitar y sobreescribir en ellas creo que no funcionaria pensandolo bien ya que cuando declaro la variable buffer se asigno una sierta posicion de memoria y es la que seba a imprimir ejemplo:
si buffer en piesa de 00401000 y termina en 0040100F y sobre escribe hasta 00401007 y luego manda a imprimir seba a imprimir hasta la ultima posicion que es 0040100F junto con lo que no se sobreescribio o como dise tu si pongo un 0 en la posicion 00401007 y mando a imprimir la variable hasta hay seba a imprimir

saludos flamer y delimitar si se puede pasando lo sobreescribido a otra variable pero seri mas pancho

Nota: en ASM cuando se declara una variable ase referencia a sierta posicion de memoria no son cadenas como en lenguajes de alto nivel y si estoy mal corrijanme y perdonen las falta de ortografia


Título: Re: Problema al limpiar variable
Publicado por: MCKSys Argentina en 13 Abril 2013, 20:22 pm
no son cadenas como en lenguajes de alto nivel y si estoy mal corrijanme

Cuando usas APIs de Windows desde MASM, el concepto de szstring se define como una secuencia de bytes que termina en un byte nulo (osea 0 en ASCII).

Osea, que cuando llamas, por ej. a MessageBoxA, en el parametro lpText debes pasar un ptr a una szstring. Mas info: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx)

Saludos!


Título: Re: Problema al limpiar variable
Publicado por: Flamer en 13 Abril 2013, 21:20 pm
Citar
Cuando usas APIs de Windows desde MASM,
el concepto de szstring se define como una
secuencia de bytes que termina en un byte
nulo (osea 0 en ASCII).
esa secuensia de bytes estan almasenadas en posiciones de memoria a la cual para acceder a ellas hacemos referencia a una variable la cual acupa dicho espacio en memoria, no creo que interponiendo un cero en medio evite leer los demas bytes siguientes si dicho espacio es parte de la variable asignada.

Nota: si tengo tiempo boy a ser pruebas en mi pc aver que pasa ya que lo que digo son solo opiniones.

Saludos flamer y para limpiar la variable tienes que sobreescribir todo o llenarla de ceros


Título: Re: Problema al limpiar variable
Publicado por: Eternal Idol en 14 Abril 2013, 01:02 am
http://en.wikipedia.org/wiki/Null_terminated_string

El problema aca no es ese igual, la historia es que recv no trabaja con cadenas y con poner en 0 el primer byte no es suficiente si por ejemplo pasa esta secuencia:

1) recv lee la cadena "hola"
2) ponemos 0 en el primer caracter
3) recv lee la cadena bol

¿Y donde esta el terminador de cadena? ¿En el primer caracter que ahora es 'b'? En fin, que limpie todo o sino que ponga el terminador usando de base el tamaño que devuelve recv que para algo esta.


Título: Re: Problema al limpiar variable
Publicado por: Vaagish en 15 Abril 2013, 19:56 pm
memfill funciono bien y rapido.. pero lo que dice Eternal es buena opcion.. el tamaño de la 'cadena' esta dada en recv,, seria poner un 0 al final y listo.. ;)