Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: Villano en Enero 09, 2015, 05:20:29 am

Título: Llamada a funciones y arrays...
Publicado por: Villano en Enero 09, 2015, 05:20:29 am
Hola gente.

Recordando un poco lo de la llamada a funciones he visto que a la función se le pasa un puntero que es la dirección de la función, es decir, donde está ubicada y luego pensé ••• ¿y si le paso un arreglo C me lo permitiría? La respuesta fue que lo compilo pero después hubo problemas = (.

Acá hay información sobre punteros a funciones:
Spoiler
http://www.ib.cnea.gov.ar/~icom/web/puntfunc.html (http://www.ib.cnea.gov.ar/~icom/web/puntfunc.html)
http://c.conclase.net/curso/?cap=020d (http://c.conclase.net/curso/?cap=020d)
Acá esta el código
Spoiler
Código: [Seleccionar]
//este es otro main de otro programa
char bomb[]={ 0x55,0x89,0xe5,0x83,0xec,0x18,
              0xc7,0x44,0x24,0x0C,0x00,0x00,0x00,0x00,
              0xC7,0x44,0x24,0x08,0x00,0x00,0x00,0x00,
              0xC7,0x44,0x24,0x04,0x00,0x00,0x00,0x00,
              0xC7,0x04,0x24,0x00,0x00,0x00,0x00,
              0xE8,0x66,0x08,0x00,0x00,
              0x83,0xEC,0x10,
              0xB8,0x00,0x00,0x00,0x00,
              0xc9,0xc2,0x10,0x00};
void prueba( void (*f)(void))
{
    f();

}
int main()
{
 double s;
  int i;
prueba((void *)bomb);

  return 0;
}
Acá van unas capturas del ollydbg... al parecer todo empieza a ir mal cuando llamo al array...
Spoiler
(http://sia1.subirimagenes.net/img/2015/01/09/15010905090829998.png)


Spoiler
(http://sia1.subirimagenes.net/img/2015/01/09/150109050910289685.png)

utilizo gcc 4.8 en windows. Necesito una patada en alguna direccion que me oriente para saber que esta pasando aca.
Título: Re:Llamada a funciones y arrays...
Publicado por: Calantra en Enero 09, 2015, 10:07:34 am
A mi eso que tu pones no me compila usando gcc3.4.5. He hecho lo mismo pero bien.
El arreglo contiene basicamente el código asm de una función de suma :

Código: [Seleccionar]
int suma(inta, int b) {
return a+b;
}

Creo un puntero y lo defino como puntero a función con parametros.
Luego le paso el valor del puntero del arreglo. Para que no de error, defino este puntero como puntero a función con parámetros :  (int(*)(int,int))bomb;
Dado que el puntero apunta a una función podemos usarlo como tal : pf1(4,3)

Código: [Seleccionar]
/* 004013CE  Ú$ 55             PUSH EBP */
/* 004013CF  ³. 89E5           MOV EBP,ESP */
/* 004013D1  ³. 8B45 0C        MOV EAX,DWORD PTR SS:[ARG.2] */
/* 004013D4  ³. 0345 08        ADD EAX,DWORD PTR SS:[ARG.1] */
/* 004013D7  ³. 5D             POP EBP */
/* 004013D8  À. C3             RETN  */
#include <cstdlib>
#include <iostream>

char bomb[]={ 0x55,
0x89,0xe5,
0x8b,0x45,0x0c,
0x03,0x45,0x08,
0x5d,
0xc3};


int main(int argc, char *argv[]) {
    int (*pf1)(int a,int b);
pf1=(int(*)(int,int))bomb;
printf ("La suma es:%i\n",pf1(4,3));
system("PAUSE");
    return EXIT_SUCCESS;
}

Espero que te sirva.
Salu2.
Título: Re:Llamada a funciones y arrays...
Publicado por: Villano en Enero 09, 2015, 07:03:57 pm
Copie tu codigo calantra y win7 seguia diciendome que el programa habia dejado de funcionar... Pero era porque leia datos de la memoria asignada al bufer lo cual no se permite si esta activado el DEP(Data execution prevent) que impide la ejecucion de datos en esas areas de memoria, al parecer es una medida para manejar exploits y cosas asi.
El problema esta solucionado.