Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: _niu en 25 Agosto 2011, 19:29 pm



Título: Fallo de segmentacion
Publicado por: _niu en 25 Agosto 2011, 19:29 pm
Hola gente, les comento mi problema... en el siguiente codigo se basa en utilizar el codigo en exadecimal del fichero objeto de una fuccion que retorna 0x01. Por lo que codigo es mi codigo exadecimal, que quiero modificar en ejecucion.
El tema es que me da fallo de segmentacion en la linea señalada.
Trabajo con vim, gcc, y objdump, x64

Cual es la forma de hacer de que este bichito funcione??? Desde ya muchas gracias a los sabios.

Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.    int (*pfn)();
  6.    char codigo[]={
  7.        0x55,//0
  8.        0x48,//1
  9.        0x89,//2
  10.        0xe5,//3
  11.  
  12.        0xb8,//4
  13.        0x01,//5 <-- esto lo voy a cambiar.
  14.        0x00,//6
  15.        0x00,//7
  16.  
  17.        0x00,//8
  18.        0xc9,//9
  19. 0xc3
  20.    };    
  21.    pfn = &codigo[0]; //ERROR, ESTA LINEA ME DA ERROR
  22.  
  23.    printf("Valor retornado por f antes ... f() = %d\n",pfn());
  24.    codigo[5] = 0x10;
  25.  
  26.    printf("Valor retornado por f despues f() = %d\n",pfn());
  27.  
  28. return 0;
  29. }
  30.  
-----
edite, toy en 64 bits jejejeje


Título: Re: Fallo de segmentacion
Publicado por: _niu en 25 Agosto 2011, 22:01 pm
incluso castee esa parte:
Código
  1. pfn = (int (*)())  &codigo[0];
  2.  

pero nada, no queire andar


Título: Re: Fallo de segmentacion
Publicado por: BlackZeroX en 26 Agosto 2011, 07:31 am
cuales son estos opcodes en ASM?

        0x55,//0
        0x48,//1
        0x89,//2
        0xe5,//3

lo demas veo que es un

Mov EAX,1
Ret

los que te cite no los Reconozco... y la vdd ando corto de tiempo para revisar http://ref.x86asm.net/geek.html...

Edito:

Ami me funciono asi:

http://codepad.org/h2Jr5zwt

Código
  1.  
  2. #include <stdio.h>
  3.  
  4. int main() {
  5.    int (*fncDinamic)();
  6.    char OpCodes[]= {0x55,0x48,0x89,0xe5,0xb8,0x01,0x00,0x00,0x00,0xc9,0xc3};
  7.    fncDinamic = (int(*)())OpCodes;
  8.    printf("Valor retornado por f antes ... f() = %d\n", fncDinamic());
  9.    OpCodes[5] = 0x10;
  10.    printf("Valor retornado por f despues f() = %d\n", fncDinamic());
  11.    return 0;
  12. }
  13.  
  14.  

Dulces Lunas!¡.


Título: Re: Fallo de segmentacion
Publicado por: _niu en 26 Agosto 2011, 11:35 am
Gracias por tu respuesta BlackZeroX, pero no me ha funcionado, me da el mismo error

la cosa es:

   0:   55                        push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   b8 01 00 00 00          mov    $0x1,%eax
   9:   c9                        leaveq
   a:   c3                        retq 


el problema no se produce por lo erroneo del opcodes, sino en la asignacion del puntero del char a puntero de funcion, ya que sino el error se tendria que producir mas tarde cuando llame a la funcion. Supongo.
Pero al parecer empiezo a pensar que puede ser por estar en linux, tendria que probar en windows (no tengo xddd).

Desde ya muchas gracias.


Título: Re: Fallo de segmentacion
Publicado por: _niu en 26 Agosto 2011, 11:44 am
Citar
En muchos sistemas, este error de tiempo de ejecucion se conoce como una "falla de segmentacion"o bien una "violacion de acceso". Este tipo de error ocurre cuando el programa de un usuario intenta tener acceso a una parte de la memoria de la computadora, en la cual el programa del usuario no tiene privilegios de acceso.

Y eso es justamente lo que quiero hacer... por lo visto es un problema con linux y su seguridad, para mi ahi ta el problema. jejej conocen una artimaña para ejecutar mi "codigo" igual?

GRACIAS!!!!!


Título: Re: Fallo de segmentacion
Publicado por: BlackZeroX en 26 Agosto 2011, 18:58 pm

Pero al parecer empiezo a pensar que puede ser por estar en linux, tendria que probar en windows (no tengo xddd).


Que extraño: con mi modificacion a mi si me funciono inclusive corrio en codepad... lo probe en windows 7...

Dulces Lunas!¡.


Título: Re: Fallo de segmentacion
Publicado por: _niu en 26 Agosto 2011, 19:17 pm
jejeje gracias seguire luchando haber que onda, lo trato de hacer diferente ahora.
Uso la memoria dinamica del amigo malloc, y me aguanta el casteo, pero no la llamada a la funcion.

Igual muchas gracias..... estoy seguro de q es el SO.

(:

pd.: si alguien quiere y sabe, estoy ansioso de escuchar sus palabras.

BYEEEEE


Título: Re: Fallo de segmentacion
Publicado por: _niu en 27 Agosto 2011, 11:52 am
(up)......

me parece que lo voy a hacer con funciones dinamicas recursivas.... asi se llaman? meter la funcion dentro de si misma, y con punteros a funciones. jajaja bueno eso voy a hacer por que linux no me quiere.

espero su sabiduria todavía. (:


Título: Re: Fallo de segmentacion
Publicado por: Karman en 28 Agosto 2011, 04:51 am
jejeje gracias seguire luchando haber que onda, lo trato de hacer diferente ahora.
Uso la memoria dinamica del amigo malloc, y me aguanta el casteo, pero no la llamada a la funcion.

si no me equivoco ese es justamente el problema, tenés permisos de lectura sobre el espacio de memoria pero no de ejecución... eso en windows se puede cambiar con virtualprotect, en linux no sé.

S2


Título: Re: Fallo de segmentacion
Publicado por: _niu en 29 Agosto 2011, 02:58 am
si no me equivoco ese es justamente el problema, tenés permisos de lectura sobre el espacio de memoria pero no de ejecución... eso en windows se puede cambiar con virtualprotect, en linux no sé.

O.O un genio! gracias... un sabio. Yo ya te veo que sabes usar las apis de windows de moemoria xddd.
Encontre en analogo... mprotect.

GRACIAS! SOLUCIONADO!