Llamar dirección

Iniciado por cpu2, 9 Abril 2013, 18:20 PM

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

cpu2

Hola

Cuando cargo unos bytes en el stack, y luego los llamo con un call tengo el siguiente problema.

Código (asm) [Seleccionar]
pushq $0x050f01b0
callq *%rsp


Sería una llamada a exit, crea un segmentation fault, cuando cargo los bytes en memoria igual.

PSIG  SIGSEGV SIG_DFL code SEGV_MAPERR<1> addr=0x6001d0 trapno=6

En C más de lo mismo.

Cuando miro el disassembler llama a esp, no entiendo porque no llamada a rsp, seguro que esta hay el problema.

Pero en 32 bits funciona bien.

También mirare los manuales.

Un saludo.

P.D:

(*(void(*)()) code)();

:huh: :huh:

Código (asm) [Seleccionar]
mov    $0x600980,%edx
mov    $0x0,%eax
callq  *%edx



0xDani

Quizas esos bytes estan en una zona de la memoria que no tiene permiso de ejecucion. Por ejemplo la sección .data de un ejecutable ELF, que supongo que es el tipo de ejecutable que estas usando.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

cpu2

No creo que se por el ejecutable Dani, creo que es la arquitectura como dije en 32 bits si funciona pero no en 64 bits.

CitarPSIG  SIGSEGV SIG_DFL code SEGV_MAPERR<1> addr=0x7f7ffffc92a8 trapno=6

Un saludo.

0xDani

Pues no se, de todos modos SIGSEGV significa que has accedido a una direccion de memoria a la que no tenias permiso para acceder de la forma que lo has hecho, en este caso para ejecucion, asi que mira con un debugger que permisos tiene la direccion que estas llamando.

Saludos.

PD:

Código (asm) [Seleccionar]
mov    $0x0,%eax

[broma]Creia que eras mas pro ;)[/broma]

Código (asm) [Seleccionar]
xor      %eax,%eax
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

cpu2

#4
Ahora mirare bien los manuales.

Gracias por lo de pro, pero tú no entiendes mis bromas, ni nadie  :xD.

Eso es el disassembler de C.

(*(void(*)()) code)();

Un saludo.



EI: juntando mensajes.



Todo esto funciona bien en backtrack, el problema es que utilizo OpenBSD y protege la memoria y el stack, por eso no puedo hacer esa llamada.

Un saludo.