Ollydbg, problema dll.

Iniciado por Eaa, 3 Septiembre 2008, 19:34 PM

0 Miembros y 1 Visitante están viendo este tema.

Eaa

 Buenas estoy siguiendo un tuto de stack overflow del foro. Lo compilo todo en Visual c++, y el problema es el siguiente:

Cuando abro el olly donde deberia poner poner por ejemplo:

004012D2  |. E8 79170000    CALL <JMP.&msvcrt.printf>                ; \printf

Donde msvcrt seria la dll para buscar el offset de system en mi caso.


A mi me pone:
004012D2  |. E8 79170000    CALL vuln1.&.printf>                ; \printf


Donde vuln1 es como se llama mi archivo, y no me da ninguna dll para buscar el offset como pone en el tuto.

Saludos...

...........

Teniendo el exe para echarle un vistazo sería de ayuda.

He mirado las opciones de olly, y ninguna produce lo que a ti te pasa.

De todas formas, si sobre ese comando pulsas la barra espaciadora, verás la dirección de esa llamada, que si la sigues, te debe conducir a la dirección de esa función dentro de la msvcrt.

Eaa

//* vuln1.c por Rojodos */

#include <stdio.h>  // librería stdio.h, funciones básicas de Entrada/Salida
#include <string.h>

int main (int argc, char **argv){  // La función "principal" del programa

char buffer[64]; //Declaramos un array con 64 bytes de espacio
if (argc < 2){  // Si los argumentos son menores que 2...
printf ("Introduzca un argumento al programa\n"); //Printeamos
return 0;  // y retornamos 0 a la función main, y el programa acaba
        }
strcpy (buffer, argv[1]); // Aqui es donde esta el fallo.

return 0;  // Devolvemos 0 a main, y el programa acaba.
}


Na la llamada esa no me conduce a ningun msvcrt.
Con el dev c++ me aparece la dichosa dll, pero el asm esta muy cambiado,me pierdo -.-.

Saludos...

...........

#3
Lo acabo de compilar con el dev c++ y me funciona bien



Te paso mi ollydbg.ini, por si fuera algún problema de configuración. Supongo que estás usando un olly en condiciones, versión 1.10.

http://rapidshare.com/files/142382430/ollydbg.ini.html

Los pasos son:
- cargar el exe en olly
- botón derecho, search for / all intermodular calls
- pinchas dos veces sobre msvcrt.prinft lo que te llevará a la línea donde está esa llamada
- barra espaciadora y te aparece el comando, donde ves la dirección a la que apunta el call
- situándote en esa dirección, ya ves la dirección que te he puesto en la imagen

Igual te preguntas por qué no hay un call directo: CALL 77C1186A
La razón es porque esas direcciones de las funciones que exportan las dll son variables, pueden cambiar según el sistema operativo, o incluso usando el mismo s.o. Entonces lo que hacen los programas es tener una tabla de direcciones, la IAT, que el s.o. rellena con dichas direcciones al cargar el ejecutable en memoria. Entonces, la llamada de hace forma indirecta. La razón de que NO sea un CALL [dir] que es más directo que un CALL a un JMP [dir], como estás viendo, no la recuerdo ahora mismo.

Eaa