secretos registro reactivacion numero llamar linea codigos clientes atencion asterisco assembly x86-64

assembly - registro - numero de atencion a clientes at&t*



¿Qué significa un asterisco*antes de una dirección en el ensamblaje x86-64 de AT & T? (7)

¿Qué significa la siguiente línea?

... 401147: ff 24 c5 80 26 40 00 jmpq *0x402680(,%rax,8) ...

¿Qué significa el asterisco frente a la dirección de la memoria? Además, ¿qué significa que cuando falta el método de acceso a la memoria, es el primer valor de registro?

Por lo general, es algo así como ("% register",% rax, 8), pero en este caso no tiene el primer registro.

¿Algun consejo?


Como escribió Necrolis, la sintaxis de Intel lo hace un poco más obvio, pero RTN es realmente más claro. La línea

jmpq *0x402680(,%rax,8)

se describiría en RTN por:

RIP <- M[0x402680 + (8 * RAX)]

donde M es la memoria del sistema.

Como tal, podemos escribir la forma general jmpq *c(r1, r2, k) , donde c es una constante inmediata, r1 y r2 son registros de propósito general k es 1 (predeterminado), 2, 4 u 8:

RIP <- M[c + r1 + (k * r2)]


En realidad, esta es la tabla calculada jmp , donde 0x402680 es la dirección de tabele y rax es índice de 8 bytes (qword).


Es la sintaxis de ensamblaje de AT & T:

  • la fuente viene antes del destino
  • Los sufijos mnemotécnicos indican el tamaño de los operandos ( q para quad, etc.)
  • los registros están prefijados con % y valores inmediatos con $
  • las direcciones efectivas están en la forma DISP(BASE, INDEX, SCALE) (DISP + BASE + INDEX * SCALE)
  • operandos de salto / llamada absolutos indicados con * (a diferencia de IP relativo)

Por lo tanto, tiene un jmpq para saltar a la dirección absoluta que está almacenada en %rax * 8 + 0x402680 , y es una palabra cuádruple larga.


Es un salto a una dirección contenida en la memoria. La dirección se almacena en la memoria en la dirección rax*8+0x402680 , donde rax es el valor actual de rax (cuando se ejecuta esta instrucción).


Obtener las cosas en la sintaxis de Intel siempre aclara las cosas:

FF24C5 80264000 JMP QWORD PTR [RAX*8+402680]


jmpq es solo un salto no condicional a una dirección dada. La ''q'' significa que estamos tratando con palabras cuádruples (64 bits de largo).

*0x402680(,%rax,8) : esta es una manera de escribir una dirección en el ensamblaje x-86. Tiene razón al decir que generalmente hay un registro antes de la primera coma, pero aún sigue las mismas reglas si no se especifica ningún registro.

El formato funciona de esta manera: D(reg1, reg2, scalingFactor) donde D representa el desplazamiento. El desplazamiento es básicamente solo un número entero. reg1 es el primer registro o base. reg2 es el segundo registro y scalingFactor es uno de 2, 4, 8 (quizás incluso 1, pero no estoy seguro de eso). Ahora, puede obtener su dirección simplemente agregando los valores de esta manera: Desplazamiento + (valor en reg1 ) + scalingFactor * (valor en reg2 ).

No estoy completamente seguro de para qué sirve el asterisco delante de la dirección, pero supongo que significa que el valor de desplazamiento se almacena en esa dirección.

Espero que esto ayude.


Ejemplo mínimo para aclarar las cosas:

.data # Store he address of the label in the data section. symbol: .int label .text # Jumps to label. jmp *symbol label:

Sin * , saltaría a la dirección del symbol en la sección .data y segfault.

Siento que esta sintaxis es un poco inconsistente, porque para la mayoría de las instrucciones:

mov symbol, %eax mov label, %eax

ya mueve los datos en el symbol dirección, y $symbol se usa para la dirección. La sintaxis de Intel es más consistente en este punto, ya que siempre usa [] para la desreferencia.

El * es, por supuesto, una mnemotécnica para el operador de desreferencia C *ptr .