Доброго времени суток. Прошу немного разъяснить, так как запутался при обучении. В разных источниках по-разному расположены сегменты в памяти процесса. Например в одном источнике стек начинается с 0хс0000000, а в другом источнике с 0х08048000 и растет до нуля. При этом в первом источнике в интервале с 0х08048000 до 0 расположен сегмент кода. Я под отладчиком посмотрел и вроде второй вариант правильный, но решил уточнить тут
Часто понятие сегмента и региона памяти слито воедино, изза чего путаница. Сегмент в данном случае это регион описываемый дескриптором, через селектор которого происходит к региону обращение. Тоесть например усекается пользовательское ап именно атрибутами дескриптора, а не его лимитом. Один и тотже регион памяти может быть и сегментом данных и кода, в зависимости от селекторов, через которые обращение к региону происходит, более того сегменты данных и кода в NT имеют нулевые базы. К стеку применяется ASLR.
Во-первых, спасибо за ответ. Но есть пара вопросов. То есть одни и те же "нули и единицы" , хранящиеся в таком регионе, могут трактоваться и как данные, и как код? насколько я знаю, рандомизацию можно отключить? Куда стек по умолчанию распределится в таком случае?
Если идёт речь о логическом адресе в плоской модели "в памяти процесса", то первый вариант рулит, а о чём тут пишут не пойму, да для юзер-мод оно и не надо только растёт в обратном направлении
china_boy Какая вам разница где будет выделен стек. Адрес его не фиксирован и не может быть фиксирован, так как NT мультизадачная ось.
Clerk ну стек первичного потока располагался по одному и тому же адресу (в данной версии оси) пока не придумали рандомизацию. а знать этот адрес иногда полезно для атак. ну не точный адрес, но хотя бы порядок. в какой части памяти локализован стек
Clerk > Просто выбирается свободный регион в ап подходящего размера. все не так просто... допустим, есть указатель на функцию, допустим, что в результате ошибки программера в программе есть баг, позволяющий атакующему обнулять любой байт, но только один. вопрос -- можем ли мы указатель на код преваратить в указатель на стек. допустим так же что поток -- один. если мы знаем где код, а где стек, то мы можем ответить на этот вопрос и, сооветсвенно, наоборот.
Да. Например, по описанной ниже kaspersky причиной. с помощью bash можно сделать скрипт, который будет брутом определять расстояние между буфером в стеке и адресом возврата. В любом случае буфер близок к esp, оттуда можно попытаться копать. Соответственно можно воспользоваться NOP-цепочкой, ес-но простейшая IDS сразу детектирует по этой сигнатуре. Что касается адреса самого шелкода, то обязательно ли его помещать в стек?... Ведь буфер может быть очень мал...Поэтому _возможно_ лучше пойти в обход, чем решать вопросы с aslr и не исполняемым стеком. kaspersky правильно сформулировал, меня больше порядок интересует и сл-но приблизительные адреса. Вариант ниже? --------------------------------------------------------------------- Здесь ядро и прочее 0xc0000000 -------------------------------------------------------------------- | stack | |____________________________________________________________ | | |--------------------------------------------------------------------- | общие библиотеки 0х40000000|____________________________________________________________ | ........... куча _____________________________________________________________ .bss _____________________________________________________________ данные иницализированные 0х08048000 ______________________________________________________________ код 0 ------------------------------------------------------------------------
Немного не так в линукс: --------------------------------------------------------------------- Здесь ядро и прочее 0xbfffffff -------------------------------------------------------------------- | environment variables |____________________________________________________________ | stack |______________________________________________________________ | heap | ______________________________________________________________ | |.bss,.data,.text 0х08048000 ______________________________________________________________ хз что, смотрите в отладчике 0 ------------------------------------------------------------------------ (c) "Programming from ground up"
Я так и не прочитал что там сверху писали =) Но примерно могу по памяти ответить. Адрес шелкода не обязательно помещать в стек. Об unix системах, точнее о том как эксплойты к ним писать рассказано доходчиво тут "Разработка средств безопасности и эксплойтов" вроде где угодно терь можно скачать. ( Под винь, страниц 10 наверное "Защита от взлома: сокеты, эксплойты , шелл-код"
Этот участок не используется. Дырка. Адрес расположения .code определяет ld. После чего загрузчик грузит его туда. Поэтому программа может начать выполняться в этом участке памяти, а не стандартно с 0х08048000. Ну я шелкод просто для примера привел.
china_boy > Соответственно можно воспользоваться NOP-цепочкой, > ес-но простейшая IDS сразу детектирует по этой сигнатуре. 1) не так уж она хорошо детектиться (много ложных срабатываний) 2) что мешает юзать другие однобайтовые команды типа inc/dec r32 ? > Что касается адреса самого шелкода, то обязательно ли > его помещать в стек?... Ведь буфер может быть очень мал... зависит от ситуации... можно и не в стек. можно засунуть во флешь (swf) и JIT его откомилит да еще и положит в исполняемый блок памяти (прощай DEP)! но не всегда есть свобода выбора куда и что ложить...