· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› crackme.58dd2d69h!

Посл.отвђт Сообщен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

Kaspersky
Кажется до меня дошло посмотри Аттач!

1248783782__pic_stack.zip


Дата: Май 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