Análisis de malware

Comprender el paso único al depurar

30 de marzo de por Srinivas

El paso único es una de las características más poderosas de un depurador, ya que permite a un ingeniero inverso ejecutar una sola instrucción a la vez antes de devolver el control al depurador. Esta característica resulta útil cuando se necesita analizar un binario ejecutando una sola instrucción o una sección de instrucciones de su interés.

En este artículo, exploraremos cómo pasar por alto y acceder a funciones puede ayudar al analizar un binario con un depurador. Usaremos OllyDbg como nuestra elección de depurador, pero el concepto sigue siendo el mismo con cualquier otro depurador.

¡Conviértete en un ingeniero inverso certificado!

Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender

paso a paso

Durante el análisis de malware y la ingeniería inversa, es posible que necesitemos ejecutar instrucciones una tras otra (una instrucción a la vez) para comprender el comportamiento en un punto determinado. Esto se llama paso único, que proporciona una vista detallada de lo que sucede cuando se ejecuta el binario.

Los depuradores nos permiten ejecutar el programa en un solo paso. En OllyDbg, podemos realizar un solo paso usando la tecla F8 o haciendo clic en el botón resaltado en la imagen a continuación.

Este botón se utiliza para pasar por encima . Esto significa que el paso único ocurre por línea de código. Sin embargo, si presionamos esta tecla cuando el depurador está a punto de ejecutar una instrucción CALL, la ejecución de la subrutina se completará y el paso único continuará con la siguiente instrucción después de la instrucción CALL. Cuando esto sucede, existe la posibilidad de que nos perdamos el análisis de instrucciones importantes dentro de la subrutina.

Si desea seguir paso a paso las instrucciones dentro de la subrutina, debemos utilizar la instrucción CALL. En OllyDbg, esto se puede hacer usando la tecla F7 o el botón resaltado a continuación.

Otra forma de utilizar el paso a paso y el paso a paso en OllyDbg es navegando al elemento del menú Depuración , como se muestra en la siguiente figura.

Ejemplo

Intentemos comprender estos conceptos con un ejemplo. El siguiente programa en C se utiliza para demostrar cómo se pueden utilizar los pasos de entrada y de paso.

#incluir stdio.h

void test_function(int arg1, int agr2);

vacío principal()

{

int a = 10;

printf(“El valor de a es %dn”, a);

función_prueba(10,

un = un+5;

printf(“El valor actualizado de a es %dn”,a);

}

void test_function(int arg1, int arg2){

entero x = 50;

int y = 40;

}

El código anterior viene con una función llamada test_function , donde se inicializan dos variables. El binario ejecutable obtenido de este programa C se abre usando OllyDbg. La siguiente imagen muestra el desmontaje de la función principal y test_function .

Al observar el desmontaje, se puede ver que se llama a test_function en la dirección 0x00401549 con la siguiente instrucción.

00401549 |. E8 1C000000 LLAMADA paso a paso.0040156A

Se establece un punto de interrupción en esta instrucción y al presionar F8 (paso a paso) se ejecutará la definición de función disponible en la dirección 0x0040156A y el control volverá a la siguiente instrucción, que está en 0x0040154E .

Esto significa que no podremos realizar un solo paso dentro del bloque resaltado a continuación.

Como se mencionó anteriormente, la razón de esto es que el depurador simplemente ejecuta la función y devuelve el control. Si en lugar de eso queremos pasar un solo paso por las instrucciones de la subrutina, necesitaremos pasar por alto la instrucción CALL presionando F7 .

En ese caso, podremos realizar un solo paso a través de la subrutina, como se destaca a continuación.

Como puede observar en la anterior, el control ahora se encuentra en la dirección 0x0040156D, que se encuentra dentro de la definición de función de test_function .

Al analizar un binario grande, es necesario omitir los bloques de código innecesarios. Cuando una instrucción CALL se dirige a un bloque de código aparentemente inútil, podemos usar el paso por encima para omitir el proceso de un solo paso en la subrutina.

Es posible que un binario pueda tener funciones que nunca volverán a la función que llama. En estos casos, si se utiliza paso a paso , el depurador perderá el control y necesitaremos reiniciar el programa que se está analizando y luego usar paso a paso en la función CALL en lugar de paso a paso .

Conclusión

En este artículo, analizamos el paso único, que es una de las características más importantes de un depurador. Discutimos cómo el paso a paso evitará el paso único de la subrutina y regresará a la siguiente instrucción inmediata después de CALL. También analizamos cómo se puede utilizar el paso a paso para recorrer paso a paso las instrucciones dentro de una subrutina.

Fuentes

  1. Randal Hyde, “El arte del lenguaje ensamblador”, No Starch Press, marzo de
  2. Michael Sikorski y Andrew Honig, “Practical Malware Analysis”, No Starch Press, febrero de
  3. Ingeniería inversa para principiantes , Dennis Yurichev