# стратегия выделения стека - загадочные страницы

Тема в разделе "WASM.HEAP", создана пользователем kaspersky, 30 дек 2007.

  1. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    мыщъх грызет стек. тут все не так просто. и очень сильно интересно. вот, например, кто бы мог подумать, что EXCEPTION_STACK_OVERFLOW выскакивает когда у нас есть еще _три_ страницы стека?! одна красная (в терминологии DEC'а), другая - чтобы мы могли обработать переполнение, инсталлировав красную страницу (хинт: обработчик EXCEPTION_STACK_OVERFLOW работает в красной странице, которая уже к этому времени никакая не красная и поэтому в PAGE_GUARD установить ее не может, т.к. он сам же при этом и грохнется, следовательно, он должен установить флаг, выйти из обработчика, этот флаг подхватывает другой обработчик, находящийся в странице, следующей за красной, и устанавливает красную страницу в PAGE_GUARD. это _единственный_ способ _корректно_ обработать EXCEPTION_STACK_OVERFLOW, в противном случае он будет генерироваться _только_ _один_ _раз_!!! но это все ерунда, там еще одна интересная страница есть, которая меня интересует. мыщъх сейчас врубился как заюзать сквозной тоннельный стек один на все или несколько потоков. крысота ;)
    просьба протестить следующую программу:

    stack-mt-test.exe > out
    stack-mt-test.exe 1
    stack-mt-test.exe 2
    stack-mt-test.exe 3
    stack-mt-test.exe 4

    и запостить сюда результат (в последних четырех случаях перенаправление в файл не работает, так что грабим текст с консольного окна). получив результаты мыщъх будет рад их обсудить и показать какие хитрости есть в оптимизации памяти при создании потоков и вообще.

    особенно интересуют HT и многоядерные процессоры, а так же XP, Виста (ну вдруг у кого стоит уже?!)

    заранее всем благодарен!
     
  2. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    OS=WinXP
    HT=true
     
  3. Guest

    Guest Guest

    Публикаций:
    0
    ОСь = ХРюша
    Фичи = 2х ядерник
    P.S. Через 2 дня прогоню на своей рабочей машинке с Vista x64, XP x32/x64, Server 2003/2008, W2K.
     
  4. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    спасибо всем откликнувшимся.
    подтвердилось наличие нескольких дыр в винде (прямо в ядре!!!)
    и новые методы атаки на стек, о которых мыщъх не слыхал ранее,
    так что все идет по плану.

    просьба запустить слегка переделанный тестер, заточенный под
    многоЦПшные машины (или многоядерные :), так кое-какие есть
    особенности, ранее неучтенные.

    start cmd /c "stack-alloc-strateg.exe > stack-alloc-strateg.txt"

    файл stack-alloc-strateg.txt мне. с экрана грабить ничего не надо.
    тестер работает несколько минут, ЦП не грузит, память не отъедает.
    если кто захочет сделать машине нехорошо (но не смертельно :derisive:
    нехай раскомментирует строку следующую за "just think again"...
    сюрприз будет :derisive: ладно, не будет сюрприза, там просто в стек
    заносятся адреса возврата USER32!MessageBeep. много адресов.
    и даже после того как процесс завершен мы имеем 100% ЦП load
    (причем на уровня ядра) и все жутко тормозит некоторое время...

    хотя того же эффекта можно добиться:
    main(){for(int a=0;a<666666666; a++) MessageBeep(MB_OK);}

    только я не советую. гм. на одной машине BSOD
    (ошибка в драйвере звуковухи), на другой - дикие тормоза
    с 100% загрузкой ядра пока оно там не отпищит ;(

    так что не надо трогать обозначенную строчку ;)
    если ее не трогать, то тестер на 100% _безопасен_ для вашей машины.
    исходники, ес-но прилагаются.
     
  5. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    2 ядра
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Centrino duo
     
  7. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    У меня поосле этой комманды просто консоль стоит и ждёт чего-то, непонятно чего. Файл пуст.
    А остальные, что-то там выводит, адрески какие-то :)
     
  8. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    Hellspawn
    спасибо ;) вижу, что два, а не четыре ;)
    кстати, хороший способ подсчета ядер ;)
    и отличить 2х ядерный от HT ЦП :derisive:

    но это не главное ;) меня прикалывает как можно расширять стек.
    я тут размышлял как обойти /SAFESEH - ну это когда линкер сцука
    такая создает статические таблицы обработчиков внутри PE-Файла
    и теперь в стек SEH-обработчик не положишь. но и не надо :derisive:))

    кстати, следующая статья
    http://blogs.msdn.com/doronh/archive/2007/11/09/why-i-should-not-be-writing-applications.aspx

    меня сподвигла на поиск приложений, имеющих сходные ошибки.
    ну типа:
    case IDCANCEL:
    delete this;
    EndDialog(m_hDlg, LOWORD(wParam));
    break;

    освобождающих память, а потом ее юзающих.

    кажется (тьфу-тьфу, чтобы не сглазить) нашел в IE несколько таких ошибок.
    короче, мы просто пишем жаба-скрипт, выледяющий память и кладущий туда указатели на код, который мы хотим выполнить. (ну там не совсем указатели, там нужно имитировать некоторые структуры данных), но не в этом суть. а суть в том, что когда память освобождена у нас есть шанс "перезапись" ее до того, как к ней обратиться IE и, ес-но, передаст управление на shell-код. только эти шансы невелики, если действовать "в лоб", вот для этого мне и потребовалось изучить стратегию аллокации кучи и стека. есть шанс создать пару хороших боевых сплоитов к новому году :derisive:
     
  9. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    twgt
    спасибо!

    > А остальные, что-то там выводит, адрески какие-то :)
    мыщъх изучает стратегию выделения памяти под стек и кучу.
    в общем, вполне предсказуемая стратегия, только разная
    на одно- и многоЦПшных машинах (что вполне ожидаемо).

    до сих пор хакеры использовали переполнение стека "вниз",
    но никто не лез "вверх" (в область младших адресов), короче
    мыщъх сейчас пишет сплоиты для нескольких программ...
    и нужно было быть уверенным, что я правильно знаю стратегию
    выделения памяти даже с учетом ASLR :)

    короче, сплоит пожирает стек, снимая с него защиту и "ударяет"
    в image со всего маху, после чего модифицирует там кое-что,
    ну и.... все остальное не так интересно ;)
     
  10. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Я так и не понял
    Каким образом при вводе последовательности симвлолов скажем в адрессную строку, можно освободить стек?
     
  11. Guest

    Guest Guest

    Публикаций:
    0
  12. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    [off]
    Не, вот я не пойму почему у всех размер меньше моего?! Я и раром жал и зипом с максимальной компрессией, но всё-равно не 1-3 кб выходило[/off]
     
  13. Guest

    Guest Guest

    Публикаций:
    0
    Занимательно. Слил твой архив, распаковал, упаковал в rar метод сжатия обычный, на выходе 3 кило, потом заново но метод сжатия максимальный получил 5 кило.
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Работает в "pass #1" и завершается. Файл 0 байт.

    В аттаче WXP x64.
     
  15. CreatorCray

    CreatorCray Member

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    201
    kaspersky
    Core2Duo E4500 W2k3 Ent SP2 forced DEP
     
  16. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    twgt
    офтопик: инфа для восстановления по умолчанию врублена?
     
  17. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    kaspersky
    Если поставить на верхнюю (перед красной) страницу стека VirtualProtectEx (.. PAGE_NO_ACCESS..) как поведет себя оработчик исключения
     
  18. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
     
  19. xacid

    xacid New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2007
    Сообщения:
    4
    прочитал сорц stack-alloc-strateg - долго ржал над метками "the_same_old_song...", и т.п. - молодчег!, Pain рулит!
    ))))

    З.Ы.: Надо взять на заметку... =)
     
  20. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Vista 32-bit
    Core2 duo