• XSS.stack #1 – первый литературный журнал от юзеров форума

Антивм и SIDT

varwar

El Diff
Забанен
Регистрация
12.11.2020
Сообщения
1 383
Решения
5
Реакции
1 537
Пожалуйста, обратите внимание, что пользователь заблокирован
Попалась мне давеча очень старая тема под названием RedPill, которую я решил перепроверить на процессоре Intel с Windows 10 x64 и VMWare Workstation 15 Pro.

Если коротко, то некотрые байты из регистра idtr, возвращаемые ассемблерной инструкцией SIDT будут отличаться на ВМ и хосте. Согласено мануалу Intel, в 64 битном режиме sidtсохраняет в выделенную память 10 байт; 8 байт (база) + 2 байта (лимит).

Под отладчиком ситуация выглядела следующим образом:

Код:
Before reboot

Phys1:  ff 0f 00 10 00 00 00 f8 ff ff
Phys2:  ff 0f 00 10 00 00 00 f8 ff ff
Virt1:  ff 0f 00 f0 b2 32 00 f8 ff ff
Virt2:  ff 0f 00 f0 b2 32 00 f8 ff ff

After reboot
Virt1:  ff 0f 00 f0 8e 09 01 f8 ff ff
Phis1:  ff 0f 00 10 00 00 00 f8 ff ff

Где Virt - это значения, полученные с виртуалки, а Phys соответственно с хоста.
Выборка была сделана до и после ребута.

Из этой маленькой выборки видно, что на хосте отличаются 5 и 6 байты и что немаловажно - они занулены. Мое предположение - это было сделано в качестве устранения утечки адреса IDT-таблицы.
На этом предположении и построена антивм техника для x64 битовых систем. Интересно, как дела обстоят с дргуими версиями гипервизоров, ОС и процессоров.

C:
#include <stdio.h>
#include <intrin.h>

int main()
{
    char idtr[10];
    memset(idtr, 0, sizeof(idtr));
    __sidt(&idtr);
    if (idtr[4] != 0x00 && idtr[5] != 0x00) {
        printf("This code was executed in VMWare\n");
    }
    else {
        printf("This code was ececuted on a host machine\n");
    }
    return 0xbabababa;
}


idtr2.png
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
С Windows 7 все куда интереснее (Windows 7 x64, VirtualBox 6.1.28 r147628):
Вполне возможно, что на 7 еще был баг и ядерный адрес IDT раскрывался полностью.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
atavism можешь еще дописать эту функцию, воткнуть вызовы после принтов и скинуть сюда дамп с 7ки?

C:
void DumpHex(const void* data, size_t size) {
    char ascii[17];
    size_t i, j;
    ascii[16] = '\0';
    for (i = 0; i < size; ++i) {
        printf("%02X ", ((unsigned char*)data)[i]);
        if (((unsigned char*)data)[i] >= ' ' && ((unsigned char*)data)[i] <= '~') {
            ascii[i % 16] = ((unsigned char*)data)[i];
        }
        else {
            ascii[i % 16] = '.';
        }
        if ((i + 1) % 8 == 0 || i + 1 == size) {
            printf(" ");
            if ((i + 1) % 16 == 0) {
                printf("|  %s \n", ascii);
            }
            else if (i + 1 == size) {
                ascii[(i + 1) % 16] = '\0';
                if ((i + 1) % 16 <= 8) {
                    printf(" ");
                }
                for (j = (i + 1) % 16; j < 16; ++j) {
                    printf("   ");
                }
                printf("|  %s \n", ascii);
            }
        }
    }
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
В Windows Sandbox'е не работает. Значения такие же, что и на хосте.

redpill2.png
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх