|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 29, 2004 11:44:47 Binary digit, wasm`овцы!!! И крутого вам кодинга! a(n) и b(n) в качестве нумерации! У меня некоторая загвоздка. Крис Касперски "техника и философия хакерских атак, Записки Мыща". В сей книге присутствует Дао рег.за- щит, которое также выложено и на данном сайте! В коде исполнителя есть место, где формируется рег. номер присутвует следующий код: a1 lea ecx, [esp+0Ch] a2 mov [esp+14h], al a3 mov edx, [esp+14h] Чтобы узнать судьбу команды а1, мы смотрим выше и формируем: b1 sub esp, 10h b2 push edi b3 mov edi, ecx b4 lea ecx, [esp+4] b5 call j_??0CString@@QAE@XZ ; CString::CString(void) b6 lea ecx, [esp+0Ch] b7 mov dword ptr [esp+1Ch], 0 b8 call j_??0CString@@QAE@XZ ; CString::CString(void) b9 lea ecx, [esp+8] b10 mov byte ptr [esp+1Ch], 1 b11 call j_??0CString@@QAE@XZ ; CString::CString(void) Назовем ячейку в а1, как var_04h. Момент после выполнения b2 назовем Моментом А! К сему моменту стек будет выглядеть: (младшие адреса) * * на этих четырех байтах * распложено значение edi * <----- esp в Момент А (смотреть действие push по Юрову) - ; отделим чтоб непутаться * * здесь расположена наша * var_04h * <--[esp+04h] - * * эту переменную будем * называть var_03h * <--[esp+08h] - * * var_02h * * <--[esp+0ch] - * * var_01h * * <--[esp+10h] - * * * *<------на это место esp указывал до команды b1 (старшие адреса На стр.44, листинг 29, есть выделенная команда lea ecx,[esp+08h] у нас это b9. Именно этой командой Автор хочет сказать, что действия произво- дятся с var_04h, но помоему этим он обращается к var_03h и на са- мом деле к var_04h обращается команда b4! Может скажете что я неправ и вчем? Буду благодарен! |
|
|
Дата: Май 29, 2004 15:38:06 > (смотреть действие push по Юрову) в мануалах от Интела приведен псевдокод Push'а - лучше смотреть его 1B:401599 lea ecx,[esp+4] - это var_4, которая описана как "переменная, расположенная по смещению 4 от начала кадра стека". здесь под "вершиной кадром" понимается ESP (кадр-то плавающий!) ага! я теперь понял, что вам непонятно. команда sub esp,10 открывает кадр, а push edi смещает его на 4h, на самом деле смещается не кадр, а так называемая "дельта" - расстояние между вершиной кадра и значением esp в текущей позиции. но при написании я рещил от дельты отказаться (чтобы все не запутывать), взяв за основу верщины кадра текущее значение esp. т.е. у меня вершина кадра - то, на что указывает esp, а не вовсе не начало области локальных переменных. поэтому переменная var_4 - лежит по смещению 0 от веришины истинного кардра, открытого SUB ESP,10, но по смещению 4, от кадра "сплавленного" push edi, и именно поэтому она var_4. ИДА (которой, кстати говоря, я не просил никого пользоваться! ведь мы в айсе!!!) называет ее [esp+20h+var_1C], а 20 - 1C = 4, т.к. все-таки при желани можно разобраться ;) действительно, этот момент я хреново объяснил, т.к. счел его самоочевидным. в следующей версии это будет исправлено (с благодарностью злобному прерываюнию, которое вовсе даже не злобное, а очень даже милое и полезное прерывание такое). |
|
|
Дата: Май 29, 2004 21:39:15 Kaspersky Подведем итог. до действия команды sub esp,10, esp имел значение назовем это значение esp(нач.). >команда sub esp,10 открывает кадр Назовем этот момент Моментом Б И кадр - это все что между esp(нач.) и Моментом Б. Правильно мыслю? Или esp(нач.) - esp(тек.)? Или же от Момента Б до esp(тек.)? К чему больше склоняюсь, хоть и извращение это! > push edi смещает его на 4h Как и прежде буду называть его Моментом А esp после Момента Б вы стали называть "вершиной", а до Б кем вы его считаете? Между Моментами А и Б поменялось расстояние его как я понял вы называете "Дельтой"(что привело вас к этому названию я нез- наю). |
|
|
Дата: Май 29, 2004 22:03:26 > И кадр - это все что между esp(нач.) и Моментом Б. Правильно мыслю? приавильно! > Или esp(нач.) - esp(тек.)? частично. тут уже начинаются терминологические разнгласия, что считать кадром, а что нет. одни считают кадром все, что открыл sub (разницу между значением esp при входе в функции и значением после sub), другие - разницу между значением при входе в функцию и текующим значением. лично мне симпатичнее первое, но тут не без сложностей. sub'а вообще говоря может и не быть, оптимизирующие компиляторы могут использовать одну или несколько инструкций push, поэтому в отсуствие sub'а мы не может быстро отличить push, сохраняющий регистр, от push'а, открывающего кадр, поэтому первая методика выходит неуниверсальна, зато логична. так что все-таки рекомендуется отталивается от текущего значения esp, принимая его за вершину кадра (поэтому такой кадр и называется плавающим). в hackers disassembling uncovered на которую я уже ссылался этот вопрос рассмотрен во всех подробностях. > Или же от Момента Б до esp(тек.)? К чему больше склоняюсь, хоть и извращение это! это уже дельта - т.е. расстояние между вершиной кадра и esp. в книжке про иду все распиано. ведь Ида эту дельту автоматически вычисляет ;) > esp после Момента Б вы стали называть "вершиной", а до Б кем вы его считаете? кхм. esp _всегда_ указывает на вершину стека. как я уже сказал, в книге допущена неточность. там не стек, а кадр, что порождает неоднозначность. > Между Моментами А и Б поменялось расстояние его как я > понял вы называете "Дельтой"(что привело вас к этому > названию я незнаю). дельта общеприятое обозначение разности. это не меня к ней привело. это - греков. |
|
|
Дата: Май 29, 2004 22:50:56 >hackers disassembling uncovered на которую я уже ссылался >этот вопрос рассмотрен во всех подробностях. Кабы там по русски было бы, а так я до зимы буду сидеть пока не переведу смысл! ;( Понимаю ингишь нужен, но времени очень мало! :'( Вы вот тут в книге 1b:401598 push edi [+20h] И говорите от начала кадра стека, если за начало принять esp(нач.), то это [-14h]! 10 sub и 4 push! При чем здесь +20h? Теперь еще пара вопросов: Дельта входит в кадр или нет? - Думаю что да! Посмотря выше куда указывал esp в b1, эта переменная не является же частью кадра?! |
|
|
Дата: Май 30, 2004 02:04:31 > Кабы там по русски было бы, а так я до зимы буду сидеть пока не переведу смысл! но ведь когда-то надо начинать ;) > но времени очень мало! :'( и с каждой секундой его становится все меньше и меньше ;( > Вы вот тут в книге 1b:401598 push edi [+20h] очепятка. должно быть 10h, смещение указано на момент выполнения команды > Дельта входит в кадр или нет? - Думаю что да! дельта эта разница, как она может входить? ;) я про что толкую? если принять за вершину плавающего фрейма ESP, тогда дельта равна нулю. если же жестко закрепить фрейм за sub'ом, тогда дельта равна разнице между текущим значением esp и вершиной карда. дельта может быть как положительной так и отрицательной, тогда зная дельту, зная смещение относительно esp мы можем понять кое-что. ну вот например: sub esp, 10h ; --> delta = 0; frame := esp push edi ; --> delta -= -4; lea ecx,[esp+4] ; --> [esp + 4] == [frame + 4 - delta] == [frame + 0] т.е. es+4 указывает на перменную, лежащую на вершине фрейма. а теперь вместе с дельтой отслеживаем изменение esp: sub esp, 10h ; --> delta = 0; esp = 0; push edi ; --> delta -= -4; esp -= 4; ... как видно, esp меняется синхронно с дельтой и если его принять равным нулю на выходе команды sub, то дельта вырождается, именно поэтому я решил ее неиспользовать... |
|
|
Дата: Май 30, 2004 10:41:17 Подведение итогов 2: Про моменты смотреть выше. Картина стека: (младшие) <-----такое чувство, что ты отсюда взял esp в листинге 29, но тогда непонятно push edi[+10h], в буке push edi[+20h] * * значение edi * * <---esp(Момент А) - * * * var_04h * <esp(Момент Б) - * * * * - * * * * - * * * * <-----esp(нач.) Еще в квадратных скобках ты указываешь плюсы а не минусы, а это от младших к старшим. Ткни указкой где на картинке начало? И в какую сторону считать от старших к младшим(это минус) или наоборот? Если ты за начало взял esp(нач.), то push edi [+10h], правильней бы было [-10h]! А var_04h не по +08h, а по -0ch! |
|
|
Дата: Май 30, 2004 14:58:31 |
|
|
Дата: Май 31, 2004 13:20:36 Kaspersky Я склоняюсь к последней версии выраженной на bmp выше! cs:4015b5 lea ecx,[esp+8h] cs:4015be call MFC42!_021C { push esi mov esi,ecx call MFC42!_0486 [ mov eax,5f4d1b60 ret ] mov eax,[eax] mov esi,[eax] mov eax,esi pop esi ret } .004015C3: 8D442404 lea eax,[esp][04] Протокол о демонах: ORD_021C: ??0CString@@QAE@XZ (public: __thiscall CString::CString(void)) ORD_0486: ?AfxGetEmptyString@@YGABVCString@@XZ (class CString const & __stdcall AfxGetEmptyString(void)) Мне интересно откуда взялось 5f4d1b60 ? И на кой икс оно нужно? И за чем из-ЗА одной комнды делать отдельную функцию ? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.070 |