Отключение ASLR при отладке third-party приложения под iOS

    В этой статье дается простая короткая инструкция как пропатчить third-party приложение под iOS что бы отключить ASLR при отладке. Предполагается что у читателя в наличии:

    1. iOS 7.0-7.0.4 устройство с evasi0n jailbreak и компьютер с Mac OS X 10.9.4, установленным XCode 5.1.1 и МаchOView 2.4 (скорее всего для других версий тоже будет работать, но я не пробовал)
    2. некоторый опыт в отладке third-party приложения для iOS, ну и желательно знать что такое ASLR и понимать зачем его отключать

    Что ж, приступим.

    Для начала выберем исполняемый файл, в который мы будем отлаживать и в котором нам нужно отключить ASLR. Пусть это будет демон /usr/sbin/absd, отвечающий за авторизацию в некоторых сервисах Apple. Конечно absd тут исключительно для примера, на самом деле можно взять любой исполняемый файл.

    Используем scp для того что бы скопировать наш исполняемый файл на компьютер (здесь и далее 192.168.1.112 — это IP адрес нашего iOS устройства):

    $ scp root@192.168.1.112:/usr/sbin/absd ./
    

    WARNING! Перед тем как что-то делать с absd, обязательно сохраните где-нибудь копию!

    Затем воспользуемся утилитой codesign из XCode и извлечем из нашего исполняемого файла plist со списком entitlements (не знаю как это по-русски, может «список прав»?):

    $ codesign -d --entitlements - absd > absd.entitlements
    

    После этого открываем исполняемый файл в MachOView и находим Mach-заголовок для интересующей нас архитектуры. В случае fat binary таких заголовков будет несколько — по одному на каждую архитектуру; в случае если у нас не fat binary — заголовок будет всего один. В заголовке найдите флаг MH_PIE и запомните соответствующее смещение. В MachOView все это выглядит он вот так:



    Флаг нужно сбросить, но в MachOView это сделать нельзя, поэтому откроем исполняемый файл в любом HEX-редакторе, перейдем по соответствующему смещению и сбросим флаг. Потом переподпишем исполняемый файл с сохраненными entitlements:

    $ codesign -s - --entitlements absd.entitlements -f absd
    

    и скопируем его обратно на устройство

    $ scp ./absd  root@192.168.1.112:/usr/sbin/absd
    

    Вот собственно и все. Теперь если вызвать демона — например авторизировавшись в iMessage, — и загнать его под отладку в lldb, мы увидим



    (если вы сидите на gdb вместо lldb, используйте соответствующие команды). Как видим из скриншота, никакого больше ASLR! Вот собственно и вся инструкция — простая и короткая, как я и обещал в начале статьи.

    P.S. На всякий случай: автор в курсе, что предложенный в статье способ — далеко не всегда самый оптимальный. Автор также в курсе альтернативных способов отключения ASLR, и возможно они будут рассмотрены в следующих статьях. Но вот именно сегодня — статья про патчинг Mach-заголовка.

    Happy debugging!
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 4

      +1
      Думаю, пригодится, спасибо. Мои потребности обычно ограничиваются определением участка, на котором упало приложение. Когда пишешь jailbreak и не jailbreak приложения очень часто xcode не определяет символы, тем более он их не определяет для чужий приложений. Решается просто — нахожу ASLR смещение, а дальше в IDA все как на ладони.
        +1
        На самом деле если нужно просто определить адрес без ASLR, в lldb можно ничего не вычислять, а использовать просто

        (lldb) image lookup -a <адрес с ASLR>
        

        например что бы определить где упало

        (lldb) image lookup -a $pc
        

        В выхлопе этой команды будет адрес без ASLR, который можно смотреть в IDA уже.
          0
          Определяю я руками по crash log'у, но все равно спасибо.
            0
            А, понял. Ну тогда да :)
            Рад что статья оказалась (хотя бы потенциально) полезной.

      Only users with full accounts can post comments. Log in, please.