Поиск OEP, установка bp на esp-4

Тема в разделе "WASM.BEGINNERS", создана пользователем Vadimcg, 29 сен 2017.

Метки:
  1. Vadimcg

    Vadimcg Member

    Публикаций:
    0
    Регистрация:
    5 апр 2017
    Сообщения:
    32
    Читаю Криса Касперски "Исскуство дизасемблирования". В 38 главе прочитал, что один из способов поиска OEP в запакованном приложении являеться установка точки останова на esp-4... Немогу понять почему esp-4.. ? esp -4 по идее даст нам какую-нибуть локальную переменную...
     
  2. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Перед переходом в OEP нужно сделать стек таким как у оригинальной программы. Если сравните упакованную и оригинальную, стек различается.

    https://exelab.ru/faq/EP_и_OEP
    https://habrahabr.ru/post/102126/
    https://forum.antichat.ru/threads/raspakovka-obschij-podxod.27741/
    http://websait.net.ru/xa089/114/5.htm
    https://wasm.in/threads/poisk-oep-ustanovka-bp-na-esp-4.32304/#post-392585
    http://www.gfs-team.ru/articles/read/135

    Вы посмотрите Введение в отладку с нуля, все вопросы должны отпасть сразу.
     
    _edge, sniper и Mikl___ нравится это.
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    Vadimcg,

    Вся память ниже esp это не стек.

    Поиск OEP в общем случае происходит так:

    Получается поток инструкций(IF) каким то образом - трассировка, эмуляция или через визор.
    Эвристически обнаруживается инициализация апп, это например вызов некоторых известных апи. Так как до этого момента код выполнялся произвольный, то он может быть получен из накопленной трассы.

    Понятие OEP весьма расплывчато, EP может не быть вовсе, к примеру апп начинается выполняться в дллмайн, далее отработает загрузчик и вызовет апп EP. Что в таком случае считать OEP - это можно сделать зная только частный, исходный механизм обработки апп.
     
  4. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Человек не занимается виксами зачем Вы ему это всё рассказываете?:hunter:
     
  5. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Таки шо вы ему голову морочите?

    По вопросу:
    Упаковщик должен вернуть после распаковки программе состояние с тем же самым стеком и состояниями регистров, как было в Entry Point. Чтобы произвести распаковку упаковщик должен использовать регистры, использовать стек. Поэтому, чтобы иметь возможность вернуть все как было, он сохраняет состояние регистров в локальные переменные (да, esp-4 - это локальная переменная). Поэтому, когда он закончит, чтобы вернуть стек к исходному состоянию, он обратиться в т.ч и к значению, лежащему в esp-4. Когда он его окончательно уберет из стека, то, скорее всего, это будет значить что распаковка окончена.
     
    yashechka нравится это.
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    yashechka,

    Какие есчо виксы ?

    njeen,

    > Таки шо вы ему голову морочите?

    Что это значит ?

    Тоесть вы можите предложить какой то более общий принцип нахождения EP ?

    #5 - абсолютный бред в каждом утверждении.
     
  7. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Это означает, что вы слишком усложняете ответ, хотя вопрос был проще и более конкретный.

    Здесь не была речь о наиболее общем способе, спрашивалось, в чем суть "одного из способов поиска OEP в запакованном приложении" , а именно - установки bp на esp-4.

    На мой взгляд, логично и не бредово - раскрывает суть метода. Если считаете иначе - аргументируйте.
     
    yashechka нравится это.
  8. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    njeen,

    > спрашивалось, в чем суть "одного из способов поиска OEP в запакованном приложении" , а именно - установки bp на esp-4.

    Обычно апп не обращается ниже стека. А посему ваш вопрос частный и касается конкретного примера. Так как этот семпл вы не привели, то предсказать ничего нельзя. Нет тут пифии :preved:
     
  9. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    Готов поспорить, что TC ничего не понял из этого.
     
  10. yashechka

    yashechka Ростовский фанат Нарвахи

    Публикаций:
    90
    Регистрация:
    2 янв 2012
    Сообщения:
    1.449
    Адрес:
    Россия
    А чито это всё? Почемку так заумно?
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    yashechka,

    Вроде ведь просто описал, без каких то заумных понятий и абстракций. Слой пакера иногда вообще нельзя снять, так как он единое целое с апп.

    То что выше сказали чушь - потому что:

    > esp-4 - это локальная переменная

    Это не переменная и не на стеке, я говорил. Зачем мониторить обращения в стековую память за пределы стека представить сложно, видимо это конкретный трюк", который нельзя рассматривать его не имея.
     
  12. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Да вот и нет. Вполне может быть локальной переменной. По входу в функцию мы имеем в esp указатель на адрес возврата. Esp - вершина стека. Локальные переменные отсчитываются от некоторого адреса (addr - 4*N), обычно от ebp, но это может быть и его вершина в esp, поэтому локальная переменная не обязана быть в пределах от его начала до вершины, особенно в leaf функциях, которые никаких других из себя не вызывают.
     
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    njeen,

    Не может быть переменной, так как эта часть стека используется для обработки ошибок/прерываний. Если возникнет исключение, то данные будут утеряны.

    > но это может быть и его вершина в esp,

    Смещение при адресации через esp может быть только положительным в пределах стека [esp + N]. Указатель стека это не GPR, в который можно загрузить произвольное значение и использовать его далее.
     
  14. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Ну хорошо. Но код упаковщика скорее всего будет формировать свой кадр стека, сдвигая его вершину (не будет же он это все на регистрах делать), и esp-4 уже может быть локальной переменной для его фрейма
     
  15. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    njeen,

    Возьмите любой пакер, запустите под визором/трассировкой, вы обнаружите что обращений ниже esp нет, только когда разворачивается исключение, но это не выборка данных(DF), а загрузка инфы ядром на стек.

    > и esp-4 уже может быть локальной переменной для его фрейма

    Ничего не понятно, покажите реальный пример.
     
  16. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    Взять что-нибудь простое, - например, calc.exe, накрытый upx.

    Что upx делает в первую очередь при распаковке - pushad, сдвигая тем самым вершину стека.
    Код (Text):
    1.  
    2. ;-- entry0:
    3.         0x010efb20      60             pushal
    4.         0x010efb21      be00000d01     mov esi, section.UPX1       ; section.UPX1
    5.         0x010efb26      8dbe0010f3ff   lea edi, [esi - 0xcf000]
    6.         0x010efb2c      57             push edi
    7.     ,=< 0x010efb2d      eb0b           jmp 0x10efb3a
    8.     |   0x010efb2f      90             nop
    9.     |   0x010efb30      8a06           mov al, byte [esi]
    10.     |   0x010efb32      46             inc esi
    11.     |   0x010efb33      8807           mov byte [edi], al
    12.  
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.788
    njeen,

    Ну и где тут обращения ниже стека ?

    push загружает на стек данные и смещает указатель стека на размер данных.
     
  18. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    139
    Адрес:
    Ташлинск
    При чем тут ниже стека? Сохраненное становится локальной переменной.