линейный дизасм - как достать аргумент инструкции универсально?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Pirotexnik, 4 Jun 2021.

  1. Pirotexnik

    Pirotexnik Member

    Joined:
    13 Oct 2010
    Messages:
    376
    Likes Received:
    73
    Reputations:
    38
    Доброго времени суток.
    Я не нашел более подходящего раздела для этого топика. На реверс он не тянет, имхо. Задам тут, если что - прошу перенести в корректный раздел. Спасибо.


    Суть:
    Есть функция, которая заинлайнена. В этой функции есть мнемоника `cmp`. На двух ядрах, которые были под рукой, 3 и 4, она находится по смещению 18 байт от пролога.
    До нее в аккумулятор попадает значение из
    gs:0x1234. Определенная PER_CPU структуа, вернее указатель на ее начало.

    В обоих случаях сравнивается $rdi и конструкция вида [rax*чтототам + 0x0ff537].

    Мне, кровь из носу, нужен этот оффсет.

    Я портировал в ядроу intel xed, то есть, могу юзать дизасм длинн, и в принципе пргументы тоже, по идее, могу достать.

    Загвоздка в том, что на разных ядрах будут незначительные отличия, в щависимости от компилятора, флагов и еще миллиона факторов.

    Вопрос: как бы этот процесс сделать автоматическим?

    Спасибо
     
    alexzir likes this.
  2. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,491
    Reputations:
    25
    Может я чего не понял... но можно же вроде искать просто паттерн mov eax, ***** ?
     
  3. mankurt13

    mankurt13 Well-Known Member

    Joined:
    18 Oct 2019
    Messages:
    378
    Likes Received:
    1,537
    Reputations:
    3
    Зависит от того, как процедура выглядит и что в ней меняется. sib-байт, которым закодировано [rax*index+base] не такая уж и частая конструкция, чтобы тупо пройдясь по коду от пролога и уперевшись в первое попадание в такую инструкцию не заявить с огромной долей вероятности, что она и есть искомая.
     
    Pirotexnik likes this.
  4. Pirotexnik

    Pirotexnik Member

    Joined:
    13 Oct 2010
    Messages:
    376
    Likes Received:
    73
    Reputations:
    38
    Ну, не совсем. В rax попадает значение из селектора $gs. Это, на линуксе, селектор PER_CPU памяти. Да и оффсет на структуру current_task у меня и так есть.

    Понял. А вот когда ftrace или kprobe инструментируют код 5ти байтовым нопом, в самом начале пролога, это не даст фолс-позитив?

    Попробую - отпишу
     
  5. mankurt13

    mankurt13 Well-Known Member

    Joined:
    18 Oct 2019
    Messages:
    378
    Likes Received:
    1,537
    Reputations:
    3
    Отфильтруй по опкоду.
     
    Pirotexnik likes this.
  6. Pirotexnik

    Pirotexnik Member

    Joined:
    13 Oct 2010
    Messages:
    376
    Likes Received:
    73
    Reputations:
    38
    [​IMG]

    Как и обещал, отписываюсь.

    Не так страшен, как его малюют :)
     
    alexzir likes this.
  7. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,310
    Reputations:
    327
    ебануться, не ожидал что на ач когданибудь поднимутся подобные темы)
     
    Pirotexnik likes this.