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.

x86_64 – ¿Puede una aplicación de 64 bits en Windows ejecutar INT 2E en lugar de syscall?

Esta pregunta está relacionada con esta otra pero no llenó algunos de los vacíos que tenía, así que decidí hacerla de nuevo con algunos detalles más, y tal vez poner una recompensa en ella.

De todos modos, por lo general, si busca funciones Nt/Zw en ntdll, verá algo como:

ZwClose proc near
mov r10, rcx
mov eax, 0Fh
test byte ptr ds:7FFE0308h, 1
jnz short loc_a
syscall
retn

loc_a:
int 2Eh
retn
NtClose endp

Ahora sé que esto está comparando el desplazamiento desde KUSERSHAREDDATA y decidiendo si realizar o no una syscall vs INT 2E. Al principio pensé que INT 2E se ejecutaría si el programa en ejecución es una aplicación de 32 bits, pero después de leer un poco sobre WOW64, parece que esas aplicaciones usarían la versión de 32 bits de ntdll que no ejecuta int 2e sino que pasa por el Heaven’s Gate para llegar al kernel:

public ZwClose
ZwClose proc near
mov eax, 3000Fh ; NtClose
mov edx, offset j_Wow64Transition
call edx ; j_Wow64Transition
retn 4
ZwClose endp

Entonces, según entiendo, Wow64Transition eventualmente saltará a la versión de 64 bits de ntdll que enumeré primero, ¿verdad? Si es así, ¿es entonces cuando se ejecuta INT 2E en lugar de syscall? También me han dicho que una de las razones por las que se utiliza INT 2E es para la compatibilidad con CET, así que estoy un poco confundido acerca de INT 2E.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El fragmento de código que proporcionó está comparando el desplazamiento de KUSER_SHARED_DATA y decidiendo si se debe realizar una syscall versus una INT 2E. Esto se hace para determinar si el programa en ejecución es una aplicación de 32 bits o una aplicación de 64 bits.

    Si el programa es una aplicación de 32 bits, entonces se ejecuta INT 2E en lugar de syscall. Esto se hace para garantizar la compatibilidad con [Control-Flow Enforcement Technology (CET)][2].

    Si el programa es una aplicación de 64 bits, se ejecuta syscall. En este caso, se utiliza la versión de 64 bits de ntdll y no se ejecuta INT 2E. En su lugar, se utiliza Wow64Transition para saltar a la versión de 64 bits de ntdll.

Comments are closed.