Vous êtes sur la page 1sur 13

IDA TIPS PARA USUARIOS DE

OLLYDBG
En el camino de ir aprendiendo cracking y reversing la mayoría de los actuales lectores ha
dado sus primeros pasos con OLLYDBG dado que tiene una curva de aprendizaje suave y
es mucho más simple de usar y entender al menos en un comienzo que el IDA PRO.

Con el tiempo al ir experimentando e intentando desafíos más complejos sobre todo en el


campo del reversing estático, nos vamos dando cuenta que OLLYDBG no nos proporciona
las herramientas interactivas que sí nos permite IDA PRO.

Por eso la idea de este tute es mostrar algunas diferencias, algunos tips para poder
adaptarse más fácilmente después de tanto tiempo de estar acostumbrado al OLLYDBG.

Así que este tute es una pequeña recopilación de tips y cosas que nos vamos dando cuenta
con el tiempo y que pueden ayudar a los que recien estan comenzando con IDA PRO.

Lo primero que debemos saber de IDA es que podemos configurar la interfase a gusto
nuestro con lo que queremos que esté visible por default y por supuesto el resto lo
abriremos cuando necesitemos.

IDA tiene dos configuraciones separadas para cuando trabajamos con el desensamblador a
la cual llama LOADER y cuando estamos debuggeando obvio llamado DEBUGGER, ambas
configuraciones son independientes.

Esta es una vista del LOADER, por supuesto cada uno puede cambiar el tamaño de las
ventanas agregar cosas quitar otras y una vez que termine de ajustar todo va a WINDOWS-
SAVE DESKTOP y allí pone la tilde en default y la configuración cambiará para siempre,
obviamente si hacemos lo mismo cuando estamos debuggeando cambiaremos solo la vista
de DEBUGGER de esta forma lograremos adaptarlo a nuestro gusto, en cada caso.

Una de las cosas que no encuentran los usuarios que recién comienzan y que extrañan del
OLLY es la función de la tecla menos y más para ir al lugar anterior con la tecla menos, o
para adelante con la tecla más.

Eso se puede agregar en el LOADER y en el DEBUGGER habrá que agregarlo


nuevamente, por separado en ambas configuraciones, como hemos visto y guardarlo por
default en ambas.

VIEW-TOOLBARS-JUMP lo pone visible y si hacemos SAVE DESKTOP con la tilde de


DEFAULT marcada obviamente quedará para siempre, sino lo deberemos agregar cada vez
que lo necesitamos.

Con ello no solo podremos ir hacia atrás y adelante sino también desplegar el menú hacia
abajo y elegir dónde ir, de los lugares visitados.
En OPTIONS otra opción que viene bien agregarla por default es LINE PREFIXES.

Eso agrega las direcciones delante de las instrucciones lo cual es bastante cómodo.
En algunos ejercicios y programas sobre todo los que tienen símbolos van a ver nombres de
las funciones bastante feos, a veces tienen el comentario al lado para aclarar, pero esta
bueno ir a OPTIONS-DEMANGLE NAMES y allí poner la opcion en NAMES.

Esto no queda cambiado para siempre si se guarda el escritorio, pero a veces se ve mucho
mejor a simple vista, como vemos abajo los nombres de las funciones quedan más sencillos
y no se complica tanto la visión.
PREFIJOS

IDA usa varios prefijos que antepone a valores numéricos y direcciones para informarnos
algo más de ellos, el tema es tratar de acordarse, o sino consultar en la página de IDA
porque suele ayudar bastante.
Mencionaremos aquí algunos con algunas imágenes para ilustrar.

sub_
Indica al estar delante de una dirección, que dicho número es el inicio de una función o
subrutina detectada.

locret_

Si IDA muestra una instrucción o comentario donde hay una dirección que es un return
como en este caso en ese salto al return, adelante de la dirección le colocara locret_.

loc_

Cuando una dirección corresponde a una instrucción antepone el prefijo loc_


Por lo tanto cada vez que tenga que mostrar una dirección de una instrucción le pondrá el
loc_ delante.

dword_

Acá se empieza poco a poco a complicar la cosa

Si hacemos doble click en 0x5127c vemos que el contenido de dicha dirección de memoria
contiene un cero
Por lo tanto dicha instrucción es similar a

mov eax, dword ptr [dword_5127C]

Lo que pasa es que en las instrucciones con direcciones numericas, IDA no usa corchetes
para mostrar que usará el contenido y no la dirección, se supone que al ver el prefijo
dword_ delante vos ya sabes que está buscando el contenido de la dirección 0x5127c y
que dicho contenido es un DWORD.

Si con la tecla D voy cambiando el tipo de dato a byte

la instrucción también cambia

off_

También en este caso esta buscando el contenido de la dirección pero el valor obtenido es
un offset o sea un puntero a algún dato detectado por IDA.

Allí vemos que compara el contenido de 0x4fBe8 que es un puntero


vemos que en 0x4fBe8 existe guardado un puntero a una string, ese puntero vale si
apretamos la Q para ponerlo en hexa 0x4bc84

O sea que el contenido de 0x4fBe8 es 0x4bc84 (puntero a string)

por lo tanto en la instrucción al poner el prefijo off_ estamos pidiendo el contenido o sea
comparara 0x4bc84 contra EDI.

Sería equivalente a

cmp dword ptr [off_4FBE8], edi

en la otra instrucción más abajo

offset delante (no confundir con off_) significa que no hay que hallar el contenido o sea que
es la direccion directamente

Sería equivalente a

Por supuesto off_4FBE8 significa que esa dirección es puntero a algo (en este caso a una
string)

asc_
IDA detecta que esa dirección contiene directamente una string ascII.

Viendo los bytes vemos que ya la dirección que mueve contiene esa string ascII, el hecho
de tener OFFSET delante hace que obtenga la dirección o sea que pushee 0x4328d0 ya
que no busca contenido.(si no tuviera el offset delante ya estaría pusheando los bytes de la
string directamente)

seg_

Se utiliza para direcciones que son el inicio de un segmento cuando hay que tomar el
mismo para una instrucción o sumarle una constante a partir del inicio del segmento.

seg_rdata + 55

Podría ser un ejemplo no encuentro uno a mano ahora donde suma el inicio del segmento
rdata más la constante 55.

Mas tipos de datos.

off_ data, contains offset value


seg_ data, contains segment address value
asc_ data, ascii string
byte_ data, byte
word_ data, 16-bit
dword_ data, 32-bit
qword_ data, 64-bit
byte3_ data, 3 bytes
xmmword_ data, 128-bit
ymmword_ data, 256-bit
packreal_ data, packed real
flt_ floating point data, 32-bit
dbl_ floating point data, 64-bit
tbyte_ floating point data, 80-bit
stru_ structure
custdata_ custom data type
algn_ alignment directive

Vemos todos los prefijos que buscan contenidos, y dichos contenidos pueden ser diferentes
tipos de datos, ya vimos off_ (puntero) , seg_ (dirección de un segmento), asc_ (dirección
que contiene una string), byte_(dirección que contiene un byte), word_, dword_ etc, que
usandolos como prefijo sabremos que el contenido es de ese tipo, como dijimos antes si
antes de estos prefijos aparece la palabra OFFSET delante, hace que se obtenga la
dirección de memoria y no su contenido.

flt_

Lo mismo ocurre con flt_ busca el contenido y el mismo es un float

unk_

Es un prefijo que apunta a una zona inexplorada


si hago doble click alli no me lleva a ningún lado porque 0x373560 es una dirección no
alocada o inexistente o no explorada.

en este ejemplo

al tener offset delante mueve el valor 0x51774 a EAX y el contenido además no apunta a
nada explorado o existente.(El contenido es cero)

Con la tecla Q vemos que equivale a

Luego si queremos volver al original el click derecho tiene la opción y nos muestra la
instrucción original para volver.

Por lo tanto aca esta la lista en la página del IDA salvo los tres primeros que se usan
normalmente para marcar ciertos tipos de instrucción determinada el resto son tipos de
datos que al verlos delante de una dirección sabremos que debemos buscar el contenido y
dentro estara dicho tipo, salvo que delante se anule con la palabra OFFSET que usara la
dirección sin buscar contenido.
Cualquiera puede buscar ejemplos en ejecutables usando el serach de texto y poniendo los
prefijos y comparándolos con el mismo ejecutable abierto en OLLY para practicar.

Otra diferencia grande se da en instrucciones más complejas, por ejemplo.

Aca se complica un poco más a veces usando la letra Q nos ayudamos mejor

movzx eax, byte ptr [eax+153D0h]

En la instrucción del IDA el prefijo byte_ como vimos me dije que tengo que buscar el
contenido que es un byte
Voy pivoteando por una tabla de bytes cuyo inicio es e 0x153d0 y cuya key es EAX la cual
se suma a 0x153d0 y se halla el contenido.

La de abajo también se puede aclarar un poco con la Q


Allí el prefijo off_ me dice que el contenido será un puntero o sea que estaré pivoteando por
una tabla de punteros, y que la tabla que empieza en 0x15390 se pivoteara sumandole
EAX*4.

Los reto a que practiquen buscando instrucciones complejas y que vayan practicando
entenderlas, primero con la ayuda de Q cuando se puede o con el OLLY y luego tratando de
hacerlo solo con IDA.

Espero que a alguien le sirva y que digan opiniones y si tienen alguna instrucción que tienen
dudas que la manden a la lista así vemos de ayudar y entender entre todos.

Saludos a todos
ricnar

Vous aimerez peut-être aussi