elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Análisis y Diseño de Malware (Moderador: fary)
| | |-+  Encontrar la funcion main en un binario
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Encontrar la funcion main en un binario  (Leído 4,409 veces)
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Encontrar la funcion main en un binario
« en: 26 Mayo 2020, 17:27 pm »

Hola,

Estaba practicando con un hackme que programe. Precisamente el desbordamiento de pila; puedo enviarle el payload y el codigo por mensaje privado a quien le interese.
En resumen, tarde un buen rato buscando la funcion main en el binario resultante. De hecho, en el codigo fuente integre ciertas instrucciones en ensamblador (inutiles) que luego utilice como una 'firma' de la funcion para luego buscar la cadena con el depurador (llamenme novato).
Mi pregunta es: ¿existe una manera mas, digamos, eficiente de encontrarla?

Saludos.


Edito: Se me acaba de ocurrir una buena manera. Si a alguien le interesa, pues lo mismo. :)
Sin embargo me gustaria leer sus opiniones, igualmente.
« Última modificación: 26 Mayo 2020, 18:36 pm por marax » En línea

fary
Moderador
***
Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Encontrar la funcion main en un binario
« Respuesta #1 en: 1 Junio 2020, 07:30 am »

Como buscaste la función main?
En línea

Un byte a la izquierda.
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Encontrar la funcion main en un binario
« Respuesta #2 en: 1 Junio 2020, 18:02 pm »

Como buscaste la función main?
Lo se... demasiado facil para preguntarse. La expectativa brota de tu mensaje como el veneno del colmillo, pero me refiero a medios manuales.

Este es el codigo del programa de prueba:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main ()
  5. {
  6.    int i;
  7.    char bPassword[BUFSIZ];
  8.    const char *password=
  9.    "p2u4ingr9pnqeofig2-94rm8g[nqeifggp2u45gn230p89e";
  10.  
  11.    printf ("introduzca la contrasena: ");
  12.    fflush (stdin);
  13.    gets (bPassword);  
  14.  
  15.    if (strcmp (bPassword, password))
  16.    {
  17.        printf ("\r\naccess denied.");
  18.        return 0;
  19.    }
  20.  
  21.    else
  22.        printf ("\r\naccess granted.");
  23.  
  24.    printf ("\r\n\r\nuser name\tpassword");
  25.    printf (    "\r\n---- ----\t--------");
  26.  
  27.    for (i=0;i<5;i++) printf ("\r\n%c%c%c\t\t%c%c%c",
  28.    i+33,i+33,i+33,i+1+33,i+1+33,i+1+33);
  29.  
  30.    return 0xffff;
  31. }

Mi pregunta hace referencia a un ejecutable cuyo codigo fuente no posees. Pero para introducirte mejor en el contexto, ahi esta  :rolleyes:.

Si se ejecuta el programa, puedes ver que evidetemente una cadena de caracteres esta siendo impresa en el buffer de salida estandar:



La impresion puede ser parte del algoritmo de una funcion o de la funcion principal. En el primer caso seria una cuestion de perseguir los retornos con el depurador hasta dar con ella. Sin embargo este caso es el segundo.

Para encontrar la funcion, se me ocurrio primero buscar la RVA de la cadena. Lo hice asi con DEBUG (si, es modo real y son 16 bits, pero no avanzo hasta pisar bien):


(si, ademas es un COM)

Ahora la pregunta que te haces en este punto es: ¿de donde viene la funcion que imprime los caracteres?
La funcion, cual sea, tendra que hacer referencia a la cadena que esta siendo impresa, localizada en 24FCh. y ¿cual es la unica forma en la que (un programador normal, que yo la verdad no soy tan normal...) se haria esto? Utilizando su RVA como parametro, es decir, poniendola en la pila. Un compilador corriente lo haria asi:

Código
  1. MOV AX, 24FCh
  2. PUSH AX

La codificacion de MOV AX, 24FCh es B8 FC 24. Por tanto hay que buscarlo:



Luego basta con analizar el codigo maquina en busca de la logica de una funcion principal.

En línea

fary
Moderador
***
Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: Encontrar la funcion main en un binario
« Respuesta #3 en: 2 Junio 2020, 22:20 pm »

Si lo quieres hacer desde depurador es la primera función que se muestra al cargar el ejecutable.

Si lo quieres hacer desde código, lee sobre el formato PE.

https://foro.elhacker.net/analisis_y_diseno_de_malware/formato_pe-t446963.0.html

IMAGE_OPTIONAL_HEADER   -> AddressOfEntryPoint

https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_optional_header32

saludos.
En línea

Un byte a la izquierda.
ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Encontrar la funcion main en un binario
« Respuesta #4 en: 3 Junio 2020, 17:56 pm »

@fary
AddressOfEntryPoint y la direccion de inicio de la funcion "main" son dos cosas diferentes, el primero no tiene porque ser necesariamente el segundo (y casi nunca lo es).

@marax
Con IDA y Ghidra es muy sencillo localizar la funcion main en el listado de funciones.
Por otra parte si lo quieres manualmente, como ya mencionaste, localizando referencias en instrucciones a cadenas dentro del ejecutable es una forma muy utilizada para localizar zonas de codigo y funciones en general. Tambien puedes hacer "stalk walking" en el caso que lo estes depurando, o incluso puedes usar ciertas llamadas a funciones como guia para llevarte a la funcion main, la cual casi siempre esta algunas lineas mas abajo de estas. En este caso entre las que serian usadas con mas probabilidad tienes "kernel32.GetCommandLineX", "kernel32.GetEnvironemStringX" o si usa los runtimes de c++ "__getmainargs" y "__p__environ", finalmente "kernel32.ExitProcess" o "_cexit" probablemente te pueden llevar justo unas instrucciones despues de la salida de la funcion main

Saludos
En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
Usuario887


Desconectado Desconectado

Mensajes: 310


Ver Perfil
Re: Encontrar la funcion main en un binario
« Respuesta #5 en: 3 Junio 2020, 20:56 pm »

localizando referencias en instrucciones a cadenas dentro del ejecutable es una forma muy utilizada para localizar zonas de codigo y funciones en general.
No se si alegrarme de redescubrir la rueda... en la comunidad hacker parece moralmente ilegal.

finalmente "kernel32.ExitProcess" o "_cexit"
Esto es realmente mas logico y eficiente que lo que yo estaba haciendo. Leerlo se sintio como una epifania.

Muchas gracias por tu ayuda.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
FUncion main y Funcion Winmain
Programación C/C++
mapers 1 2,569 Último mensaje 5 Febrero 2011, 15:44 pm
por oPen syLar
Parámetros en main y función Sleep()
Programación C/C++
Saberuneko 5 4,681 Último mensaje 14 Junio 2012, 16:07 pm
por 0xDani
paso de parametros a la funcion main y archvos pbm « 1 2 »
Programación C/C++
kikian94 10 5,288 Último mensaje 24 Noviembre 2013, 18:26 pm
por kikian94
Función que sólo sirve por separado en el int main
Programación C/C++
Kraiback 1 1,975 Último mensaje 30 Julio 2016, 23:36 pm
por AlbertoBSD
La derivada de la función int main(argc, char* argv[]) es igual a cero.
Programación C/C++
massif.exe 7 3,535 Último mensaje 12 Julio 2021, 11:48 am
por fzp
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines