Как побороть этот трюк в диззасемблере?

Тема в разделе "WASM.BEGINNERS", создана пользователем 2Hard2Forget, 7 дек 2019.

Метки:
  1. 2Hard2Forget

    2Hard2Forget Member

    Публикаций:
    0
    Регистрация:
    27 авг 2018
    Сообщения:
    86
    У меня есть такой код,который использует "ret" для запутывания IDA
    Код (C):
    1. int func_0x8b4c55a0()
    2. {
    3.     __asm
    4.     {
    5.         call $ +5
    6.         add[esp],5
    7.         ret
    8.     }
    9.  
    10. }
    11. int main()
    12. {
    13.     char cVar1;
    14.     if ((cVar1 = func_0x8b4c55a0(), cVar1 == -0xe) || 1)
    15.     {
    16.         int a = 5;
    17.         int b = 3;
    18.         int c = 0;
    19.         c = a + b;
    20.     }
    21.     return 0;
    22. }
    upload_2019-12-7_18-15-56.png
    Как можно решить эту проблему с запутыванием IDA?
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Ну очевидно же, что солвера, который бы сложил 401005 и 5 и корректно обработал код, не хватает. Решается простеньким скриптом, который это сделает вместо иды, красивого решения с sp-analysis в случае с идой скорей всего не получится, но референс нарисовать куда надо можешь ты сам этим скриптом.
     
    Indy_ нравится это.
  3. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Странно что старый и платный диз не может обработать наложение ветвей. Суть в том, что первая ветвь описана cfg, второй проход приводит к корреляции по адресам, так как часть инструкции уже описана. Если ветвление не на начало инструкции, то это уже новая ветвь; обычная ошибка дизов, точнее недоработка. Есчо это связано с гуем, для каждой такой ветви нужен новый листинг.

    Код (Text):
    1. 5.        call $ +5
    2. 6.        add[esp],5
    3. 7.        ret
    - вычисление адреса перехода, в этом случае диз не причём(этим солверы занимаются как сказали выше). Если иначе кодировать modr/m то возможно получится корреляция fg.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    интересно посмотреть, обрабатывает ли такую ситуацию Гидра и Радаре2... в понедельник посмотрю, если не забуду...
     
  5. Indy_

    Indy_ Well-Known Member

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

    Что именно, вычисление адреса(add [esp],Ib : 4b) или корреляции gp ?
    Интересно второе, простейшие вычисления врядле интересны.
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Можешь не смотреть, точно так же.
    --- Сообщение объединено, 8 дек 2019 ---
    Ключевое слово "дизассемблер". В иде солвера вообще нет, там как я понял стандартные специфические для архитектуры конструкции как-то могут обрабатываться, но обычно самим дизасм-модулем, в большинстве модулей иды даже этого нет. Ильфак предоставляет ажно два неплохих скриптовых интерфейса, чтобы все подобные вопросы ими решать, но кнопкодавы с мышедвигателями все время ждут большой красной кнопки "сделать хорошо".
     
  7. Indy_

    Indy_ Well-Known Member

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

    Динамика пофиг, а статику(второе) доделали ?
    Можно в N-листингах смотреть диз, если есть N-ветвей с наложением по адресам ?
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Я через слово не понимаю что здесь написано.
     
  9. Indy_

    Indy_ Well-Known Member

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

    Я ведь выше обьяснил. Проблемы две, это динамика(вычисление адреса ветви, это решить в общем невозможно) и корреляция ветвей, это когда указатель не на начало инструкции, что образует новую ветвь. Если в примере тс изменить mrm компоненту и смещение в call, тогда управление пойдёт по новой ветви не с начала инструкции. Конструктор использует диапазон адресов всегда(а не указатели), в этом и проблема.
     
  10. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.323
    ясно, жаль...
     
  11. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Проблема в том, что ида изначально дизассемблер. Да, она создает в статике референсы, если может (почти никогда не утруждается рассчетами, есть в инструкции смещение или абсолютный адрес - будет референс, нету - не будет), но ничего подобного приведенной в первом посте конструкции она обрабатывать не станет.
     
  12. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    диз" это сокращение от дизассемблер", что есчо не ясно. fg ~ cfg ~ gp ~ Control Flow GraPh.
     
  13. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    "N-листинг" и "наложение по адресам" что такое?
     
  14. Indy_

    Indy_ Well-Known Member

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

    Может быть одна ветвь внутрь инструкции, а может быть несколько. И так есчо рекурсивно. Для отображения каждой ветви нужен новый листинг. Я думал что понятно написал, толи я туплю, либо вы не внимательно читаете.
     
  15. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Как инструкция дизасмнута, такой она и будет, ветвь внутрь инструкции на ней и заканчивается. В гидре это можно разогнуть: создать 1-2 дополнительных оверлея (область памяти новом адресном пространстве) и для таких кривых 'cfg'-референсов менять адресное пространство на адресное пространство оверлея или второго оверлея или обратно в основное. Декомпиль от таких плясок скорей всего с ума сойдет, но 'cfg' насухую анализировать можно.
     
  16. Indy_

    Indy_ Well-Known Member

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

    Нужно было предусмотреть это фишку при разработке, многоуровневый диз. А не фиксить потом, это уже врядле возможно. jmp $+1 и заканчивается диз :sarcastic:
     
  17. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Пятнадцатируровневый диз, нужный нулю целых пяти десятых процентам пользователей. Это и не только это решается тупо двумерным адресным пространством:
    [​IMG]
     
  18. Indy_

    Indy_ Well-Known Member

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

    Не все блокноты реверсят, этот трюк весьма часто встречается.
     
  19. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.995
    Из легальных применений этого всего только антивирусники, чудо что вообще такая штука как ида состоялась как коммерческий продукт.
     
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    https://wasm.in/threads/razorvat-graf.26360/ свежак :sarcastic:

    f13nd,

    > чудо что вообще такая штука как ида состоялась как коммерческий продукт.

    Я всегда думал что вам она нравится.