Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: Иōҳ en 19 Junio 2011, 19:55 pm



Título: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: Иōҳ en 19 Junio 2011, 19:55 pm
Hola que tal, estaba desamblado un VB, con el OllyDBG, y como no tengo mucha experiencia depurando aplicaciones en tal lenguaje, me surge una duda, según lo que encontre por la red

Citar
Rnd(). Devuelve un número aleatorio entre 0 y 1.
[..]
La función Rnd() se corresponderá con la rtcRandomNext exportada por la Dll.

pero el OllyDbg me aclaro esto

(http://i52.tinypic.com/midlli.jpg)

(http://i52.tinypic.com/ev9nqs.jpg)

y bueno apartir hace una serie de multiplicaciones la cual luego compara con el seríal, claro que hay un salto que puedo invertir, y listo, pero quería ver sí puedo saber que me va devolver, aunque creo que no se podría porque según lo que leí dice aleatorio, y pues, no se si me estoy equivocando haber que me dicen ustedes.

Gracias de antemano.


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: karmany en 19 Junio 2011, 23:45 pm
Ahí se ven operaciones de punto flotante. Lo que interesa saber es a dónde va o el nombre de la función de la librería de Visual Basic: MSVBVM60.#593

Para saber a qué corresponde RND en Visual Basic lo más fácil es crear un programa en VB6 y analizarlo con tu depurador.


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: Иōҳ en 20 Junio 2011, 18:35 pm
el OllyDBG te lo dice, rtcRandomNext, y según busque es la función RND()


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: karmany en 21 Junio 2011, 00:59 am
Efectivamente acabo de hacer una prueba con VB6 y la función rnd() se convierte en rtcRandomNext.

¿Y ese programa usa para el registro un número aleatorio? En qué pensará el programador  :P


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: Иōҳ en 21 Junio 2011, 17:12 pm
Efectivamente acabo de hacer una prueba con VB6 y la función rnd() se convierte en rtcRandomNext.

¿Y ese programa usa para el registro un número aleatorio? En qué pensará el programador  :P

Ni idea, al principio no comprendía, y hasta ahora no comprendo porque lo usa, bueno tendre que NOPear el salto de comprobación =/.

Nox.


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: MCKSys Argentina en 21 Junio 2011, 17:26 pm
Quizas esa parte aleatoria no se tenga en cuenta eln la comprobacion final....

Tendrias que reversear toda la funcion a ver quie sale.

De ultima, podrias hacer un bruteforce de esos valores para ver como va cambiando la cosa...


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: Иōҳ en 21 Junio 2011, 18:14 pm
Quizas esa parte aleatoria no se tenga en cuenta eln la comprobacion final....

Tendrias que reversear toda la funcion a ver quie sale.

De ultima, podrias hacer un bruteforce de esos valores para ver como va cambiando la cosa...
sí eso hice, y lo que parece indicar es que sí la usa D:, lo hice como 2 o 3 veces, y vi al final la tomaba para comparar, o será que mi cerebro no daba para más, bueno sigo con el concurso. =/.

Gracias por la ayuda!

Nox.


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: _Enko en 24 Junio 2011, 20:22 pm
En una pc normal, no se pueden generar numeros aleatorios, sino pseudo-aleatorios.

Toda la teoria se basa en tener algun tipo de funcion que devuelva algun numero basandose en register overflow o alguna cosa por el estilo, tomando como numero de partida la Semilla.

Es decir, teniendo una funcion como esta: (sacado del runtime de delphi)
Código:
proc _RandInt, range 
; OUT{ <-EAX Result }
   MOV  EAX, [range]
   IMUL EDX,[RandSeed],08088405H
   INC EDX
   MOV [RandSeed],EDX
   MUL EDX
   MOV EAX,EDX
   ret

endp

la variable [RANDSEED] es una variable global. Es la semilla. Para inicializarla en Delphi se llama a Randomize y en VB tambien.
Lo que hace randomize es llamar a GetTickCount y toma eso como punto de partida.

Pero digamos, si RandSeed fuera una constante que pasa?
pues sencillo, al ser RAndSeed constante, la lista de numeros aleatorios tambien es constante. Es decir, no importa cuanta veces ejecutes el codigo, La secuencia de numeros aleatorios siempre será la misma. Esto siempre y cuando la semilla  inicial sea una constante.

Bajo ese principio, antes se solia hasta "cifrar", haciendo simples XOR con una secuencia "pseudo-infinita".

así que cuando te preguntas en que pensaba el programador al generar su llave usando Rand... pues ahí lo tienes ;)

SAludos.


agregado:
Directo de msdn
http://msdn.microsoft.com/es-es/library/8zedbtdt(v=vs.80).aspx

Citar
Para repetir secuencias de números aleatorios, llame a la función Rnd con un argumento negativo justo antes de utilizar Randomize con un argumento numérico. Si utiliza Randomize con el mismo valor que Number, no se repetirá la secuencia anterior.
Citar
Nota de seguridad
Debido a que la instrucción Random y la función Rnd comienzan con un valor de inicialización y generan números que quedan dentro de un intervalo finito, otra persona que conozca el algoritmo utilizado para generar los resultados puede predecirlos. Por tanto, la instrucción Random y la función Rnd no se deben utilizar para generar números aleatorios utilizados en criptografía.


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: Иōҳ en 24 Junio 2011, 22:51 pm
ok, pero eso solo será en mi pc, es decir que el número que se usa como semilla, será la misma secuencia y por ende al generar cuantas veces seas será la misma, pero eso no queire decir que sea la misma para otras pc.

Salu2


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: karmany en 24 Junio 2011, 22:58 pm
Muchísimas gracias por la información, muy interesante.

Yo cuando me refería al uso de rnd según el programador pues me refería a que si en su programa usa una secuencia pseudo-aleatoria, ¿Cómo va a favorecer el registro de usuarios?
(Voy a tirar de mi libro de VB6). En VB6 tenemos:
variable = Rnd([expresión]);
Si expresión:
<0:     el resultado es siempre el mismo número
>0 o se omite: el siguiente número aleatorio
=0: el último valor generado

Si expresión es >0 o se omite se generará la misma secuencia cada vez que se ejecute el programa. Para variar esta secuencia en VB6 se usa Randomize n. Si no se usa n el valor se obtiene del reloj del sistema.

Si yo programo:
Randomize
valor = Rnd(9) ;por mucho que reinicie, valor será diferente en cada ejecución.

Otra cosa y me imagino que es a lo que te refieres es a:
valor = Rnd ; donde en cada ejecución valor será el mismo.

Pero yo tengo dudas de que usar una secuencia pseudo-aleatoria sea lo más conveniente para registrar un programa. Aunque puede por supuesto que me equivoque.

Un saludo y gracias por tu colaboración.


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: _Enko en 24 Junio 2011, 23:28 pm
Citar
ok, pero eso solo será en mi pc, es decir que el número que se usa como semilla, será la misma secuencia y por ende al generar cuantas veces seas será la misma, pero eso no queire decir que sea la misma para otras pc.
Tengo que decirlo de vuelta?
Misma semilla inicial, misma secuencia de numeros pseudo-aleatorios.

Cuando digo misma PC, me refiero misma arquitactura, mismo sistema operativo.
Los programas de VB6 corren en cualquier pc win32, a eso me refiero misma pc.

usando el mismo algoritmo, partiendo de la misma semilla la secuencia es identica. Haz la prueba si tienes vb6. Dejé link



karmany, no he programado en vb6, pero la msdn me confirmó de cierto modo mi sospecha.

Supongamos que la semilla es constante valor K. (colocando eso en vb6 de la manera que se coloque, no lo se, en delphi se puede llamar a Randomize y genera semilla aleatoria, o bien se puede colocar un valor a RandSeed y poner un valor que nosotros queramos.)
Los numeros aleatorios son del 0 al 10 y es una secuencia de 10 numeros.
Se generaria por ejemplo 1,5,6,7,5,8,6,8,1,3

Si vuelves a ejecutar ese codigo, usando el mismo algoritmo de random, en este caso Rnd. Y partiendo de la misma semilla, en este caso valor K, se obtendira nuevamente 1,5,6,7,5,8,6,8,1,3.

Suponte que el serial valido sea:
"USERNAME" XOR "1,5,6,7,5,8,6,8,1,3"
El user es: JUANJOCE12, el seria seria
J xor 1
U xor 5
A xor 6
N xor 7
etc....

Luego para comprobarlo, hace SERIAL XOR 1,5,6,7,5,8,6,8,1,3 tiene que dar USERNAME.

Pero y para que el Rand? Para CONFUNDIR, si en el codigo aparece esa secuancia es muy obvio, entonces con una secuencia de Rand constante hace parecer que es "aleatorio" y son cosas no usadas para generar el serial, cuando en realidad lo que esta haciendo con el RAND es generar una seria constante de numeros.

Es un simple engaño, nada mas que eso.



Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: karmany en 25 Junio 2011, 08:54 am
Efectivamente, tienes toda la razón.
Con la misma semilla la secuencia de números es la misma. Puede ser que el programador haya hecho hecho. Es posible.


Título: Re: rtcRandomNext es preciso saber el valor que retorna?
Publicado por: Иōҳ en 25 Junio 2011, 19:18 pm
ok muchas, muchas gracias, solo quería esa aclaración que para mí, tarde en comprender, jeje.

Nox.