2012-09-12 12 views
5
#include <stdint.h> 
uint64_t rip; 
int main() 
{ 
    asm(
     "movq %%rip, %0\n" : "=m" (rip) 
     ); 

    sleep(10); 
} 

Cuando puedo compilar consigo¿Por qué no puedo guardar el valor de RIP?

cc -m64 rip.c -o rip 
/tmp/ccwNbZi1.s: Assembler messages: 
/tmp/ccwNbZi1.s:12: Error: suffix or operands invalid for `movq' 
make: *** [rip] Error 1 
+3

necesarias para cortar alrededor de ella: [Obtener dirección de la instrucción actual para x86] (http: // stackoverflow. com/questions/7932287/get-address-of-current-instruction-for-x86) – Mysticial

Respuesta

11

No se puede leer (E|R)IP porque no hay x86 (/ 64) de instrucciones para leerlo directamente.

La única manera de "leer" es realizar una llamada con la instrucción CALL. Guardará la dirección de devolución en la pila y esa que puede leer.

ACTUALIZACIÓN: En el modo de 64 bits se puede explotar el RIP -respecto electrónico, por lo LEA RAX, [RIP] le dará la dirección de sí mismo en EAX. Sin embargo, otra solución es MOV RAX, $ en ensamblaje.

+3

El 'mov rax, $' sería codificado por el vinculador, eliminando independencia de posición o requiriendo una reubicación en tiempo de ejecución. Sugeriría usar 'lea rax, [rip]' en su lugar. – ughoavgfhw

+0

@ughoavgfhw No había nada en la pregunta con respecto a la dependencia de la posición (in). –

+1

Es por eso que solo estaba fuertemente * sugiriendo * it. Además, la independencia de posición es un objetivo muy común en los programas modernos, principalmente por razones de seguridad (ASLR). Al menos los compiladores/ensambladores de Apple lo requieren para programas de 64 bits. – ughoavgfhw

-1

La única forma en que puedo pensar para obtener/establecer% rip en x86_64 es usar ptrace(). A continuación se copia de la fuente de ltrace.

void* addr = ptrace(PTRACE_PEEKUSER, pid, (8 * RIP), 0); 
ptrace(PTRACE_POKEUSER, pid, (8 * RIP), addr); 

donde RIP es una macro definida en /usr/include/sys/reg.h

+0

RIP-relative 'lea' para leerlo,' jmp' para escribirlo. Esta pregunta es sobre el RIP actual del hilo, no sobre otro proceso. –

Cuestiones relacionadas