Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: xv0 en 9 Abril 2013, 18:20 pm



Título: Llamar dirección
Publicado por: xv0 en 9 Abril 2013, 18:20 pm
Hola

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

Código
  1. pushq $0x050f01b0
  2. callq *%rsp

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

Código:
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:

Código
  1. (*(void(*)()) code)();

 :huh: :huh:

Código
  1. mov    $0x600980,%edx
  2. mov    $0x0,%eax
  3. callq  *%edx



Título: Re: Llamar dirección
Publicado por: 0xDani en 9 Abril 2013, 18:29 pm
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.


Título: Re: Llamar dirección
Publicado por: xv0 en 9 Abril 2013, 18:49 pm
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.

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

Un saludo.


Título: Re: Llamar dirección
Publicado por: 0xDani en 9 Abril 2013, 20:14 pm
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
  1. mov    $0x0,%eax


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

Código
  1. xor      %eax,%eax


Título: Re: Llamar dirección
Publicado por: xv0 en 9 Abril 2013, 21:37 pm
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.

Código
  1. (*(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.