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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Fallo de segmentacion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Fallo de segmentacion  (Leído 5,459 veces)
_niu

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Fallo de segmentacion
« 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


« Última modificación: 26 Agosto 2011, 12:56 pm por _niu » En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
_niu

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Fallo de segmentacion
« Respuesta #1 en: 25 Agosto 2011, 22:01 pm »

incluso castee esa parte:
Código
  1. pfn = (int (*)())  &codigo[0];
  2.  

pero nada, no queire andar


En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Fallo de segmentacion
« Respuesta #2 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!¡.
« Última modificación: 26 Agosto 2011, 07:48 am por BlackZeroX▓▓▒▒░░ » En línea

The Dark Shadow is my passion.
_niu

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Fallo de segmentacion
« Respuesta #3 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.
En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
_niu

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Fallo de segmentacion
« Respuesta #4 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!!!!!
En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Fallo de segmentacion
« Respuesta #5 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!¡.
En línea

The Dark Shadow is my passion.
_niu

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Fallo de segmentacion
« Respuesta #6 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
En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
_niu

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Fallo de segmentacion
« Respuesta #7 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. (:
En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
Karman


Desconectado Desconectado

Mensajes: 673



Ver Perfil WWW
Re: Fallo de segmentacion
« Respuesta #8 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
En línea

_niu

Desconectado Desconectado

Mensajes: 34



Ver Perfil
Re: Fallo de segmentacion
« Respuesta #9 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!
En línea

std::cout<<Mi wiki personal<<"Nada es inalcanzable\n";
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[ASM]Syscall no me funciona + fallo de segmentacion
ASM
ny0x 5 4,619 Último mensaje 14 Junio 2009, 19:38 pm
por ny0x
Fallo de segmentación!!
Programación C/C++
<[(x)]> 6 3,739 Último mensaje 13 Julio 2010, 06:44 am
por nicolas_cof
Fallo en segmentación inexplicable (al menos para mi)
Programación C/C++
Gallu 5 3,154 Último mensaje 18 Julio 2010, 00:21 am
por nicolas_cof
Fallo de segmentación
Programación C/C++
W0lFy 2 4,014 Último mensaje 21 Octubre 2010, 01:09 am
por W0lFy
[?] Fallo de segmentación - C
Programación C/C++
8789poli 3 4,644 Último mensaje 14 Diciembre 2010, 19:50 pm
por 8789poli
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines