Autor
|
Tema: Fallo de segmentacion (Leído 5,459 veces)
|
_niu
Desconectado
Mensajes: 34
|
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
|
|
« Última modificación: 26 Agosto 2011, 12:56 pm por _niu »
|
En línea
|
|
|
|
_niu
Desconectado
Mensajes: 34
|
incluso castee esa parte: pfn = (int (*)()) &codigo[0];
pero nada, no queire andar
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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!¡.
|
|
« Última modificación: 26 Agosto 2011, 07:48 am por BlackZeroX▓▓▒▒░░ »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
_niu
Desconectado
Mensajes: 34
|
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
|
|
|
|
_niu
Desconectado
Mensajes: 34
|
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
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
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
Mensajes: 34
|
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
|
|
|
|
_niu
Desconectado
Mensajes: 34
|
(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
|
|
|
|
Karman
|
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
Mensajes: 34
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[ASM]Syscall no me funciona + fallo de segmentacion
ASM
|
ny0x
|
5
|
4,619
|
14 Junio 2009, 19:38 pm
por ny0x
|
|
|
Fallo de segmentación!!
Programación C/C++
|
<[(x)]>
|
6
|
3,739
|
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
|
18 Julio 2010, 00:21 am
por nicolas_cof
|
|
|
Fallo de segmentación
Programación C/C++
|
W0lFy
|
2
|
4,014
|
21 Octubre 2010, 01:09 am
por W0lFy
|
|
|
[?] Fallo de segmentación - C
Programación C/C++
|
8789poli
|
3
|
4,644
|
14 Diciembre 2010, 19:50 pm
por 8789poli
|
|