Intenté "breakpoint [número de línea]", "breakpoint filename.s: line_number" pero no funcionan. Actualmente tengo que pasar por todas las líneas, y es una molestia

0
Joshua Leung 4 oct. 2019 a las 01:58

1 respuesta

La mejor respuesta

Como alternativa , puede:

1) muestra la memoria con instrucciones de montaje con

di

Con argumentos explícitos

Si necesitas llegar más lejos

di -c 1000 ;

Si necesita desmontar una dirección específica

di -s <address>

2) establezca un punto de interrupción de la memoria con

br s -a <memory address you found in previous step>

Otra alternativa es un poco más destructiva pero en realidad más sencilla, lo que puede ser útil o no en su caso. Puede realizar una llamada al sistema no válida en su código ensamblador. Su programa continuará felizmente la ejecución, pero lldb se interrumpirá en la siguiente instrucción después de la llamada al sistema con SIGSYS / EXC_SYSCALL. No ha especificado si está apuntando a x86-64 o arm, por lo que la configuración será ligeramente diferente.

Para x86-64 tendrías

syscall

Suponiendo que su registro rax no sea una llamada al sistema válida, es decir, en el rango 0x2000xxx, la parte destructiva incluirá:

1) Poner a cero los 32 bits superiores del registro rax

2) r11 se convertirá en rflags

3) rcx se convertirá en rip (lo usa el kernel de XNU para regresar al espacio de usuario desde syscall), sin embargo si da un solo paso rcx se convertirá en rsp como lo mencioné aquí

Para 32 bits y armado de 64 bits , puede realizar una llamada al sistema con:

svc 0x80 

Por cierto, cualquier número ^ de 1 byte funcionará, pero por convención es 0x80. 32bit usa r12 para el número de llamada al sistema. 64 bits usa x16. Más información aquí & aquí. Entonces, los rangos básicamente válidos son 0x0 - 0x0xxx. Incluso las llamadas al sistema no válidas parecen afectar a x0 y x1 (para 64 bits, ya que no tengo un dispositivo de 32 bits para probar). Así que siempre que tenga en cuenta que x0 y x1 se verán afectados después de la llamada al sistema y tengan x16 que es una llamada al sistema no válida, está listo para comenzar.

ACTUALIZAR Para @PeterCordes, el excelente comentario de otra alternativa para x86 es:

int3

Es decir, trampa del depurador

Equivalente de brazo es

trap

La diferencia frente al enfoque syscall es que la ejecución del programa después de int3 / trap continuará si y solo si el depurador está adjunto y lldb El comando continue sigue, el valor agregado es que no afectará los registros en absoluto . En el enfoque de syscall, el programa también continuará la ejecución sin un depurador adjunto con los registros afectados anteriormente.

2
Kamil.S 25 oct. 2019 a las 08:42