Fallo de segmentacion

Iniciado por _niu, 25 Agosto 2011, 19:29 PM

0 Miembros y 1 Visitante están viendo este tema.

_niu

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.


#include <stdio.h>

int main()
{
   int (*pfn)();
   char codigo[]={
       0x55,//0
       0x48,//1
       0x89,//2
       0xe5,//3
       
       0xb8,//4
       0x01,//5 <-- esto lo voy a cambiar.
       0x00,//6
       0x00,//7
       
       0x00,//8
       0xc9,//9
0xc3
   };    
   pfn = &codigo[0]; //ERROR, ESTA LINEA ME DA ERROR
 
   printf("Valor retornado por f antes ... f() = %d\n",pfn());
   codigo[5] = 0x10;
   
   printf("Valor retornado por f despues f() = %d\n",pfn());
   
return 0;
}

-----
edite, toy en 64 bits jejejeje
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";

_niu

incluso castee esa parte:

pfn = (int (*)())  &codigo[0];


pero nada, no queire andar
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";

BlackZeroX

#2
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



#include <stdio.h>

int main() {
    int (*fncDinamic)();
    char OpCodes[]= {0x55,0x48,0x89,0xe5,0xb8,0x01,0x00,0x00,0x00,0xc9,0xc3};
    fncDinamic = (int(*)())OpCodes;
    printf("Valor retornado por f antes ... f() = %d\n", fncDinamic());
    OpCodes[5] = 0x10;
    printf("Valor retornado por f despues f() = %d\n", fncDinamic());
    return 0;
}



Dulces Lunas!¡.
The Dark Shadow is my passion.

_niu

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.
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";

_niu

CitarEn 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!!!!!
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";

BlackZeroX

Cita de: _niu en 26 Agosto 2011, 11:35 AM

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!¡.
The Dark Shadow is my passion.

_niu

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
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";

_niu

(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. (:
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";

Karman

Cita de: _niu en 26 Agosto 2011, 19:17 PMjejeje 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

_niu

Cita de: Karman en 28 Agosto 2011, 04:51 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!
std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";