Всем доброго времени суток, только что подошел к концу двухнедельный HackQuest от PHDays. Не смотря на преобладание заданий связанных с WEB, организаторы не оставили без внимания и задания связанные с реверсом. Решение одного из таких заданий (erawmosnar), я бы хотел сегодня рассмотреть. К тому же думаю после WannaCry подобная тема станет ещё актуальнее.
К заданию была всего 1 подсказка:
Warn: erawmosnar == ransomware, do not run it, if you do not know what you doing.

Начнём


Скачиваем файл и открываем его в IDA, и страдаем идём гуглить ибо перед нами over1000 безымянных функций, и судя по всему это Golang:



Быстрый поиск в гугл показал решение этой проблемы. Скачиваем скрипт, запускаем его в IDA и наслаждаемся.



Запустив всё же бинарник, видим приглашение для ввода 8-значного пин-кода, и сообщение об его некорректности в случае провала.



Используя это как отправную точку, не сложно найти функцию, которая всё это обрабатывает. После обработки кода скриптом, эта функция получила название main_main.

Начинается всё с того, что в буфер записывается некий хеш:



Затем нас просят ввести пин:



Затем от него высчитывается SHA1 хеш, и сверяется с эталоном, ну а далее всё просто, либо мы видим флаг, либо шифруется содержимое текущей директории:



Устанавливаем несколько точек останова, для наглядности:

gdb-peda$ break *0x4015B4
Breakpoint 1 at 0x4015b4
gdb-peda$ break *0x4015D5
Breakpoint 2 at 0x4015d5
gdb-peda$ break *0x401669
Breakpoint 3 at 0x401669
gdb-peda$ 

Первый брейкпоинт срабатывает до вызова функции runtime_concatstring2, в стек отправляются какой-то хеш, и наш пин, вместе с символом "\n":



Жмем продолжить, попадаем на следующую точку останова, где наглядно виден результат конкатенации введённого нами пин-кода с солью:



На третьем брейкпоинте просто сверяются хеши. Теперь имея всю необходимую информацию, осталось только сбрутить хеш. Создаём словарь для перебора:

gh0st3rs@gh0st3rs-pc:erawmosnar$ crunch 8 8 1234567890 -o /media/DATA/passwdlst/8digits.lst

И запускаем перебор:

gh0st3rs@gh0st3rs-pc:erawmosnar$ sudo hashcat -m 110 --hex-salt hash /media/DATA/passwdlst/8digits.lst



Пин успешно подобран, осталось забрать флаг:

Поделиться с друзьями
-->

Комментарии (4)


  1. t0pep0
    13.05.2017 17:20

    Спасибо за статью.
    Подскажите, я, наверное, подтупливаю, но вроде можно было просто заменить условный переход безусловным
    — jnz short loc_4017FC
    +++ jmp short loc_4017FC; Переходим всегда на ветку с выдачей флага
    or
    +++ je short loc_4017FC; Получим флаг только при не правильном PIN'e

    Это ведь было-бы гораздо быстрее брута PIN'а


    1. t0pep0
      13.05.2017 17:52

      На всякий случай проверил, всё правильно сказал. Лучше менять на je (у него опкод 0x74, тогда как у jnz 0x75).
      Оффсет инструкции для смены в hex-редакторе: 0x17F5 (Меняем 75 на 74).
      Результат:
      Enter your PIN (8 digits):
      12345678
      PIN is correct! Flag:
      84140ad7249dc0fdbdd02cd13cb3262f


      1. t0pep0
        13.05.2017 18:02
        +1

        Не успел отредактировать предыдущий комментарий. Решение быстрое, но не верное. Выдаваемый флаг зависит от введеного PIN'a (последовательность простых операций над входной строкой и перегон в BASE64)


        1. GH0st3rs
          13.05.2017 18:30
          +1

          Всё верно, тут без пина никак)