es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo obtener el valor en el registro RSP utilizando la librería C++ Capstone?

Estoy intentando escribir una biblioteca (llamada mylib.so) utilizando la biblioteca Capstone C++ y LD_PRELOAD para encontrar dónde se encuentran las instrucciones del sistema en un archivo binario (este archivo binario contiene algunas escrituras del sistema en ensamblador inline) y qué sistema es ese (por ejemplo, SYSopen, SYSread, etc.).

Utilizo el comando LD_PRELOAD=mylib.so para ejecutar un archivo binario y realizar este análisis binario en “tiempo de ejecución” y no estáticamente.

Ya puedo encontrar y desensamblar las instrucciones del sistema utilizando libcapstone:


/* código pseudóximo */
csh handle;
cs_insn *insn;

csopen(CSARCHX86, CSMODE64, &handle);
csoption(handle, CSOPTDETAIL, CSOPTON);
csdisasmiter(handle, &code, &size, &addr, insn);

/* luego obtener información del operando de ‘insn->detail->x86.operands’ */

Pero el problema es que no puedo identificar qué tipo de sistema es si el valor que se mueve a %rax no es un operando IMM. Por ejemplo, si el resultado del desensamblado es:

/* el resultado se imprime con printf(), la sintaxis puede no ser correcta */

mov rax, 39 –> almacena el valor 39 en rax
syscall

Puedo saber que este sistema es getpid() ya que __NR_getpid == 39. Pero si el resultado del desasambleado es:


// la sintaxis del ensamblador aquí puede no ser correcta, Capstone devuelve:
// op[0]->type == X86_OP_REG, op[0]->reg == X86_REG_RAX
// op[1]->type == X86_OP_MEM, op[1]->mem.base == X86_REG_RSP, op[1]->mem.disp == 8
mov rax, 0x8(rsp) –> almacena el valor en la dirección sp+8 a rax
syscall

(Lamento la confusión en el código de ensamblador anterior, todavía estoy aprendiendo ensamblador)

Aquí está mi pensamiento, por favor corríjame si estoy equivocado. Creo que debería ser posible obtener el valor en este %rsp ya que el archivo binario objetivo ya debería estar mapeado en memoria (pero aún no está siendo ejecutado debido a LD_PRELOAD).

También asumo que el valor de %rsp en 0x8(%rsp) anterior no es el valor del puntero de pila “actual” cuando se está ejecutando mi código de Capstone.

¿Lo entiendo correctamente? ¿Cómo debo obtener la dirección que el registro RSP va a contener durante la ejecución de la instrucción mov %rax, 0x8(%rsp)?

¡Muchas gracias por cualquier ayuda!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás tratando de identificar la llamada al sistema que se realiza en un binario mediante la biblioteca Capstone y LD_PRELOAD. Has conseguido desensamblar correctamente las instrucciones de la llamada al sistema utilizando libcapstone, pero tienes dificultades para identificar la llamada al sistema cuando el valor no es un operando inmediato.

    Has asumido correctamente que debería ser posible obtener el valor en el registro %rsp ya que el binario objetivo ya debería estar mapeado en memoria. También has asumido correctamente que el valor del registro %rsp en 0x8(%rsp) no es el valor del puntero de la pila “actual” cuando se ejecuta tu código Capstone.

    Para obtener la dirección que va a contener el registro RSP durante la ejecución de la instrucción mov %rax, 0x8(%rsp), puedes utilizar la función cs_reg_read() de la biblioteca Capstone. Esta función te permitirá leer el valor del registro RSP en el momento de la ejecución de la instrucción.

Comments are closed.