Re[8]: кривая оптимизация cl .NET2k3, swallow_redpill()
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 29.09.05 14:57
Оценка: 8 (3)
Здравствуйте, gear nuke, Вы писали:

GN>ЗЫ: Что-то я сам не догадался написать, может эта умная девушка ещё и красивая , вместе можно горы свернуть .


... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
HgLab: Mercurial Server and Repository Management for Windows
Re[6]: кривая оптимизация cl .NET2k3, swallow_redpill()
От: eton  
Дата: 28.09.05 18:56
Оценка: 1 (1)
GN>Угу, пришли не форум и сказали: "смотрите, какой правильный и без ошибок код, а вот компилятор у MS кривоей" . На самом деле, MSVC делает всё в рамках стандарта, а вот в коде есть попытка играться с undefined behavior (см. подпись _Winnie в тему ).
ок, убили надо было другую тему писать

GN>Базовые принципы виртуалок — вести себя в точности так же, как реальное железо. Если кто-то нашёл дыру в сквозной эмуляции, то подправят парсер опкодов, и будут эту команду эмулировать софтверно, что бы она возвращала то, что нужно.

imho если бы они полностью эмулировали все железо то винда бы грузилась неделю (кажется http://sourceforge.net/projects/bochs так делает), насколько хватает моих скромных знаний в accelerated режиме, функции виртуалок заключаться в изоляции от host OS и прозрачной обработке всех исключений, а ring3 код течет без задержек

GN>Немного подумав, пришёл к выводу, что Джоанна опять перемудрила с hardcoded адресами структур ядра . Этот код не всегда будет работать на вполне аппаратных Pentium IV с HT. Там 2 IDT! Причём, 2я таблица находится где-то по адресам 0xFXXXXXXX.

VMware рулит — VM->Setting->Options->Advanced->Disable acceleration обрубает Джоанину пилюлю

GN>Так что, welcome to real world .

ок, я так и озаглавил баг репорт Джоанне
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: кривая оптимизация cl .NET2k3, swallow_redpill()
От: _Winnie Россия C++.freerun
Дата: 25.09.05 11:38
Оценка: +1
Здравствуйте, eton, Вы писали:

А зачем извраты?

int swallow_bluepill()
{
    unsigned char x[6];
    __asm
    {
        sidt x
    }
    return (x[5]>0xd0) ? 1 : 0;
}


А предыдущий код не работал бы на WinXP SP2, он бы не позволил исполнить код в стеке.


А для чего этот код? Если в пользовательском приложении, то не понимаю для чего.
Правильно работающая программа — просто частный случай Undefined Behavior
кривая оптимизация cl .NET2k3, swallow_redpill()
От: eton  
Дата: 25.09.05 09:11
Оценка:
работает если функция ((void(*)())&rpill)() прыгает на содержимое rpill в стэке, не работает если та же функция прыгает на мусор в стэке
int swallow_redpill()
{
    unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
    *((unsigned*)&rpill[3]) = (unsigned)m;
    ((void(*)())&rpill)();
    return (m[5]>0xd0) ? 1 : 0;
}


cl /nologo /O1 /c /Zl /Zp1 — не работает
cl /nologo /O2 /c /Zl /Zp1 — не работает
cl /nologo /Og /c /Zl /Zp1 — не работает
cl /nologo /Ot /c /Zl /Zp1 — работает
cl /nologo /Od /c /Zl /Zp1 — работает
printf("%X\n", rpill) в любом месте — работает независимо от опций компилятора
rpill is static — работает независимо от опций компилятора
Re[2]: кривая оптимизация cl .NET2k3, swallow_redpill()
От: eton  
Дата: 25.09.05 23:07
Оценка:
это интересная проверка запускается программа под эмулятором (VirtualPC, VMWare, etc. возвращает 1) или нет (возвращает 0), под XPSP2 в юзермоде она работает нормально, защита стека там по умолчанию только для системных приложений и только при аппаратной поддержке процессора (код был взят с http://invisiblethings.org Joanna Rutkowska)
Re[3]: кривая оптимизация cl .NET2k3, swallow_redpill()
От: gear nuke  
Дата: 26.09.05 08:02
Оценка:
Здравствуйте, eton, Вы писали:

E>это интересная проверка запускается программа под эмулятором (VirtualPC, VMWare, etc. возвращает 1) или нет (возвращает 0), под XPSP2 в юзермоде она работает нормально,


E>защита стека там по умолчанию только для системных приложений и только при аппаратной поддержке процессора


По-моему, правильнее сказать "защита стека для всех приложений включается по умолчанию только при аппаратной поддержке процессора". Если аппаратной поддержки нет — можно включить руками.

E>(код был взят с http://invisiblethings.org Joanna Rutkowska)


2й раз вижу недовольных кодом Джоанны. Первый раз это был автор PHide , который говорил, что использование hardcoded адресов структур ядра — моветон.

E>работает если функция ((void(*)())&rpill)() прыгает на содержимое rpill в стэке, не работает если та же функция прыгает на мусор в стэке

E>
E>int swallow_redpill()
E>{
E>    unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
E>    *((unsigned*)&rpill[3]) = (unsigned)m;
E>    ((void(*)())&rpill)();
E>    return (m[5]>0xd0) ? 1 : 0;
E>}


E>cl /nologo /O1 /c /Zl /Zp1 — не работает


Это эквивалентно /Og /Os /Oy /Ob2 /Gs /GF /Gy

E>cl /nologo /O2 /c /Zl /Zp1 — не работает


Это — /Og /Oi /Ot /Oy /Ob2 /Gs /GF /Gy

E>cl /nologo /Og /c /Zl /Zp1 — не работает


E>cl /nologo /Ot /c /Zl /Zp1 — работает

E>cl /nologo /Od /c /Zl /Zp1 — работает

При этих ключах оптимизация не используется.

Даваёте посмотрим, что делает компилятор с ключём /Og:
?swallow_redpill@@YAHXZ PROC NEAR           ; swallow_redpill
; Line 2
    push    ebp
    mov ebp, esp
    sub esp, 12                 ; 0000000cH
; Line 5
    lea eax, DWORD PTR _rpill$[ebp]
    call    eax
; Line 6
    mov dl, BYTE PTR _m$[ebp+5]
    mov cl, 208                 ; 000000d0H
    cmp cl, dl
    sbb eax, eax
    neg eax
; Line 7
    mov esp, ebp
    pop ebp
    ret 0
?swallow_redpill@@YAHXZ ENDP                ; swallow_redpill

На мой взгляд, он постаупает правильно, поскольку содержимое rpill нигде не используется!

Теперь решение:
int swallow_redpill()
{
    volatile unsigned char m[2+4], rpill[sizeof("\x0f\x01\x0d\x00\x00\x00\x00\xc3")];
    rpill[0] = '\x0f';
    rpill[1] = '\x01';
    rpill[2] = '\x0d';
    *((volatile unsigned*)&rpill[3]) = (unsigned)m;
    rpill[7] = '\xc3';
    ((void(*)())&rpill)();
    return (m[5]>0xd0) ? 1 : 0;
}

?swallow_redpill@@YAHXZ PROC NEAR           ; swallow_redpill
; File h:\zen\cc\test\stackexec.cpp
; Line 2
    push    ebp
    mov ebp, esp
    sub esp, 12                 ; 0000000cH
; Line 4
    mov BYTE PTR _rpill$[ebp], 15       ; 0000000fH
; Line 5
    mov BYTE PTR _rpill$[ebp+1], 1
; Line 7
    lea eax, DWORD PTR _m$[ebp]
    mov BYTE PTR _rpill$[ebp+2], 13     ; 0000000dH
    mov DWORD PTR _rpill$[ebp+3], eax
; Line 8
    mov BYTE PTR _rpill$[ebp+7], 195        ; 000000c3H
; Line 9
    lea ecx, DWORD PTR _rpill$[ebp]
    call    ecx
; Line 10
    xor eax, eax
    mov al, BYTE PTR _m$[ebp+5]
    mov dl, 208                 ; 000000d0H
    cmp dl, al
    sbb eax, eax
    neg eax
; Line 11
    mov esp, ebp
    pop ebp
    ret 0
?swallow_redpill@@YAHXZ ENDP                ; swallow_redpill

Не самый лучший образец кода, поэтому я бы просто переписал всё на __asm.


PS: Точнее — забил бы. Завтра эту дыру в виртуалках всё равно закроют .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: кривая оптимизация cl .NET2k3, swallow_redpill()
От: eton  
Дата: 26.09.05 23:34
Оценка:
GN>2й раз вижу недовольных кодом Джоанны. Первый раз это был автор PHide , который говорил, что использование hardcoded адресов структур ядра — моветон.
почему же, я доволен

GN>PS: Точнее — забил бы. Завтра эту дыру в виртуалках всё равно закроют .

вряд ли, так как затрагивает базовые принципы виртуальных машин, поэтому и названо так матрично претенциозно swallow_redpill()
Re[5]: кривая оптимизация cl .NET2k3, swallow_redpill()
От: gear nuke  
Дата: 27.09.05 02:57
Оценка:
Здравствуйте, eton, Вы писали:

GN>>2й раз вижу недовольных кодом Джоанны. Первый раз это был автор PHide , который говорил, что использование hardcoded адресов структур ядра — моветон.

E>почему же, я доволен

Угу, пришли не форум и сказали: "смотрите, какой правильный и без ошибок код, а вот компилятор у MS кривоей" . На самом деле, MSVC делает всё в рамках стандарта, а вот в коде есть попытка играться с undefined behavior (см. подпись _Winnie в тему ).

GN>>PS: Точнее — забил бы. Завтра эту дыру в виртуалках всё равно закроют .

E>вряд ли, так как затрагивает базовые принципы виртуальных машин

Базовые принципы виртуалок — вести себя в точности так же, как реальное железо. Если кто-то нашёл дыру в сквозной эмуляции, то подправят парсер опкодов, и будут эту команду эмулировать софтверно, что бы она возвращала то, что нужно.

E>поэтому и названо так матрично претенциозно swallow_redpill()


Немного подумав, пришёл к выводу, что Джоанна опять перемудрила с hardcoded адресами структур ядра . Этот код не всегда будет работать на вполне аппаратных Pentium IV с HT. Там 2 IDT! Причём, 2я таблица находится где-то по адресам 0xFXXXXXXX.

Так что, welcome to real world .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: кривая оптимизация cl .NET2k3, swallow_redpill()
От: gear nuke  
Дата: 28.09.05 19:31
Оценка:
Здравствуйте, eton, Вы писали:

E>в accelerated режиме, функции виртуалок заключаться в изоляции от host OS и прозрачной обработке всех исключений, а ring3 код течет без задержек


На сколько мне известно, ring3 код парсится перед выполнением, и непосредственно выполняются только безопасные с точки зрения VM места.

GN>>Так что, welcome to real world .

E>ок, я так и озаглавил баг репорт Джоанне

Хотя это скорее не багрепорт, а инфа о design flow.

ЗЫ: Что-то я сам не догадался написать, может эта умная девушка ещё и красивая , вместе можно горы свернуть .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[9]: кривая оптимизация cl .NET2k3, swallow_redpill()
От: gear nuke  
Дата: 29.09.05 16:29
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>


Мда, я старый деревенский чурбан меньше всего ожидал увидеть ссыку с главной страницы сайта . Видимо гугл плохо на мозги влияет, мы не ищем лёгких путей (с) .

Оказывается, есть ещё:

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.