En la parte anterior, nos detuvimos justo en el momento de decidir qué método utilizar para cifrar los datos, es decir, Petya o Mischa. En este artículo veremos qué sucede cuando Petya ejecuta.
Al principio, la muestra intentará obtener la unidad física en la que está instalado Windows. Para hacerlo, llama a una rutina que etiqueté: GetWindowsPhysicalDrive
¡Conviértete en un ingeniero inverso certificado!
Obtenga capacitación práctica en vivo sobre análisis de malware desde cualquier lugar y conviértase en un analista certificado de ingeniería inversa. Comienza a aprender
Comienza conociendo la unidad lógica en la que está instalado Windows.
Luego envía una solicitud de E/S al volumen de destino para obtener el número de disco. El resultado es la unidad física que contiene la instalación de Windows, por ejemplo: .PhysicalDrive0. Esto se usará para abrir un identificador de la unidad, como puede ver en la siguiente figura, y escribir en sus sectores.
A continuación, el ejemplo consulta la información de la partición del disco enviando la solicitud IOCTL_DISK_GET_PARTITION_INFO_EX al dispositivo de disco subyacente. Al regresar de DeviceIoControl, OutBuffer contiene una estructura PARTITION_INFORMATION_EX. La muestra solo está interesada en el estilo de partición para determinar cómo se realizará la sobrescritura (el campo PartitionStyle)
enumeración typedef _PARTITION_STYLE
{
PARTICIÓN_ESTILO_MBR = 0,
PARTITION_STYLE_GPT = 1,
PARTICIÓN_ESTILO_RAW = 2
} ESTILO_PARTICIÓN;
Si DeviceIoControl falla, el estilo de partición sin formato se utiliza de forma predeterminada.
Si el estilo de partición es MBR, se abre un identificador en el disco físico y el puntero del archivo se establece al comienzo del primer sector del disco (el MBR) antes de leerlo en el búfer.
El MBR leído almacenado en el búfer luego se cifra mediante XOR en cada uno de los 512 bytes con 0x07.
Luego vemos que se realiza una asignación y la sección .xxxx (excepto los primeros 16 bytes) se copia a la memoria asignada. Lo que Petya hace a continuación es modificar los primeros 512 bytes de la memoria asignada para que la única diferencia entre ella y el primer sector del disco sea el área del código de arranque. Comienza desde el campo de firma de Windows en el desplazamiento 0x1b8 y copia todos los bytes hasta el final de la cuarta entrada de la partición.
A continuación, ingresamos a un bucle donde cada sector, comenzando con el segundo, por supuesto, se lee en un búfer de memoria, se realiza una operación XOR con 0x07 y luego se vuelve a escribir en la unidad física. El circuito se detiene en el sector 34.
Visualizado usando WinHex Disk Editor
Cuando salimos del bucle, la muestra comienza sobrescribiendo el MBR con el construido antes en la región de memoria asignada.
La muestra ahora pasa al sector 34 y escribe el código (y los datos) importantes a los que se saltará cuando se encienda la máquina; se necesitan 18 sectores exactamente.
Luego Petya escribe una estructura construida previamente en esta misma rutina en el sector 54. Esta estructura contiene la siguiente información:
- La clave de cifrado
- Enlaces de cebolla TOR
- Un valor de 64 bits utilizado en el cifrado.
- La cadena del código de descifrado se muestra al usuario.
Esta información será utilizada por el código que se ejecutará después de que se inicie la máquina para cifrar la MFT (tabla maestra de archivos).
Después de escribir 512 bytes de 0x07 en el sector 55, Petya escribe el MBR cifrado (XORed con 0x07) en el sector 56 del disco. ¡Y eso es! Petya fue dueño de la máquina con éxito, y todo lo que necesita hacer ahora es apagarla haciendo BSOD intencionalmente a la máquina.
Lo hace ajustando primero su token para que tenga el privilegio SeShutdownPrivilege y luego llamando a NtRaiseHardError de ntdll con STATUS_HOST_DOWN.
Echemos un vistazo al gestor de arranque ahora:
Lo que hace el gestor de arranque (en sub_38) es leer 32 sectores del disco comenzando desde el sector 34 en la dirección 0x8000 y luego salta al código allí.
Se verifica un byte para ver si es la primera vez que se ejecuta. Si eso es cierto, el chkdsk falso se muestra mientras Petya cifra el MFT. Posteriormente, este byte se pone a cero y, cuando la máquina se reinicia, Petya solicita una clave de descifrado.
Recursos:
Descarga de muestra: http://goo.gl/zxUTrC