Разпаковка и дизассемблеровка mach-o бинарника

Discussion in 'Реверсинг' started by _Logger_, 10 Jul 2014.

  1. _Logger_

    _Logger_ New Member

    Joined:
    28 Oct 2010
    Messages:
    57
    Likes Received:
    1
    Reputations:
    -3
    Распаковка и дизассемблеровка mach-o бинарника (OSX x64)

    Привет античат, я пытаюсь вскрыть OSX mach-o бинарник.

    К сожелению дизассемблировка дает меня bullshit, видимо бинарник закриптован, или использует packer (или на самом плохом варинате обфускацию).
    Меня нужно получить/определить алгоритм шифровки, и декриптовать бинарник.



    Load Commands
    Используя
    Code:
    otool -l myTarget
    сделал дамп команд загрузки бинарника
    (некаких флагов на факт крипта.... но всетаки она закриптована)
    https://www.dropbox.com/s/yg78mesn3w9mm7n/load_commands.txt



    Disassembling
    Используя
    Code:
    otool -tvV myTarget
    сделал дамп всего __text __TEXT сегмента
    https://www.dropbox.com/s/ag6xq1n2k9nm4eq/text_segment.txt

    Как видите никакой полезной информации, одна каша.



    LLVM дизассемблер сразу отказывается
    Code:
    (__TEXT,__text) section
    Segmentation fault: 11
    

    Инъекция с помощью cycript

    Я попробовал `cycript` для дампа `основного образа бинарника` из Виртаульной Памяти, а потом патчил дамп обратно в бинарник с помощью `dd` инструмента,
    но кажется этот трюк не прошел, и бинарник был поврежден.



    Debuggers

    `gdb`/`lldb` отказываются запустить/присоединиться к процессу, т.к. бинарник использует `pt_deny_atach`/`sysctl`/`kauth` техники анти-дебаггинга.

    Я попробовал патчить свой OSX kernel для игнорирование `pt_deny_atach`/`sysctl`/`kauth` (т.к. assembly к бинарнику не доступно и я не смогу снять `nop`-ом эти вызовы)
    Но после этого процесс даже не запускается, просто зависает (В то время как `Github` и `iTunes` запускаются без каких то проблем, и клюют на патч).



    Декриптованный кусок кода

    Это единственное что меня удалось найти,
    В бинарнике используется довольно популярная библиотека AquaticPrime.
    Я интегрировал библиотеку на моем тестовом пройекте и компилировал его, потом сравнил мой мод, с кодом которое находится в бинарнике.

    Мой код (decrypted)
    https://www.dropbox.com/s/mw2e8cvzt0u5vwy/decytpted.png

    Код в бинарнике (encrypted)
    https://www.dropbox.com/s/o70qq90trz5h914/encrypted.png

    Можете посоветовать некоторые дополнительные техники (или предложение, что я могу попробовать), чтобы получить чистый ассемблай?
     
    #1 _Logger_, 10 Jul 2014
    Last edited: 10 Jul 2014
  2. KIR@PRO

    KIR@PRO from Exception

    Joined:
    26 Dec 2007
    Messages:
    826
    Likes Received:
    291
    Reputations:
    359
    Прошу привести в норму правописание... будем уважать зрение остальных :)

    Вот по этому:
    Упаковщик ("packer") и обфускатор - разные понятия. Обфускация используется для скриптов, а упаковщики применяются для исполняемых файлов.

    Добавьте еще в свой пост, что это под MacOS x64.
    P.s. К сожалению, сам ни чем не смогу помочь, под Mac не работал.
    Но могу добавить, что на работу криптора не похоже, имена секций с данными обычно тоже шифруются (но не всегда).
     
    _________________________
    #2 KIR@PRO, 10 Jul 2014
    Last edited: 10 Jul 2014
    1 person likes this.
  3. _Logger_

    _Logger_ New Member

    Joined:
    28 Oct 2010
    Messages:
    57
    Likes Received:
    1
    Reputations:
    -3
    KIR@PRO спасибо за замечания, я иностранец по русски ели ели учусь, если возможно крупные ошибки исправляйте пожалуйста (fix the hard mistakes by editing the article please).

    Обфускация используется не только для скриптов, она может использоваться для изменения имен методов, еще можно инструкции заменить на альтернативные и добавить много мусра, или я ошибаюсь ?.

    То есть как я понял в Windows, exe в упаковку падает с ресурсами?
    если на пример возмем mpress (http://www.matcode.com/mpress.htm), то он упковывает сам архив программы (в маке .app, в винде .exe) или только бинарник?
     
    #3 _Logger_, 10 Jul 2014
    Last edited by a moderator: 10 Jul 2014
  4. KIR@PRO

    KIR@PRO from Exception

    Joined:
    26 Dec 2007
    Messages:
    826
    Likes Received:
    291
    Reputations:
    359
    вообще, обфускацией, как таковой, является запутывание алгоритма работы скрипта/программы без потери функциональности, с целью усложнения понимания логики её работы. Применить обфускацию к исполняемому файлу(программе) конечно можно и это корректно, но в случае программы это распространено только по отношению к исходному коду, потому в подавляющем большинстве случаев, под обфускацией подразумевают изменение скрипта, но так же можно изменить исходный код программы.
    Потому признаю, погорячился по поводу обфускации ;)


    Не совсем понял, что имелось ввиду под "архивом программы"...
    Прогой не пользовался, но судя по страничке, это простой упаковщик исполняемых файлов, для уменьшения его размера (как zip, rar, gzip, etc...) добавляя соответственно распаковщик в начало старта программы. Упаковывает именно бинарник, точнее ту его часть которую возможно упаковать (секцию кода, данных, возможно некоторые заголовки секций).


    В большинстве случаев да, ибо благоразумно :) Но я говорил про крипторы, когда упоминал изменение названий секций.


    Чтоб проверить применен ли упаковщик (packer) можно сверить размер памяти приложение после старта (вычитая размер секций bss) и размер исполняемого файла на диске.


    p.s. грамматику и правописание буду поправлять ;)
    p.p.s. у меня с English не так хорошо, как у тебя с Русским :D
     
    _________________________
    #4 KIR@PRO, 10 Jul 2014
    Last edited: 10 Jul 2014
  5. _Logger_

    _Logger_ New Member

    Joined:
    28 Oct 2010
    Messages:
    57
    Likes Received:
    1
    Reputations:
    -3
    сделал `vmmap pid` после запуска программы.
    кусок отчета которое нам интересно
    Code:
    ==== Writable regions for process 1175
    __TEXT                 000000010e34c000-000000010e67b000 [ 3260K] rwx/rwx SM=COW  .../reverse/Hopper Disassembler v3.app/Contents/MacOS/Hopper Disassembler v3
    __DATA                 000000010e67b000-000000010e7d0000 [ 1364K] rw-/rwx SM=COW  .../reverse/Hopper Disassembler v3.app/Contents/MacOS/Hopper Disassembler v3
    __DATA                 000000010e7d0000-000000010e7db000 [   44K] rw-/rwx SM=PRV  .../reverse/Hopper Disassembler v3.app/Contents/MacOS/Hopper Disassembler v3
    
    
    размер __TEXT сегмента точно совпадает с незапушенным вариантом
    [​IMG]
    (0x000000010e67b000-0x000000010e34c000 == 0x32F000)

    когда я впервые хотел открыть этот бинарник, все инструменты отказывались открыть его (даже IDA), они провалились с сообшением что бинарник поврежден. После мучение я понял что у LOAD_COMMANDS неправильные оффсеты, по ходу ОС мог понять и исправить это, а дизассемблеры нет. Вот я поправил оффсеты и дизассемблеры стали работать (но показывают замешенную программу). Кстати lldb отказывается читать бинарник, у него что то нетак с этим бинарником, я попробую из VM дампить опять и посмотреть на это.
    Меня пугает тот факт что дизассемблеры показывают "bad opcode".

    я измерил размеры методов у него и оригиналы (в библиотеке AquaticPrime), у него они довольно большие один метод на два раза а второй на 1.57.

    Странно что у него __TEXT сегмент read/write помечен, зачем ему write.

    p.s. говорят если хочеш реверсить учи русский или китайский, а то американцы и европейци ненавидят реверс и ненавидят тех кто хочет реверсить, и на эту тему нечего не знают :) у них с законом трудно, страшно боятся.
     
    #5 _Logger_, 10 Jul 2014
    Last edited: 10 Jul 2014
  6. neviens

    neviens Member

    Joined:
    9 Oct 2013
    Messages:
    82
    Likes Received:
    28
    Reputations:
    3
    Это явный признак, что код самомодифицирующийся. Без отладчика никак. Или дампить уже с проинициализированными глобальными перменными и потом их чистить.

    woodmann.com неплохой ресурс на EN, по крайней мере таким был когда-то. С маком везде напряжёнка- не популярный он.
     
  7. KIR@PRO

    KIR@PRO from Exception

    Joined:
    26 Dec 2007
    Messages:
    826
    Likes Received:
    291
    Reputations:
    359
    В точку!
    _Logger_ попробуй снять дамп когда прога запустится и отработает все первоначальные действия. Если она с интерфейсом, то пока не запустится интерфейс. Тебе тут только с отладчиками работать, о дизассемблерах забудь =(


    Среди реверсеров не популярный =(
     
    _________________________