Положение стека

Тема в разделе "WASM.UNIX", создана пользователем _ir4_Y_, 18 мар 2007.

  1. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    По ходу написания различных программ у меня возник один очень интересный вопрос:

    Как опаределяется начальное значение esp при запуске программы?
    Кауда ОС помещает стек определенной программы и можно ли определить его местонахождение ?

    вот)

    заранее благодарен...
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    _ir4_Y_
    Для винды в заголовках PE-формата, есть поля, скоко надо стека в нач.момент и скоко возможно всего!
    Т.е. винда соглассно этим значениям выделяет область памяти, которая и используется как стек. Если стек закончен, т.к. нач.размер может быть израсходован винда еще выделает и т.д. пока не исчерпается максимально возможное значение.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Все лежит в хидере. Стандартно линкер задает ESP=00130000 и винда выделяет под это безобразие три страницы. На низлежащие страницы винда ставит PAGE_GUARD и стек растет вниз по мере обращения.
    Выполнив команду CALL $ можно узнать по возникшему исключению, сколько максимально винда дает стека 1 процессу. У меня минимум ESP=00033000. То есть винде не жалко (00130000-00033000)/1000 = FD = 253д страниц
     
  4. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    Товарищи какая винда=)
    я про Linux спрашивал)
    пасиба конечно, но расскажите про стек в Linux и ещё мона раскадать как проги определяют где чей стек при многозадачности
    заранее благодарен
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    _ir4_Y_
    Сорри, но большинство идей по PE-формату откуда взято? С ELF-формата, вот и глянь его, там должны быть подобные поля!
     
  6. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _ir4_Y_
    Тут есть старая статья про организацию адресного пространства в Линуксе:
    http://tldp.org/LDP/khg/HyperNews/get/memory/linuxmm.html

    В последних версиях ядра (2.4.х - 2.6) стартовый адрес стека в юзере непостоянен. Видимо, это сделано чтоб насолить любителям эксплоитов :)
     
  7. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    2Quantum
    Пасиба хорошая статья!!!
     
  8. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    еще под MS-DOS была задачка написать программу, выводящую содержимое регистров на экран. под Linux/bsd решение ничем не отличается. в чем сложность?! сохраняем регистры в памяти (стеке или сегменте данных) и потом юзаем системные вызовы или стандартную библиотеку - это уже кому что по вкусу.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    pushad ?
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    оффтоп
    в каком это хидере?? в MZ такое было, а чтоб в PE...
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    тьфу, перепутал MZ-поле Initial SS:SP с полями SizeOfStackReserve & SizeOfStackCommit.
    Но суть не меняется почти )
     
  12. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    Great
    pushad - это ты еще порядок поклажи регистров знать должен, а так же - что присходит сначала - уменьшение ESP и его засовывание в стек или наоборот. так что проще засунуть регистры в сегмент данных через mov, типа
    mov [xxxxxxh],esp
    ...
    mov [yyyyyh],eax

    а потом уже их выводить на экран или, что проще в файл в двочином виде, а потом его глянуть в hexedit :)
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ESP на всех последних процах кладется на момент перед выполнением PUSHAD'а. А порядок регистров я примерно помню ;)
     
  14. kaspersky

    kaspersky New Member

    Публикаций:
    0
    Регистрация:
    18 май 2004
    Сообщения:
    3.006
    Great
    ну если тебе нужен только ESP, то pushad - это как-то... слишком мощно ;)
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ты ж сказал надо вывести все регистры? Чем pushad не вариант :) + ,конечно, отдельные push с сегментными регистрами