Lo único que hacemos es pisar la variable que está abajo del buffer de 200 porque copia el contenido del buffer de 200 a un buffer de 300. Le ponemos de valor 0 a la variable que está debajo del buffer de 200 porque hace esta comparación cmp ptr [eax+0C8h],0
para ganar el reto. En donde 0C8h
es un offset que hace referencia a una variable que está dentro de estructura en donde está también declarado el buffer.
Algo así sería en C:
struct MyStruct {
char buffer[200];
int flag;
}
Este tutorial tiene mucho blabla de como usar el IDA pero existen muchos métodos algunos hasta automáticos.
Si miramos la representación estática del stack podemos ver que hay un buffer e identificar su tamaño automáticamente haciendo un click derecho Array.
Tip: Es recomendable darle un nombre al buffer que haga referencia a su tamaño, por ejemplo: buffer_200
push 12Ch ; Size
# Hace referencia al tamaño del buffer, que detectó automáticamente en el paso anterior.
Lee un archivo si es correcto, EAX será distinto de 0. Podemos desbordar el buffer de 200 y pisar la variable que está abajo.
Renombramos sub_4010B0
a check
e identificamos que el argumento es el puntero a Buffer_200
. Damos doble click a sub_4010B0
luego rename a arg_0
en donde dice: enter stack variable name
asignamos un nombre por ejemplo puntero_buffer_200
Luego click derecho en check set type
para propagar el nombre de la función ya que asignamos como argumento a buffer_200
Lo mueve a eax y le suma C8
entonces lo que está haciendo acá es checkear la variable flag porque a continuación del buffer de 200 está la variable flag.
Ejemplo: cmp ptr [eax+0C8h],0
Estamos hablando de que es un campo de una estructura, porque sino no se podría acceder a la estructura a través de sumarle un offset a un puntero
Entonces podemos volver al código entrar al buffer_200
en la representación estática y definir buffer_200
y la variable de abajo como una estructura, selecciona click derecho create struct from selection
, si querés podés renombrar la estructura a MyStruct
.
Entonces nos damos cuenta que lo que está haciendo es pasar el puntero de la estructura a la función check
Entonces vamos a cambiar los nombres de buffer_200
a MyStruct y de puntero_buffer_200
a puntero_MyStruct
Si ahora accedemos a check y apretamos en la linea cmp ptr [eax+0C8h],0
y luego p
nos damos cuenta que apunta al campo flag
.
Compara si esa variable es 0, si es 0 sale, pero si mirás las referencias a esa variable se inicializa en 1.
Luego creamos el example.txt con 200 A y 4 bytes de 0s y con eso pasaríamos pero eso no es todo!
Luego tenemos otro call sub_401010
que es otro check porque verifica si vas o no por buen camino, así que lo renombraremos check2
, el argumento de la función check es un puntero a la estructura. Entonces ingresamos a check2 y al arg_0
no renombramos como p_MyStruct
y el de arriba Str1
si apretás boton derecho y le das array automaticamente te reconoce el tamaño.
Vamos a reconocer todos los printf: todas las call sub_401270
como _printf
, pero después nos encontramos con otra función que es sprintf esa función escribe en un archivo, el primer argumento es un buffer y el segundo es el formato.
Luego compara ese string con N.
9:00