Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

въвСдСниС

Π’ края Π½Π° ΠΌΠ°Ρ€Ρ‚ Π½ΠΈΠ΅ Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°Π½ΠΈ, Ρ‡Π΅ са ΠΎΡ‚ΠΊΡ€ΠΈΠ»ΠΈ скрита Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ ΠΈ изпълнСниС Π½Π° Π½Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ ΠΊΠΎΠ΄ Π² UC Browser. ДнСс Ρ‰Π΅ Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ става Ρ‚ΠΎΠ²Π° изтСглянС ΠΈ ΠΊΠ°ΠΊ Ρ…Π°ΠΊΠ΅Ρ€ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° свои собствСни Ρ†Π΅Π»ΠΈ.

ΠŸΡ€Π΅Π΄ΠΈ извСстно Π²Ρ€Π΅ΠΌΠ΅ UC Browser бСшС Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€Π°Π½ ΠΈ разпространяван ΠΌΠ½ΠΎΠ³ΠΎ агрСсивно: Ρ‚ΠΎΠΉ бСшС инсталиран Π½Π° потрСбитСлски устройства с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π·Π»ΠΎΠ²Ρ€Π΅Π΄Π΅Π½ софтуСр, разпространяван ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ сайтовС ΠΏΠΎΠ΄ ΠΏΡ€ΠΈΠΊΡ€ΠΈΡ‚ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π²ΠΈΠ΄Π΅ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ (Ρ‚.Π΅. ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ си мислСха, Ρ‡Π΅ изтСглят Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΡ€Π½ΠΎ Π²ΠΈΠ΄Π΅ΠΎ, Π½ΠΎ вмСсто Ρ‚ΠΎΠ²Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ APK с Ρ‚ΠΎΠ·ΠΈ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€), ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡ‚Ρ€Π°ΡˆΠ½ΠΈ Π±Π°Π½Π΅Ρ€ΠΈ със ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ, Ρ‡Π΅ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ Π΅ остарял, уязвим ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π½Π΅Ρ‰Π°. Π’ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π°Ρ‚Π° Π³Ρ€ΡƒΠΏΠ° Π½Π° UC Browser във VK ΠΈΠΌΠ° Ρ‚Π΅ΠΌΠ°, Π² ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΎΠΏΠ»Π°ΠΊΠ²Π°Ρ‚ ΠΎΡ‚ нСлоялна Ρ€Π΅ΠΊΠ»Π°ΠΌΠ°, ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Ρ‚Π°ΠΌ. ΠŸΡ€Π΅Π· 2016 Π³. Π΄ΠΎΡ€ΠΈ имашС Π²ΠΈΠ΄Π΅ΠΎ Ρ€Π΅ΠΊΠ»Π°ΠΌΠ° Π½Π° руски (Π΄Π°, Ρ€Π΅ΠΊΠ»Π°ΠΌΠ° Π·Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ Π·Π° Π±Π»ΠΎΠΊΠΈΡ€Π°Π½Π΅ Π½Π° Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈ).

Към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС UC Browser ΠΈΠΌΠ° Π½Π°Π΄ 500 000 000 инсталации Π² Google Play. Π’ΠΎΠ²Π° Π΅ впСчатляващо - само Google Chrome ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅Ρ‡Π΅. Π‘Ρ€Π΅Π΄ Ρ€Π΅Ρ†Π΅Π½Π·ΠΈΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ доста оплаквания относно Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈ ΠΈ прСнасочвания към някои прилоТСния Π² Google Play. Π’ΠΎΠ²Π° бСшС ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°Ρ‚Π° Π·Π° Π½Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΡƒΡ‡Π²Π°Π½Π΅: Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ UC Browser ΠΏΡ€Π°Π²ΠΈ Π½Π΅Ρ‰ΠΎ лошо. И сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ!

Π’ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ бСшС ΠΎΡ‚ΠΊΡ€ΠΈΡ‚Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° изтСглянС ΠΈ стартиранС Π½Π° изпълним ΠΊΠΎΠ΄, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° прилоТСния Π² Google Play. Π’ допълнСниС към изтСглянСто Π½Π° изпълним ΠΊΠΎΠ΄, UC Browser ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ²Π° ΠΏΠΎ нСсигурСн Π½Π°Ρ‡ΠΈΠ½, ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° стартиранС Π½Π° MitM Π°Ρ‚Π°ΠΊΠ°. Π”Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΠΌ Ρ‚Π°ΠΊΠ°Π²Π° Π°Ρ‚Π°ΠΊΠ°.

Всичко написано ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌΠΎ Π·Π° вСрсията Π½Π° UC Browser, която бСшС Π½Π°Π»ΠΈΡ‡Π½Π° Π² Google Play ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΡ€ΠΎΡƒΡ‡Π²Π°Π½Π΅Ρ‚ΠΎ:

package: com.UCMobile.intl
versionName: 12.10.8.1172
versionCode: 10598
sha1 APK-Ρ„Π°ΠΉΠ»Π°: f5edb2243413c777172f6362876041eb0c3a928c

Π’Π΅ΠΊΡ‚ΠΎΡ€ Π½Π° Π°Ρ‚Π°ΠΊΠ°

Π’ манифСста Π½Π° UC Browser ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ услуга с Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΠΎ ΠΈΠΌΠ΅ com.uc.deployment.UpgradeDeployService.

    <service android_exported="false" android_name="com.uc.deployment.UpgradeDeployService" android_process=":deploy" />

ΠšΠΎΠ³Π°Ρ‚ΠΎ Ρ‚Π°Π·ΠΈ услуга стартира, Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ ΠΏΡ€Π°Π²ΠΈ POST заявка към puds.ucweb.com/upgrade/index.xhtml, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ΄ΠΈ Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° извСстно Π²Ρ€Π΅ΠΌΠ΅ слСд старта. Π’ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Ρ‚ΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ някаква актуализация ΠΈΠ»ΠΈ Π½ΠΎΠ² ΠΌΠΎΠ΄ΡƒΠ». По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ Π½Π΅ Π΄Π°Π΄Π΅ Ρ‚Π°ΠΊΠΈΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Π½ΠΎ забСлязахмС, Ρ‡Π΅ ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ PDF Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, Ρ‚ΠΎΠΉ ΠΏΡ€Π°Π²ΠΈ Π²Ρ‚ΠΎΡ€Π° заявка Π΄ΠΎ посочСния ΠΏΠΎ-Π³ΠΎΡ€Π΅ адрСс, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ изтСгля Ρ€ΠΎΠ΄Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Π—Π° Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΠΌ Π°Ρ‚Π°ΠΊΠ°Ρ‚Π°, Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Ρ‚Π°Π·ΠΈ функция Π½Π° UC Browser: Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° отварянС Π½Π° PDF с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ€ΠΎΠ΄Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, която Π½Π΅ Π΅ Π² APK ΠΈ която тя изтСгля ΠΎΡ‚ Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. Π‘Ρ‚Ρ€ΡƒΠ²Π° си Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΡ‡Π½ΠΎ UC Browser ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡ€ΠΈΠ½ΡƒΠ΄Π΅Π½ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ Π½Π΅Ρ‰ΠΎ Π±Π΅Π· взаимодСйствиС с потрСбитСля - Π°ΠΊΠΎ прСдоставитС Π΄ΠΎΠ±Ρ€Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π½Π° заявка, която сС изпълнява слСд стартиранС Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°. Но Π·Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Ρ‚ΠΎΠ²Π°, трябва Π΄Π° ΠΏΡ€ΠΎΡƒΡ‡ΠΈΠΌ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π·Π° взаимодСйствиС със ΡΡŠΡ€Π²ΡŠΡ€Π°, Π·Π°Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅, Ρ‡Π΅ Ρ‰Π΅ бъдС ΠΏΠΎ-лСсно Π΄Π° Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°ΠΌΠ΅ прихванатия ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΈ Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с PDF.

Π’Π°ΠΊΠ° Ρ‡Π΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» иска Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈ PDF Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС видят слСднитС заявки:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ΠŸΡŠΡ€Π²ΠΎ ΠΈΠΌΠ° POST заявка към puds.ucweb.com/upgrade/index.xhtml, Ρ‚ΠΎΠ³Π°Π²Π°
Π˜Π·Ρ‚Π΅Π³Π»Ρ сС Π°Ρ€Ρ…ΠΈΠ² с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° PDF ΠΈ офис Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ. Π›ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π΅ Π΄Π° сС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈ, Ρ‡Π΅ ΠΏΡŠΡ€Π²Π°Ρ‚Π° заявка ΠΏΡ€Π΅Π΄Π°Π²Π° информация Π·Π° систСмата (Π½Π°ΠΉ-ΠΌΠ°Π»ΠΊΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π·Π° прСдоставянС Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°), Π° Π² ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π½Π° нСя Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° някаква информация Π·Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π°, която трябва Π΄Π° бъдС ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Π½Π°: адрСса ΠΈ Π΅Π²Π΅Π½Ρ‚ΡƒΠ°Π»Π½ΠΎ , Π½Π΅Ρ‰ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ заявка Π΅ ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π°.

Заявка Π·Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚

Π€Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π°

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π‘Π°ΠΌΠ°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΅ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈΡ€Π°Π½Π° Π² ZIP ΠΈ Π½Π΅ Π΅ ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π°.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ΠŸΠΎΡ‚ΡŠΡ€ΡΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄ Π·Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°

НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°. НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π° Π½Π° класа com.uc.deployment.UpgradeDeployService: ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ onStartCommand ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° com.uc.deployment.bx, ΠΈ ΠΎΡ‚ Π½Π΅Π³ΠΎ към com.uc.browser.core.dcfe:

    public final void e(l arg9) {
int v4_5;
String v3_1;
byte[] v3;
byte[] v1 = null;
if(arg9 == null) {
v3 = v1;
}
else {
v3_1 = arg9.iGX.ipR;
StringBuilder v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]product:");
v4.append(arg9.iGX.ipR);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]version:");
v4.append(arg9.iGX.iEn);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]upgrade_type:");
v4.append(arg9.iGX.mMode);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]force_flag:");
v4.append(arg9.iGX.iEo);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_mode:");
v4.append(arg9.iGX.iDQ);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_type:");
v4.append(arg9.iGX.iEr);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_state:");
v4.append(arg9.iGX.iEp);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_file:");
v4.append(arg9.iGX.iEq);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apk_md5:");
v4.append(arg9.iGX.iEl);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_type:");
v4.append(arg9.mDownloadType);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_group:");
v4.append(arg9.mDownloadGroup);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_path:");
v4.append(arg9.iGH);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_child_version:");
v4.append(arg9.iGX.iEx);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_series:");
v4.append(arg9.iGX.iEw);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_arch:");
v4.append(arg9.iGX.iEt);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp3:");
v4.append(arg9.iGX.iEv);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp:");
v4.append(arg9.iGX.iEu);
ArrayList v3_2 = arg9.iGX.iEz;
if(v3_2 != null && v3_2.size() != 0) {
Iterator v3_3 = v3_2.iterator();
while(v3_3.hasNext()) {
Object v4_1 = v3_3.next();
StringBuilder v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_name:");
v5.append(((au)v4_1).getName());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_name:");
v5.append(((au)v4_1).aDA());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_code:");
v5.append(((au)v4_1).gBl);
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_req_type:");
v5.append(((au)v4_1).gBq);
}
}
j v3_4 = new j();
m.b(v3_4);
h v4_2 = new h();
m.b(v4_2);
ay v5_1 = new ay();
v3_4.hS("");
v3_4.setImsi("");
v3_4.hV("");
v5_1.bPQ = v3_4;
v5_1.bPP = v4_2;
v5_1.yr(arg9.iGX.ipR);
v5_1.gBF = arg9.iGX.mMode;
v5_1.gBI = arg9.iGX.iEz;
v3_2 = v5_1.gAr;
c.aBh();
v3_2.add(g.fs("os_ver", c.getRomInfo()));
v3_2.add(g.fs("processor_arch", com.uc.b.a.a.c.getCpuArch()));
v3_2.add(g.fs("cpu_arch", com.uc.b.a.a.c.Pb()));
String v4_3 = com.uc.b.a.a.c.Pd();
v3_2.add(g.fs("cpu_vfp", v4_3));
v3_2.add(g.fs("net_type", String.valueOf(com.uc.base.system.a.Jo())));
v3_2.add(g.fs("fromhost", arg9.iGX.iEm));
v3_2.add(g.fs("plugin_ver", arg9.iGX.iEn));
v3_2.add(g.fs("target_lang", arg9.iGX.iEs));
v3_2.add(g.fs("vitamio_cpu_arch", arg9.iGX.iEt));
v3_2.add(g.fs("vitamio_vfp", arg9.iGX.iEu));
v3_2.add(g.fs("vitamio_vfp3", arg9.iGX.iEv));
v3_2.add(g.fs("plugin_child_ver", arg9.iGX.iEx));
v3_2.add(g.fs("ver_series", arg9.iGX.iEw));
v3_2.add(g.fs("child_ver", r.aVw()));
v3_2.add(g.fs("cur_ver_md5", arg9.iGX.iEl));
v3_2.add(g.fs("cur_ver_signature", SystemHelper.getUCMSignature()));
v3_2.add(g.fs("upgrade_log", i.bjt()));
v3_2.add(g.fs("silent_install", String.valueOf(arg9.iGX.iDQ)));
v3_2.add(g.fs("silent_state", String.valueOf(arg9.iGX.iEp)));
v3_2.add(g.fs("silent_file", arg9.iGX.iEq));
v3_2.add(g.fs("silent_type", String.valueOf(arg9.iGX.iEr)));
v3_2.add(g.fs("cpu_archit", com.uc.b.a.a.c.Pc()));
v3_2.add(g.fs("cpu_set", SystemHelper.getCpuInstruction()));
boolean v4_4 = v4_3 == null || !v4_3.contains("neon") ? false : true;
v3_2.add(g.fs("neon", String.valueOf(v4_4)));
v3_2.add(g.fs("cpu_cores", String.valueOf(com.uc.b.a.a.c.Jl())));
v3_2.add(g.fs("ram_1", String.valueOf(com.uc.b.a.a.h.Po())));
v3_2.add(g.fs("totalram", String.valueOf(com.uc.b.a.a.h.OL())));
c.aBh();
v3_2.add(g.fs("rom_1", c.getRomInfo()));
v4_5 = e.getScreenWidth();
int v6 = e.getScreenHeight();
StringBuilder v7 = new StringBuilder();
v7.append(v4_5);
v7.append("*");
v7.append(v6);
v3_2.add(g.fs("ss", v7.toString()));
v3_2.add(g.fs("api_level", String.valueOf(Build$VERSION.SDK_INT)));
v3_2.add(g.fs("uc_apk_list", SystemHelper.getUCMobileApks()));
Iterator v4_6 = arg9.iGX.iEA.entrySet().iterator();
while(v4_6.hasNext()) {
Object v6_1 = v4_6.next();
v3_2.add(g.fs(((Map$Entry)v6_1).getKey(), ((Map$Entry)v6_1).getValue()));
}
v3 = v5_1.toByteArray();
}
if(v3 == null) {
this.iGY.iGI.a(arg9, "up_encode", "yes", "fail");
return;
}
v4_5 = this.iGY.iGw ? 0x1F : 0;
if(v3 == null) {
}
else {
v3 = g.i(v4_5, v3);
if(v3 == null) {
}
else {
v1 = new byte[v3.length + 16];
byte[] v6_2 = new byte[16];
Arrays.fill(v6_2, 0);
v6_2[0] = 0x5F;
v6_2[1] = 0;
v6_2[2] = ((byte)v4_5);
v6_2[3] = -50;
System.arraycopy(v6_2, 0, v1, 0, 16);
System.arraycopy(v3, 0, v1, 16, v3.length);
}
}
if(v1 == null) {
this.iGY.iGI.a(arg9, "up_encrypt", "yes", "fail");
return;
}
if(TextUtils.isEmpty(this.iGY.mUpgradeUrl)) {
this.iGY.iGI.a(arg9, "up_url", "yes", "fail");
return;
}
StringBuilder v0 = new StringBuilder("[");
v0.append(arg9.iGX.ipR);
v0.append("]url:");
v0.append(this.iGY.mUpgradeUrl);
com.uc.browser.core.d.c.i v0_1 = this.iGY.iGI;
v3_1 = this.iGY.mUpgradeUrl;
com.uc.base.net.e v0_2 = new com.uc.base.net.e(new com.uc.browser.core.d.c.i$a(v0_1, arg9));
v3_1 = v3_1.contains("?") ? v3_1 + "&dataver=pb" : v3_1 + "?dataver=pb";
n v3_5 = v0_2.uc(v3_1);
m.b(v3_5, false);
v3_5.setMethod("POST");
v3_5.setBodyProvider(v1);
v0_2.b(v3_5);
this.iGY.iGI.a(arg9, "up_null", "yes", "success");
this.iGY.iGI.b(arg9);
}

Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° POST заявка Ρ‚ΡƒΠΊ. ΠžΠ±Ρ€ΡŠΡ‰Π°ΠΌΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° масив ΠΎΡ‚ 16 Π±Π°ΠΉΡ‚Π° ΠΈ Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ попълванС: 0x5F, 0, 0x1F, -50 (=0xCE). Бъвпада с Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ видяхмС Π² заявката ΠΏΠΎ-Π³ΠΎΡ€Π΅.

Π’ ΡΡŠΡ‰ΠΈΡ клас ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π²Π»ΠΎΠΆΠ΅Π½ клас, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ° Π΄Ρ€ΡƒΠ³ интСрСсСн ΠΌΠ΅Ρ‚ΠΎΠ΄:

        public final void a(l arg10, byte[] arg11) {
f v0 = this.iGQ;
StringBuilder v1 = new StringBuilder("[");
v1.append(arg10.iGX.ipR);
v1.append("]:UpgradeSuccess");
byte[] v1_1 = null;
if(arg11 == null) {
}
else if(arg11.length < 16) {
}
else {
if(arg11[0] != 0x60 && arg11[3] != 0xFFFFFFD0) {
goto label_57;
}
int v3 = 1;
int v5 = arg11[1] == 1 ? 1 : 0;
if(arg11[2] != 1 && arg11[2] != 11) {
if(arg11[2] == 0x1F) {
}
else {
v3 = 0;
}
}
byte[] v7 = new byte[arg11.length - 16];
System.arraycopy(arg11, 16, v7, 0, v7.length);
if(v3 != 0) {
v7 = g.j(arg11[2], v7);
}
if(v7 == null) {
goto label_57;
}
if(v5 != 0) {
v1_1 = g.P(v7);
goto label_57;
}
v1_1 = v7;
}
label_57:
if(v1_1 == null) {
v0.iGY.iGI.a(arg10, "up_decrypt", "yes", "fail");
return;
}
q v11 = g.b(arg10, v1_1);
if(v11 == null) {
v0.iGY.iGI.a(arg10, "up_decode", "yes", "fail");
return;
}
if(v0.iGY.iGt) {
v0.d(arg10);
}
if(v0.iGY.iGo != null) {
v0.iGY.iGo.a(0, ((o)v11));
}
if(v0.iGY.iGs) {
v0.iGY.a(((o)v11));
v0.iGY.iGI.a(v11, "up_silent", "yes", "success");
v0.iGY.iGI.a(v11);
return;
}
v0.iGY.iGI.a(v11, "up_silent", "no", "success");
}
}

ΠœΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ ΠΏΡ€ΠΈΠ΅ΠΌΠ° масив ΠΎΡ‚ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ ΠΊΠ°Ρ‚ΠΎ Π²Ρ…ΠΎΠ΄ ΠΈ провСрява Π΄Π°Π»ΠΈ нулСвият Π±Π°ΠΉΡ‚ Π΅ 0x60 ΠΈΠ»ΠΈ трСтият Π±Π°ΠΉΡ‚ Π΅ 0xD0, Π° вторият Π±Π°ΠΉΡ‚ Π΅ 1, 11 ΠΈΠ»ΠΈ 0x1F. Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π°: нулСвият Π±Π°ΠΉΡ‚ Π΅ 0x60, вторият Π΅ 0x1F, трСтият Π΅ 0x60. Π—Π²ΡƒΡ‡ΠΈ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π°, ΠΎΡ‚ ΠΊΠΎΠ΅Ρ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ. БъдСйки ΠΏΠΎ Ρ€Π΅Π΄ΠΎΠ²Π΅Ρ‚Π΅ (β€žup_decryptβ€œ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€), Ρ‚ΡƒΠΊ трябва Π΄Π° сС ΠΈΠ·Π²ΠΈΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°.
Π”Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ΠΌ към ΠΌΠ΅Ρ‚ΠΎΠ΄Π° gj. Π˜ΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ ΠΏΡŠΡ€Π²ΠΈΡΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π΅ Π±Π°ΠΉΡ‚ΡŠΡ‚ ΠΏΡ€ΠΈ отмСстванС 2 (Ρ‚.Π΅. 0x1F Π² нашия случай), Π° вторият Π΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΡŠΡ‚ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° Π±Π΅Π·
ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ 16 Π±Π°ΠΉΡ‚Π°.

     public static byte[] j(int arg1, byte[] arg2) {
if(arg1 == 1) {
arg2 = c.c(arg2, c.adu);
}
else if(arg1 == 11) {
arg2 = m.aF(arg2);
}
else if(arg1 != 0x1F) {
}
else {
arg2 = EncryptHelper.decrypt(arg2);
}
return arg2;
}

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Ρ‚ΡƒΠΊ ΠΈΠ·Π±ΠΈΡ€Π°ΠΌΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π·Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅ ΠΈ ΡΡŠΡ‰ΠΈΡ Π±Π°ΠΉΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π² нашия
случай, Ρ€Π°Π²Π΅Π½ Π½Π° 0x1F, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° Π΅Π΄Π½Π° ΠΎΡ‚ Ρ‚Ρ€ΠΈ възмоТни ΠΎΠΏΡ†ΠΈΠΈ.

ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π°. Π‘Π»Π΅Π΄ няколко скока сС ΠΎΠ·ΠΎΠ²Π°Π²Π°ΠΌΠ΅ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ с Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‰ΠΎ сС ΠΈΠΌΠ΅ Π΄Π΅ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅BytesByKey.

Π’ΡƒΠΊ ΠΎΡ‰Π΅ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° сС отдСлят ΠΎΡ‚ нашия ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΈ ΠΎΡ‚ тях сС ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Π½ΠΈΠ·. Ясно Π΅, Ρ‡Π΅ ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ сС ΠΈΠ·Π±ΠΈΡ€Π° ΠΊΠ»ΡŽΡ‡ΡŠΡ‚ Π·Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ.

    private static byte[] decryptBytesByKey(byte[] bytes) {
byte[] v0 = null;
if(bytes != null) {
try {
if(bytes.length < EncryptHelper.PREFIX_BYTES_SIZE) {
}
else if(bytes.length == EncryptHelper.PREFIX_BYTES_SIZE) {
return v0;
}
else {
byte[] prefix = new byte[EncryptHelper.PREFIX_BYTES_SIZE];  // 2 Π±Π°ΠΉΡ‚Π°
System.arraycopy(bytes, 0, prefix, 0, prefix.length);
String keyId = c.ayR().d(ByteBuffer.wrap(prefix).getShort()); // Π’Ρ‹Π±ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Π°
if(keyId == null) {
return v0;
}
else {
a v2 = EncryptHelper.ayL();
if(v2 == null) {
return v0;
}
else {
byte[] enrypted = new byte[bytes.length - EncryptHelper.PREFIX_BYTES_SIZE];
System.arraycopy(bytes, EncryptHelper.PREFIX_BYTES_SIZE, enrypted, 0, enrypted.length);
return v2.l(keyId, enrypted);
}
}
}
}
catch(SecException v7_1) {
EncryptHelper.handleDecryptException(((Throwable)v7_1), v7_1.getErrorCode());
return v0;
}
catch(Throwable v7) {
EncryptHelper.handleDecryptException(v7, 2);
return v0;
}
}
return v0;
}

Π“Π»Π΅Π΄Π°ΠΉΠΊΠΈ Π½Π°ΠΏΡ€Π΅Π΄, отбСлязвамС, Ρ‡Π΅ Π½Π° Ρ‚ΠΎΠ·ΠΈ Π΅Ρ‚Π°ΠΏ всС ΠΎΡ‰Π΅ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΊΠ»ΡŽΡ‡, Π° само нСговия β€žΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€β€œ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠ»ΡŽΡ‡Π° Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-слоТно.

Π’ слСдващия ΠΌΠ΅Ρ‚ΠΎΠ΄ към ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ‚Π΅ сС добавят ΠΎΡ‰Π΅ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π³ΠΈ ΠΏΡ€Π°Π²ΠΈ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ: магичСското число 16, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° ΠΊΠ»ΡŽΡ‡Π°, ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΈ Π½Π΅Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌ Π½ΠΈΠ· (Π² нашия случай ΠΏΡ€Π°Π·Π΅Π½).

    public final byte[] l(String keyId, byte[] encrypted) throws SecException {
return this.ayJ().staticBinarySafeDecryptNoB64(16, keyId, encrypted, "");
}

Π‘Π»Π΅Π΄ сСрия ΠΎΡ‚ ΠΏΡ€Π΅Ρ…ΠΎΠ΄ΠΈ стигамС Π΄ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° staticBinarySafeDecryptNoB64 интСрфСйс com.alibaba.wireless.security.open.staticdataencrypt.IStaticDataEncryptComponent. Няма класовС Π² основния ΠΊΠΎΠ΄ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚ Ρ‚ΠΎΠ·ΠΈ интСрфСйс. Π’ΡŠΠ² Ρ„Π°ΠΉΠ»Π° ΠΈΠΌΠ° Ρ‚Π°ΠΊΡŠΠ² клас lib/armeabi-v7a/libsgmain.so, ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π½Π΅ Π΅ .so, Π° .jar. ΠœΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚, ΠΊΠΎΠΉΡ‚ΠΎ Π½ΠΈ интСрСсува, сС изпълнява ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

package com.alibaba.wireless.security.a.i;
// ...
public class a implements IStaticDataEncryptComponent {
private ISecurityGuardPlugin a;
// ...
private byte[] a(int mode, int magicInt, int xzInt, String keyId, byte[] encrypted, String magicString) {
return this.a.getRouter().doCommand(10601, new Object[]{Integer.valueOf(mode), Integer.valueOf(magicInt), Integer.valueOf(xzInt), keyId, encrypted, magicString});
}
// ...
private byte[] b(int magicInt, String keyId, byte[] encrypted, String magicString) {
return this.a(2, magicInt, 0, keyId, encrypted, magicString);
}
// ...
public byte[] staticBinarySafeDecryptNoB64(int magicInt, String keyId, byte[] encrypted, String magicString) throws SecException {
if(keyId != null && keyId.length() > 0 && magicInt >= 0 && magicInt < 19 && encrypted != null && encrypted.length > 0) {
return this.b(magicInt, keyId, encrypted, magicString);
}
throw new SecException("", 301);
}
//...
}

Π’ΡƒΠΊ Π½Π°ΡˆΠΈΡΡ‚ списък ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ сС допълва с ΠΎΡ‰Π΅ Π΄Π²Π΅ Ρ†Π΅Π»ΠΈ числа: 2 ΠΈ 0. БъдСйки ΠΏΠΎ
всичко, 2 ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅, ΠΊΠ°ΠΊΡ‚ΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° doFinal систСмСн клас javax.crypto.Cipher. И всичко Ρ‚ΠΎΠ²Π° сС ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ€ΡƒΡ‚Π΅Ρ€ с Π½ΠΎΠΌΠ΅Ρ€ 10601 - Ρ‚ΠΎΠ²Π° явно Π΅ Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°.

Π‘Π»Π΅Π΄ слСдващата Π²Π΅Ρ€ΠΈΠ³Π° ΠΎΡ‚ ΠΏΡ€Π΅Ρ…ΠΎΠ΄ΠΈ Π½Π°ΠΌΠΈΡ€Π°ΠΌΠ΅ клас, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° интСрфСйса IRouterComponent ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ doCommand:

package com.alibaba.wireless.security.mainplugin;
import com.alibaba.wireless.security.framework.IRouterComponent;
import com.taobao.wireless.security.adapter.JNICLibrary;
public class a implements IRouterComponent {
public a() {
super();
}
public Object doCommand(int arg2, Object[] arg3) {
return JNICLibrary.doCommandNative(arg2, arg3);
}
}

А ΡΡŠΡ‰ΠΎ ΠΈ класа JNICLibrary, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½ нативният ΠΌΠ΅Ρ‚ΠΎΠ΄ doCommandNative:

package com.taobao.wireless.security.adapter;
public class JNICLibrary {
public static native Object doCommandNative(int arg0, Object[] arg1);
}

Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ трябва Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² собствСния ΠΊΠΎΠ΄ doCommandNative. И Ρ‚ΡƒΠΊ Π·Π°ΠΏΠΎΡ‡Π²Π° Π·Π°Π±Π°Π²Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ.

ΠžΠ±Ρ„ΡƒΡΠΊΠ°Ρ†ΠΈΡ Π½Π° машинния ΠΊΠΎΠ΄

Π’ΡŠΠ² Ρ„Π°ΠΉΠ»Π° libsgmain.so (ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅ .jar ΠΈ Π² ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΡ…ΠΌΠ΅ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° някои интСрфСйси, ΡΠ²ΡŠΡ€Π·Π°Π½ΠΈ с ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΠΎ-Π³ΠΎΡ€Π΅) ΠΈΠΌΠ° Π΅Π΄Π½Π° собствСна Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°: libsgmainso-6.4.36.so. ΠžΡ‚Π²Π°Ρ€ΡΠΌΠ΅ Π³ΠΎ Π² IDA ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΊΡƒΠΏ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ·ΠΎΡ€Ρ†ΠΈ с Π³Ρ€Π΅ΡˆΠΊΠΈ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅, Ρ‡Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° със Π·Π°Π³Π»Π°Π²ΠΊΠΈ Π½Π° сСкции Π΅ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Π°. Π’ΠΎΠ²Π° сС ΠΏΡ€Π°Π²ΠΈ Π½Π°Ρ€ΠΎΡ‡Π½ΠΎ, Π·Π° Π΄Π° сС услоТни Π°Π½Π°Π»ΠΈΠ·ΡŠΡ‚.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Но Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ: Π·Π° Π΄Π° Π·Π°Ρ€Π΅Π΄ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ELF Ρ„Π°ΠΉΠ» ΠΈ Π΄Π° Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅, Π΅ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° със Π·Π°Π³Π»Π°Π²ΠΊΠΈ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π°. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ Π½ΠΈΠ΅ просто ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°ΠΌΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° със сСкции, ΠΊΠ°Ρ‚ΠΎ Π½ΡƒΠ»ΠΈΡ€Π°ΠΌΠ΅ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅Ρ‚Π° Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°Ρ‚Π°.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ΠžΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ ΠΎΡ‚Π½ΠΎΠ²ΠΎ Ρ„Π°ΠΉΠ»Π° Π² IDA.

Има Π΄Π²Π° Π½Π°Ρ‡ΠΈΠ½Π° Π΄Π° ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° машина Π½Π° Java къдС Ρ‚ΠΎΡ‡Π½ΠΎ Π² собствСната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° сС Π½Π°ΠΌΠΈΡ€Π° ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄, Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°Π½ Π² ΠΊΠΎΠ΄Π° Π½Π° Java ΠΊΠ°Ρ‚ΠΎ СстСствСн. ΠŸΡŠΡ€Π²ΠΈΡΡ‚ Π΅ Π΄Π° ΠΌΡƒ сС Π΄Π°Π΄Π΅ ΠΈΠΌΠ΅ Π½Π° Π²ΠΈΠ΄Π° Java_package_name_ClassName_MethodName.

Π’Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ Π΅ Π΄Π° Π³ΠΎ рСгистриратС ΠΏΡ€ΠΈ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° (във функцията JNI_OnLoad)
ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° функция РСгистрирайтС сС.

Π’ нашия случай, Π°ΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΡŠΡ€Π²ΠΈΡ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΈΠΌΠ΅Ρ‚ΠΎ трябва Π΄Π° бъдС Ρ‚Π°ΠΊΠ°: Java_com_taobao_wireless_security_adapter_JNICLibrary_doCommandNative.

Π‘Ρ€Π΅Π΄ СкспортиранитС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ няма Ρ‚Π°ΠΊΠ°Π²Π° функция, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ трябва Π΄Π° ΠΏΠΎΡ‚ΡŠΡ€ΡΠΈΡ‚Π΅ ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ РСгистрирайтС сС.
Π”Π° ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ Π½Π° функцията JNI_OnLoad ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Ρ‚Π°Π·ΠΈ снимка:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Какво става Ρ‚ΡƒΠΊ? На ΠΏΡ€ΡŠΠ² ΠΏΠΎΠ³Π»Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ ΠΈ краят Π½Π° функцията са Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΈ Π·Π° ARM Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π°. ΠŸΡŠΡ€Π²Π°Ρ‚Π° инструкция Π² стСка ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° рСгистритС, ΠΊΠΎΠΈΡ‚ΠΎ функцията Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² своята Ρ€Π°Π±ΠΎΡ‚Π° (Π² Ρ‚ΠΎΠ·ΠΈ случай R0, R1 ΠΈ R2), ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° LR, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° адрСса Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ ΠΎΡ‚ функцията . ΠŸΠΎΡΠ»Π΅Π΄Π½Π°Ρ‚Π° инструкция Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° записанитС рСгистри, Π° Π°Π΄Ρ€Π΅ΡΡŠΡ‚ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π²Π΅Π΄Π½Π°Π³Π° сС поставя Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° Π½Π° ΠΊΠΎΠΌΠΏΡŽΡ‚ΡŠΡ€Π° - ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ сС Π²Ρ€ΡŠΡ‰Π° ΠΎΡ‚ функцията. Но Π°ΠΊΠΎ сС Π²Π³Π»Π΅Π΄Π°Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ, Ρ‰Π΅ Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅, Ρ‡Π΅ прСдпослСдната инструкция промСня адрСса Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅, ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ Π² стСка. НСка изчислим ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ бъдС слСд Ρ‚ΠΎΠ²Π°
изпълнСниС Π½Π° ΠΊΠΎΠ΄. ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ адрСс 1xB0 сС Π·Π°Ρ€Π΅ΠΆΠ΄Π° Π² R130, ΠΎΡ‚ Π½Π΅Π³ΠΎ сС ΠΈΠ·Π²Π°ΠΆΠ΄Π° 5, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ сС ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Ρ към R0 ΠΈ към Π½Π΅Π³ΠΎ сС добавя 0x10. Оказва сС 0xB13B. По Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ IDA смята, Ρ‡Π΅ послСдната инструкция Π΅ Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° функция, Π½ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ тя скача Π΄ΠΎ изчислСния адрСс 0xB13B.

Π’ΡƒΠΊ си струва Π΄Π° ΠΏΡ€ΠΈΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Π΅ ARM процСсоритС ΠΈΠΌΠ°Ρ‚ Π΄Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΈ Π΄Π²Π° Π½Π°Π±ΠΎΡ€Π° инструкции: ARM ΠΈ Thumb. Най-малкият Π±ΠΈΡ‚ ΠΎΡ‚ адрСса ΠΊΠ°Π·Π²Π° Π½Π° процСсора ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ инструкции сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°. ВоСст Π°Π΄Ρ€Π΅ΡΡŠΡ‚ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅ 0xB13A, Π° Π΅Π΄ΠΈΠ½ Π² Π½Π°ΠΉ-ΠΌΠ»Π°Π΄ΡˆΠΈΡΡ‚ Π±ΠΈΡ‚ ΠΏΠΎΠΊΠ°Π·Π²Π° Ρ€Π΅ΠΆΠΈΠΌΠ° Thumb.

ПодобСн β€žΠ°Π΄Π°ΠΏΡ‚Π΅Ρ€β€œ Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½ Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° всяка функция Π² Ρ‚Π°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ
ΠΊΠΎΠ΄ Π·Π° Π±ΠΎΠΊΠ»ΡƒΠΊ. По-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ няма Π΄Π° сС спирамС Π½Π° тях ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ - просто си спомнямС
Ρ‡Π΅ истинското Π½Π°Ρ‡Π°Π»ΠΎ Π½Π° ΠΏΠΎΡ‡Ρ‚ΠΈ всички Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-Π΄Π°Π»Π΅Ρ‡Π΅.

Въй ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄ΡŠΡ‚ Π½Π΅ прСскача ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ Π΄ΠΎ 0xB13A, самата IDA Π½Π΅ Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°, Ρ‡Π΅ ΠΊΠΎΠ΄ΡŠΡ‚ сС Π½Π°ΠΌΠΈΡ€Π° Π½Π° Ρ‚ΠΎΠ²Π° място. По ΡΡŠΡ‰Π°Ρ‚Π° ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Ρ‚ΠΎΠΉ Π½Π΅ Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π° ΠΏΠΎ-голямата част ΠΎΡ‚ ΠΊΠΎΠ΄Π° Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π°Π²ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° донякъдС Ρ‚Ρ€ΡƒΠ΄Π΅Π½. КазвамС Π½Π° IDA, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ ΠΊΠΎΠ΄ΡŠΡ‚, ΠΈ Π΅Ρ‚ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ сС случва:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π·Π°ΠΏΠΎΡ‡Π²Π° ΠΎΡ‚ 0xB144. Какво ΠΈΠΌΠ° Π² sub_494C?

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°ΠΌΠ΅ Ρ‚Π°Π·ΠΈ функция Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° LR, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ адрСса Π½Π° спомСнатата ΠΏΠΎ-Π³ΠΎΡ€Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π° (0xB144). Π’ R0 - индСкс Π² Ρ‚Π°Π·ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°. ВоСст стойността сС Π²Π·Π΅ΠΌΠ° ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, добавя сС към LR ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Π΅
адрСса, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅. НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π³ΠΎ изчислим: 0xB144 + [0xB144 + 8* 4] = 0xB144 + 0x120 = 0xB264. ΠžΡ‚ΠΈΠ²Π°ΠΌΠ΅ Π½Π° получСния адрСс ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π±ΡƒΠΊΠ²Π°Π»Π½ΠΎ няколко ΠΏΠΎΠ»Π΅Π·Π½ΠΈ инструкции ΠΈ ΠΎΡ‚Π½ΠΎΠ²ΠΎ ΠΎΡ‚ΠΈΠ²Π°ΠΌΠ΅ Π½Π° 0xB140:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π‘Π΅Π³Π° Ρ‰Π΅ ΠΈΠΌΠ° ΠΏΡ€Π΅Ρ…ΠΎΠ΄ ΠΏΡ€ΠΈ отмСстванС с индСкс 0x20 ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°.

БъдСйки ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°, Ρ‰Π΅ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Ρ‚Π°ΠΊΠΈΠ²Π° ΠΏΡ€Π΅Ρ…ΠΎΠ΄ΠΈ Π² ΠΊΠΎΠ΄Π°. Π’ΡŠΠ·Π½ΠΈΠΊΠ²Π° Π²ΡŠΠΏΡ€ΠΎΡΡŠΡ‚ Π΄Π°Π»ΠΈ Π΅ възмоТно ΠΏΠΎ някакъв Π½Π°Ρ‡ΠΈΠ½ Π΄Π° сС справим с Ρ‚ΠΎΠ²Π° ΠΏΠΎ-Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ, Π±Π΅Π· Ρ€ΡŠΡ‡Π½ΠΎ изчисляванС Π½Π° адрСси. И скриптовСтС ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° корСкция Π½Π° ΠΊΠΎΠ΄ Π² IDA Π½ΠΈ ΠΈΠ΄Π²Π°Ρ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰:

def put_unconditional_branch(source, destination):
offset = (destination - source - 4) >> 1
if offset > 2097151 or offset < -2097152:
raise RuntimeError("Invalid offset")
if offset > 1023 or offset < -1024:
instruction1 = 0xf000 | ((offset >> 11) & 0x7ff)
instruction2 = 0xb800 | (offset & 0x7ff)
patch_word(source, instruction1)
patch_word(source + 2, instruction2)
else:
instruction = 0xe000 | (offset & 0x7ff)
patch_word(source, instruction)
ea = here()
if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR}
ea1 = ea + 2
if get_wide_word(ea1) == 0xbf00: #NOP
ea1 += 2
if get_operand_type(ea1, 0) == 1 and get_operand_value(ea1, 0) == 0 and get_operand_type(ea1, 1) == 2:
index = get_wide_dword(get_operand_value(ea1, 1))
print "index =", hex(index)
ea1 += 2
if get_operand_type(ea1, 0) == 7:
table = get_operand_value(ea1, 0) + 4
elif get_operand_type(ea1, 1) == 2:
table = get_operand_value(ea1, 1) + 4
else:
print "Wrong operand type on", hex(ea1), "-", get_operand_type(ea1, 0), get_operand_type(ea1, 1)
table = None
if table is None:
print "Unable to find table"
else:
print "table =", hex(table)
offset = get_wide_dword(table + (index << 2))
put_unconditional_branch(ea, table + offset)
else:
print "Unknown code", get_operand_type(ea1, 0), get_operand_value(ea1, 0), get_operand_type(ea1, 1) == 2
else:
print "Unable to detect first instruction"

ΠŸΠΎΡΡ‚Π°Π²Π΅Ρ‚Π΅ курсора Π½Π° Ρ€Π΅Π΄ 0xB26A, стартирайтС скрипта ΠΈ Π²ΠΈΠΆΡ‚Π΅ ΠΏΡ€Π΅Ρ…ΠΎΠ΄Π° към 0xB4B0:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

IDA ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π½Π΅ Ρ€Π°Π·ΠΏΠΎΠ·Π½Π° Ρ‚Π°Π·ΠΈ област ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄. НиС ΠΉ ΠΏΠΎΠΌΠ°Π³Π°ΠΌΠ΅ ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π΄Ρ€ΡƒΠ³ Π΄ΠΈΠ·Π°ΠΉΠ½ Ρ‚Π°ΠΌ:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈΡ‚Π΅ слСд BLX ΠΌΠ°ΠΉ нямат особСн смисъл, ΠΏΠΎ-скоро Π΅ някакво измСстванС. НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ sub_4964:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

И наистина, Ρ‚ΡƒΠΊ сС Π²Π·Π΅ΠΌΠ° dword Π½Π° адрСса, ΠΊΠΎΠΉΡ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π² LR, добавя сС към Ρ‚ΠΎΠ·ΠΈ адрСс, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ стойността Π½Π° получСния адрСс сС Π²Π·Π΅ΠΌΠ° ΠΈ сС поставя Π² стСка. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, 4 сС добавя към LR, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ слСд Π²Ρ€ΡŠΡ‰Π°Π½Π΅ ΠΎΡ‚ функцията ΡΡŠΡ‰ΠΎΡ‚ΠΎ отмСстванС сС пропуска. Π‘Π»Π΅Π΄ ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° POP {R1} Π²Π·Π΅ΠΌΠ° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π°Ρ‚Π° стойност ΠΎΡ‚ стСка. Ако ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π½Π° адрСс 0xB4BA + 0xEA = 0xB5A4, Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° адрСсна Ρ‚Π°Π±Π»ΠΈΡ†Π°:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π—Π° Π΄Π° ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Ρ‚Π΅ Ρ‚ΠΎΠ·ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½, Ρ‰Π΅ трябва Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° ΠΎΡ‚ ΠΊΠΎΠ΄Π°: отмСстванСто ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π°, Π² ΠΊΠΎΠΉΡ‚ΠΎ искатС Π΄Π° поставитС Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π°. Π—Π° всСки възмоТСн Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Ρ‰Π΅ трябва ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π΄Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΡ‚Π΅ част ΠΎΡ‚ ΠΊΠΎΠ΄Π°.

patches = {}
patches[0] = (0x00, 0xbf, 0x01, 0x48, 0x00, 0x68, 0x02, 0xe0)
patches[1] = (0x00, 0xbf, 0x01, 0x49, 0x09, 0x68, 0x02, 0xe0)
patches[2] = (0x00, 0xbf, 0x01, 0x4a, 0x12, 0x68, 0x02, 0xe0)
patches[3] = (0x00, 0xbf, 0x01, 0x4b, 0x1b, 0x68, 0x02, 0xe0)
patches[4] = (0x00, 0xbf, 0x01, 0x4c, 0x24, 0x68, 0x02, 0xe0)
patches[5] = (0x00, 0xbf, 0x01, 0x4d, 0x2d, 0x68, 0x02, 0xe0)
patches[8] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x80, 0xd8, 0xf8, 0x00, 0x80, 0x01, 0xe0)
patches[9] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x90, 0xd9, 0xf8, 0x00, 0x90, 0x01, 0xe0)
patches[10] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xa0, 0xda, 0xf8, 0x00, 0xa0, 0x01, 0xe0)
patches[11] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xb0, 0xdb, 0xf8, 0x00, 0xb0, 0x01, 0xe0)
ea = here()
if (get_wide_word(ea) == 0xb082 #SUB SP, SP, #8
and get_wide_word(ea + 2) == 0xb503): #PUSH {R0,R1,LR}
if get_operand_type(ea + 4, 0) == 7:
pop = get_bytes(ea + 12, 4, 0)
if pop[1] == 'xbc':
register = -1
r = get_wide_byte(ea + 12)
for i in range(8):
if r == (1 << i):
register = i
break
if register == -1:
print "Unable to detect register"
else:
address = get_wide_dword(ea + 8) + ea + 8
for b in patches[register]:
patch_byte(ea, b)
ea += 1
if ea % 4 != 0:
ea += 2
patch_dword(ea, address)
elif pop[:3] == 'x5dxf8x04':
register = ord(pop[3]) >> 4
if register in patches:
address = get_wide_dword(ea + 8) + ea + 8
for b in patches[register]:
patch_byte(ea, b)
ea += 1
patch_dword(ea, address)
else:
print "POP instruction not found"
else:
print "Wrong operand type on +4:", get_operand_type(ea + 4, 0)
else:
print "Unable to detect first instructions"

ΠŸΠΎΡΡ‚Π°Π²ΡΠΌΠ΅ курсора Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° структурата, която искамС Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΠΌ - 0xB4B2 - ΠΈ стартирамС скрипта:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’ допълнСниС към Π²Π΅Ρ‡Π΅ спомСнатитС структури, ΠΊΠΎΠ΄ΡŠΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΈ слСдното:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ΠšΠ°ΠΊΡ‚ΠΎ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ случай, слСд инструкцията BLX ΠΈΠΌΠ° отмСстванС:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’Π·ΠΈΠΌΠ°ΠΌΠ΅ отмСстванСто към адрСса ΠΎΡ‚ LR, добавямС Π³ΠΎ към LR ΠΈ ΠΎΡ‚ΠΈΠ²Π°ΠΌΠ΅ Ρ‚Π°ΠΌ. 0x72044 + 0xC = 0x72050. Π‘ΠΊΡ€ΠΈΠΏΡ‚ΡŠΡ‚ Π·Π° Ρ‚ΠΎΠ·ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½ Π΅ доста прост:

def put_unconditional_branch(source, destination):
offset = (destination - source - 4) >> 1
if offset > 2097151 or offset < -2097152:
raise RuntimeError("Invalid offset")
if offset > 1023 or offset < -1024:
instruction1 = 0xf000 | ((offset >> 11) & 0x7ff)
instruction2 = 0xb800 | (offset & 0x7ff)
patch_word(source, instruction1)
patch_word(source + 2, instruction2)
else:
instruction = 0xe000 | (offset & 0x7ff)
patch_word(source, instruction)
ea = here()
if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR}
ea1 = ea + 6
if get_wide_word(ea + 2) == 0xbf00: #NOP
ea1 += 2
offset = get_wide_dword(ea1)
put_unconditional_branch(ea, (ea1 + offset) & 0xffffffff)
else:
print "Unable to detect first instruction"

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΎΡ‚ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° скрипта:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ всичко Π΅ Π·Π°ΠΊΡŠΡ€ΠΏΠ΅Π½ΠΎ във функцията, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° посочитС IDA към Π½Π΅ΠΉΠ½ΠΎΡ‚ΠΎ истинско Π½Π°Ρ‡Π°Π»ΠΎ. Π’ΠΎΠΉ Ρ‰Π΅ сглоби цСлия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π΅Π½ ΠΊΠΎΠ΄ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° HexRays.

Π”Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅

НаучихмС сС Π΄Π° сС справямС с обфускацията Π½Π° машинния ΠΊΠΎΠ΄ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° libsgmainso-6.4.36.so ΠΎΡ‚ UC Browser ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ функционалния ΠΊΠΎΠ΄ JNI_OnLoad.

int __fastcall real_JNI_OnLoad(JavaVM *vm)
{
int result; // r0
jclass clazz; // r0 MAPDST
int v4; // r0
JNIEnv *env; // r4
int v6; // [sp-40h] [bp-5Ch]
int v7; // [sp+Ch] [bp-10h]
v7 = *(_DWORD *)off_8AC00;
if ( !vm )
goto LABEL_39;
sub_7C4F4();
env = (JNIEnv *)sub_7C5B0(0);
if ( !env )
goto LABEL_39;
v4 = sub_72CCC();
sub_73634(v4);
sub_73E24(&unk_83EA6, &v6, 49);
clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6);
if ( clazz
&& (sub_9EE4(),
sub_71D68(env),
sub_E7DC(env) >= 0
&& sub_69D68(env) >= 0
&& sub_197B4(env, clazz) >= 0
&& sub_E240(env, clazz) >= 0
&& sub_B8B0(env, clazz) >= 0
&& sub_5F0F4(env, clazz) >= 0
&& sub_70640(env, clazz) >= 0
&& sub_11F3C(env) >= 0
&& sub_21C3C(env, clazz) >= 0
&& sub_2148C(env, clazz) >= 0
&& sub_210E0(env, clazz) >= 0
&& sub_41B58(env, clazz) >= 0
&& sub_27920(env, clazz) >= 0
&& sub_293E8(env, clazz) >= 0
&& sub_208F4(env, clazz) >= 0) )
{
result = (sub_B7B0(env, clazz) >> 31) | 0x10004;
}
else
{
LABEL_39:
result = -1;
}
return result;
}

НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ слСднитС Ρ€Π΅Π΄ΠΎΠ²Π΅:

  sub_73E24(&unk_83EA6, &v6, 49);
clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6);

Π’ΡŠΠ² функция sub_73E24 ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° класа ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ сС Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°. ΠšΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° Ρ‚Π°Π·ΠΈ функция сС ΠΏΡ€Π΅Π΄Π°Π²Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ Π½Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π±ΡƒΡ„Π΅Ρ€ ΠΈ число. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ слСд ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° функцията Ρ‰Π΅ ΠΈΠΌΠ° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½ Ρ€Π΅Π΄ Π² Π±ΡƒΡ„Π΅Ρ€Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠΉ сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π½Π° функцията FindClass, ΠΊΠΎΠΉΡ‚ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° класа ΠΊΠ°Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ числото Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° ΠΈΠ»ΠΈ Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° линията. НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° класа, Ρ‚ΠΎ трябва Π΄Π° Π½ΠΈ ΠΊΠ°ΠΆΠ΅ Π΄Π°Π»ΠΈ Π²ΡŠΡ€Π²ΠΈΠΌ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° посока. НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΎΡ‚Π±Π»ΠΈΠ·ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ сС случва Π² sub_73E24.

int __fastcall sub_73E56(unsigned __int8 *in, unsigned __int8 *out, size_t size)
{
int v4; // r6
int v7; // r11
int v8; // r9
int v9; // r4
size_t v10; // r5
int v11; // r0
struc_1 v13; // [sp+0h] [bp-30h]
int v14; // [sp+1Ch] [bp-14h]
int v15; // [sp+20h] [bp-10h]
v4 = 0;
v15 = *(_DWORD *)off_8AC00;
v14 = 0;
v7 = sub_7AF78(17);
v8 = sub_7AF78(size);
if ( !v7 )
{
v9 = 0;
goto LABEL_12;
}
(*(void (__fastcall **)(int, const char *, int))(v7 + 12))(v7, "DcO/lcK+h?m3c*q@", 16);
if ( !v8 )
{
LABEL_9:
v4 = 0;
goto LABEL_10;
}
v4 = 0;
if ( !in )
{
LABEL_10:
v9 = 0;
goto LABEL_11;
}
v9 = 0;
if ( out )
{
memset(out, 0, size);
v10 = size - 1;
(*(void (__fastcall **)(int, unsigned __int8 *, size_t))(v8 + 12))(v8, in, v10);
memset(&v13, 0, 0x14u);
v13.field_4 = 3;
v13.field_10 = v7;
v13.field_14 = v8;
v11 = sub_6115C(&v13, &v14);
v9 = v11;
if ( v11 )
{
if ( *(_DWORD *)(v11 + 4) == v10 )
{
qmemcpy(out, *(const void **)v11, v10);
v4 = *(_DWORD *)(v9 + 4);
}
else
{
v4 = 0;
}
goto LABEL_11;
}
goto LABEL_9;
}
LABEL_11:
sub_7B148(v7);
LABEL_12:
if ( v8 )
sub_7B148(v8);
if ( v9 )
sub_7B148(v9);
return v4;
}

Ѐункция sub_7AF78 създава СкзСмпляр Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π·Π° Π±Π°ΠΉΡ‚ΠΎΠ²ΠΈ масиви с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ€Π°Π·ΠΌΠ΅Ρ€ (няма Π΄Π° сС спирамС ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° Ρ‚Π΅Π·ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ). Π’ΡƒΠΊ сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ Π΄Π²Π° Ρ‚Π°ΠΊΠΈΠ²Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°: Сдиният ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° линията β€žDcO/lcK+h?m3c*q@β€œ (лСсно Π΅ Π΄Π° сС досСтитС, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ ΠΊΠ»ΡŽΡ‡), другият ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½ΠΈ Π΄Π°Π½Π½ΠΈ. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π΄Π²Π°Ρ‚Π° ΠΎΠ±Π΅ΠΊΡ‚Π° сС поставят Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° структура, която сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π½Π° функцията sub_6115C. НСка ΡΡŠΡ‰ΠΎ Π΄Π° ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°ΠΌΠ΅ ΠΏΠΎΠ»Π΅ със стойност 3 Π² Ρ‚Π°Π·ΠΈ структура.НСка Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ сС случи с Ρ‚Π°Π·ΠΈ структура слСд Ρ‚ΠΎΠ²Π°.

int __fastcall sub_611B4(struc_1 *a1, _DWORD *a2)
{
int v3; // lr
unsigned int v4; // r1
int v5; // r0
int v6; // r1
int result; // r0
int v8; // r0
*a2 = 820000;
if ( a1 )
{
v3 = a1->field_14;
if ( v3 )
{
v4 = a1->field_4;
if ( v4 < 0x19 )
{
switch ( v4 )
{
case 0u:
v8 = sub_6419C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 3u:
v8 = sub_6364C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 0x10u:
case 0x11u:
case 0x12u:
v8 = sub_612F4(
a1->field_0,
v4,
*(_QWORD *)&a1->field_8,
*(_QWORD *)&a1->field_8 >> 32,
a1->field_10,
v3,
a2);
goto LABEL_17;
case 0x14u:
v8 = sub_63A28(a1->field_0, v3);
goto LABEL_17;
case 0x15u:
sub_61A60(a1->field_0, v3, a2);
return result;
case 0x16u:
v8 = sub_62440(a1->field_14);
goto LABEL_17;
case 0x17u:
v8 = sub_6226C(a1->field_10, v3);
goto LABEL_17;
case 0x18u:
v8 = sub_63530(a1->field_14);
LABEL_17:
v6 = 0;
if ( v8 )
{
*a2 = 0;
v6 = v8;
}
return v6;
default:
LOWORD(v5) = 28032;
goto LABEL_5;
}
}
}
}
LOWORD(v5) = -27504;
LABEL_5:
HIWORD(v5) = 13;
v6 = 0;
*a2 = v5;
return v6;
}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ΡŠΡ‚ Π·Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅ Π΅ структурно ΠΏΠΎΠ»Π΅, Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈ Ρ‚ΠΎΠ²Π° Π΅ Π±ΠΈΠ»Π° присвоСна стойност 3. Π’ΠΈΠΆΡ‚Π΅ случай 3: към функцията sub_6364C ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ ΠΎΡ‚ структурата, която Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° Ρ‚Π°ΠΌ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° функция, Ρ‚.Π΅. ΠΊΠ»ΡŽΡ‡ΡŠΡ‚ ΠΈ ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ. Ако сС Π²Π³Π»Π΅Π΄Π°Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ Π² sub_6364C, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° RC4 Π² Π½Π΅Π³ΠΎ.

ИмамС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ ΠΈ ΠΊΠ»ΡŽΡ‡. НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° класа. Π•Ρ‚ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ сС случи: com/taobao/wireless/security/adapter/JNICLibrary. Π‘Ρ‚Ρ€Π°Ρ…ΠΎΡ‚Π΅Π½! НиС смС Π½Π° ΠΏΡ€Π°Π² ΠΏΡŠΡ‚.

Командно Π΄ΡŠΡ€Π²ΠΎ

Π‘Π΅Π³Π° трябва Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ прСдизвикатСлство РСгистрирайтС сС, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Π½ΠΈ насочи към функцията doCommandNative. НСка Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅, ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΈ ΠΎΡ‚ JNI_OnLoad, ΠΈ Π³ΠΎ Π½Π°ΠΌΠΈΡ€Π°ΠΌΠ΅ Π² sub_B7B0:

int __fastcall sub_B7F6(JNIEnv *env, jclass clazz)
{
char signature[41]; // [sp+7h] [bp-55h]
char name[16]; // [sp+30h] [bp-2Ch]
JNINativeMethod method; // [sp+40h] [bp-1Ch]
int v8; // [sp+4Ch] [bp-10h]
v8 = *(_DWORD *)off_8AC00;
decryptString((unsigned __int8 *)&unk_83ED9, (unsigned __int8 *)name, 0x10u);// doCommandNative
decryptString((unsigned __int8 *)&unk_83EEA, (unsigned __int8 *)signature, 0x29u);// (I[Ljava/lang/Object;)Ljava/lang/Object;
method.name = name;
method.signature = signature;
method.fnPtr = sub_B69C;
return ((int (__fastcall *)(JNIEnv *, jclass, JNINativeMethod *, int))(*env)->RegisterNatives)(env, clazz, &method, 1) >> 31;
}

И наистина Ρ‚ΡƒΠΊ Π΅ рСгистриран СстСствСн ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΈΠΌΠ΅Ρ‚ΠΎ doCommandNative. Π‘Π΅Π³Π° Π·Π½Π°Π΅ΠΌ адрСса ΠΌΡƒ. Π”Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡ€Π°Π²ΠΈ.

int __fastcall doCommandNative(JNIEnv *env, jobject obj, int command, jarray args)
{
int v5; // r5
struc_2 *a5; // r6
int v9; // r1
int v11; // [sp+Ch] [bp-14h]
int v12; // [sp+10h] [bp-10h]
v5 = 0;
v12 = *(_DWORD *)off_8AC00;
v11 = 0;
a5 = (struc_2 *)malloc(0x14u);
if ( a5 )
{
a5->field_0 = 0;
a5->field_4 = 0;
a5->field_8 = 0;
a5->field_C = 0;
v9 = command % 10000 / 100;
a5->field_0 = command / 10000;
a5->field_4 = v9;
a5->field_8 = command % 100;
a5->field_C = env;
a5->field_10 = args;
v5 = sub_9D60(command / 10000, v9, command % 100, 1, (int)a5, &v11);
}
free(a5);
if ( !v5 && v11 )
sub_7CF34(env, v11, &byte_83ED7);
return v5;
}

По ΠΈΠΌΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΎΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Π΅ Ρ‚ΡƒΠΊ Π΅ Π²Ρ…ΠΎΠ΄Π½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° всички Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Ρ€Π΅ΡˆΠΈΡ…Π° Π΄Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΡ‚ Π² Ρ€ΠΎΠ΄Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΡƒΠ²Π°ΠΌΠ΅ сС ΠΎΡ‚ функция Π½ΠΎΠΌΠ΅Ρ€ 10601.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΊΠΎΠ΄Π°, Ρ‡Π΅ Π½ΠΎΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π° Ρ‚Ρ€ΠΈ числа: ΠΊΠΎΠΌΠ°Π½Π΄Π°/10000, ΠΊΠΎΠΌΠ°Π½Π΄Π° % 10000 / 100 ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° % 10, Ρ‚.Π΅. Π² нашия случай 1, 6 ΠΈ 1. Π’Π΅Π·ΠΈ Ρ‚Ρ€ΠΈ числа, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към JNIEnv ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° функцията, сС добавят към структура ΠΈ сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ. Π‘ ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡ‚Π΅ Ρ‚Ρ€ΠΈ числа (Π½Π΅ΠΊΠ° Π³ΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΠΌ с N1, N2 ΠΈ N3) сС ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎ Π΄ΡŠΡ€Π²ΠΎ.

НСщо ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎΠ²Π°:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π”ΡŠΡ€Π²ΠΎΡ‚ΠΎ сС попълва Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ JNI_OnLoad.
Π’Ρ€ΠΈ числа ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚ ΠΏΡŠΡ‚Ρ Π² Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ. Всяко листо Π½Π° Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° вградСния адрСс Π½Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½Π°Ρ‚Π° функция. ΠšΠ»ΡŽΡ‡ΡŠΡ‚ Π΅ Π² родитСлския възСл. НамиранСто Π½Π° мястото Π² ΠΊΠΎΠ΄Π°, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ функцията, ΠΎΡ‚ която сС Π½ΡƒΠΆΠ΄Π°Π΅ΠΌ, Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° към Π΄ΡŠΡ€Π²ΠΎΡ‚ΠΎ, Π½Π΅ Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ, Π°ΠΊΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚Π΅ всички ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ структури (Π½ΠΈΠ΅ Π½Π΅ Π³ΠΈ описвамС, Π·Π° Π΄Π° Π½Π΅ Ρ€Π°Π·Π΄ΡƒΠ²Π°ΠΌΠ΅ Π²Π΅Ρ‡Π΅ доста голяма статия).

ΠžΡ‰Π΅ ΠΎΠ±ΡŠΡ€ΠΊΠ²Π°Π½Π΅

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ адрСса Π½Π° функцията, която трябва Π΄Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°: 0x5F1AC. Но Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅ Ρ€Π°Π½ΠΎ Π΄Π° сС Ρ€Π°Π΄Π²Π°ΠΌΠ΅: Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° UC Browser са ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΠ»ΠΈ ΠΎΡ‰Π΅ Π΅Π΄Π½Π° ΠΈΠ·Π½Π΅Π½Π°Π΄Π° Π·Π° нас.

Π‘Π»Π΅Π΄ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ ΠΎΡ‚ масива, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Π½ Π² Java ΠΊΠΎΠ΄Π°, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅
към функцията Π½Π° адрСс 0x4D070. И Ρ‚ΡƒΠΊ Π½ΠΈ ΠΎΡ‡Π°ΠΊΠ²Π° Π΄Ρ€ΡƒΠ³ Ρ‚ΠΈΠΏ обфускация Π½Π° ΠΊΠΎΠ΄Π°.

ΠŸΠΎΡΡ‚Π°Π²ΡΠΌΠ΅ Π΄Π²Π° индСкса Π² R7 ΠΈ R4:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ΠŸΡ€Π΅ΠΌΠ΅ΡΡ‚Π²Π°ΠΌΠ΅ ΠΏΡŠΡ€Π²ΠΈΡ индСкс към R11:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π—Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ адрСс ΠΎΡ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ индСкс:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚ΠΈΠ΄Π΅Ρ‚Π΅ Π½Π° ΠΏΡŠΡ€Π²ΠΈΡ адрСс, сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° вторият индСкс, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π² R4. Π’ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΈΠΌΠ° 230 Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚Π°.

Какво Π΄Π° ΠΏΡ€Π°Π²ΠΈΠΌ ΠΏΠΎ Π²ΡŠΠΏΡ€ΠΎΡΠ°? ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π½Π° IDA, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚Π΅Π»: Edit -> Other -> Specify switch idiom.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡΡ‚ ΠΊΠΎΠ΄ Π΅ уТасСн. Но, проправяйки си ΠΏΡŠΡ‚ ΠΏΡ€Π΅Π· Π΄ΠΆΡƒΠ½Π³Π»Π°Ρ‚Π° ΠΌΡƒ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° функция, която Π²Π΅Ρ‡Π΅ Π½ΠΈ Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚Π° sub_6115C:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ИмашС ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Ρ‚Π΅Π», Π² ΠΊΠΎΠΉΡ‚ΠΎ Π² случай 3 имашС Π΄Π΅ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° RC4. И Π² Ρ‚ΠΎΠ·ΠΈ случай структурата, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½Π° Π½Π° функцията, сС запълва ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° doCommandNative. Π”Π° си спомним ΠΊΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ°Ρ…ΠΌΠ΅ Ρ‚Π°ΠΌ magicInt със стойност 16. Π Π°Π·Π³Π»Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ случай - ΠΈ слСд няколко ΠΏΡ€Π΅Ρ…ΠΎΠ΄Π° Π½Π°ΠΌΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’ΠΎΠ²Π° Π΅ AES!

ΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΡŠΡ‚ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°, остава само Π΄Π° сС ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ: Ρ€Π΅ΠΆΠΈΠΌ, ΠΊΠ»ΡŽΡ‡ ΠΈ, Π΅Π²Π΅Π½Ρ‚ΡƒΠ°Π»Π½ΠΎ, Π²Π΅ΠΊΡ‚ΠΎΡ€ Π·Π° инициализация (Π½Π΅Π³ΠΎΠ²ΠΎΡ‚ΠΎ ΠΏΡ€ΠΈΡΡŠΡΡ‚Π²ΠΈΠ΅ зависи ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌΠ° Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° AES). Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° с тях трябва Π΄Π° сС Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° някъдС ΠΏΡ€Π΅Π΄ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° функцията sub_6115C, Π½ΠΎ Ρ‚Π°Π·ΠΈ част ΠΎΡ‚ ΠΊΠΎΠ΄Π° Π΅ особСно Π΄ΠΎΠ±Ρ€Π΅ обфусцирана, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ възниква идСята Π΄Π° сС ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π° ΠΊΠΎΠ΄ΡŠΡ‚, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ всички ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ Π½Π° функцията Π·Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Ρ…Π²ΡŠΡ€Π»Π΅Π½ΠΈ във Ρ„Π°ΠΉΠ».

ΠΊΡ€ΡŠΠΏΠΊΠ°

Π—Π° Π΄Π° Π½Π΅ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ цСлия ΠΊΠΎΠ΄ Π½Π° корСкцията Π½Π° асСмблСр Ρ€ΡŠΡ‡Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° стартиратС Android Studio, Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΌ функция, която ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° ΡΡŠΡ‰ΠΈΡ‚Π΅ Π²Ρ…ΠΎΠ΄Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ ΠΊΠ°Ρ‚ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° функция Π·Π° Π΄Π΅ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ ΠΈ записва във Ρ„Π°ΠΉΠ», слСд ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΊΠΎΠΏΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈ поставСтС ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡ‚ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Ρ‰Π΅ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌ.

Π—Π° удобството ΠΏΡ€ΠΈ добавянС Π½Π° ΠΊΠΎΠ΄ сС ΠΏΠΎΠ³Ρ€ΠΈΠΆΠΈΡ…Π° ΠΈ Π½Π°ΡˆΠΈΡ‚Π΅ приятСли ΠΎΡ‚ Π΅ΠΊΠΈΠΏΠ° Π½Π° UC Browser. НСка си ΠΏΡ€ΠΈΠΏΠΎΠΌΠ½ΠΈΠΌ, Ρ‡Π΅ Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° всяка функция ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΠΎΠ΄ Π·Π° Π±ΠΎΠΊΠ»ΡƒΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ лСсно ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π·Π°ΠΌΠ΅Π½Π΅Π½ с всСки Π΄Ρ€ΡƒΠ³. Много ΡƒΠ΄ΠΎΠ±Π½ΠΎ πŸ™‚ Π’ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° Ρ†Π΅Π»Π΅Π²Π°Ρ‚Π° функция ΠΎΠ±Π°Ρ‡Π΅ няма Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ място Π·Π° ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡ‚ΠΎ записва всички ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ във Ρ„Π°ΠΉΠ». Π’Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° Π³ΠΎ раздСля Π½Π° части ΠΈ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π±Π»ΠΎΠΊΠΎΠ²Π΅ Π±ΠΎΠΊΠ»ΡƒΠΊ ΠΎΡ‚ съсСдни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ИмашС ΠΎΠ±Ρ‰ΠΎ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ части.

ΠŸΡŠΡ€Π²Π°Ρ‚Π° част:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ARM ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ ΠΏΡ€Π΅Π· рСгистритС R0-R3, останалитС, Π°ΠΊΠΎ ΠΈΠΌΠ° Ρ‚Π°ΠΊΠΈΠ²Π°, сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ ΠΏΡ€Π΅Π· стСка. Π Π΅Π³ΠΈΡΡ‚ΡŠΡ€ΡŠΡ‚ LR носи обратния адрСс. Всичко Ρ‚ΠΎΠ²Π° трябва Π΄Π° бъдС Π·Π°ΠΏΠ°Π·Π΅Π½ΠΎ, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ функцията Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, слСд ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Ρ…Π²ΡŠΡ€Π»ΠΈΠΌ Π½Π΅ΠΉΠ½ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° трябва Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ всички рСгистри, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² процСса, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΏΡ€Π°Π²ΠΈΠΌ PUSH.W {R0-R10,LR}. Π’ R7 ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ адрСса Π½Π° списъка с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π½Π° функцията Ρ‡Ρ€Π΅Π· стСка.

ИзползванС Π½Π° функцията fopen Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ Ρ„Π°ΠΉΠ»Π° /Π΄Π°Π½Π½ΠΈ/Π»ΠΎΠΊΠ°Π»Π½ΠΈ/tmp/aes Π² Ρ€Π΅ΠΆΠΈΠΌ "ab".
Ρ‚.Π΅. Π·Π° добавянС. Π’ R0 Π·Π°Ρ€Π΅ΠΆΠ΄Π°ΠΌΠ΅ адрСса Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ„Π°ΠΉΠ»Π°, Π² R1 - адрСса Π½Π° Ρ€Π΅Π΄Π°, ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‰ Ρ€Π΅ΠΆΠΈΠΌΠ°. И Ρ‚ΡƒΠΊ ΠΊΠΎΠ΄ΡŠΡ‚ Π·Π° Π±ΠΎΠΊΠ»ΡƒΠΊ ΡΠ²ΡŠΡ€ΡˆΠ²Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ към слСдващата функция. Π—Π° Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ, поставямС Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ ΠΏΡ€Π΅Ρ…ΠΎΠ΄Π° към рСалния ΠΊΠΎΠ΄ Π½Π° функцията, заобикаляйки Π±ΠΎΠΊΠ»ΡƒΠΊΠ°, Π° вмСсто Π±ΠΎΠΊΠ»ΡƒΠΊΠ° добавямС ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° корСкцията.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

ОбаТдамС сС fopen.

ΠŸΡŠΡ€Π²ΠΈΡ‚Π΅ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° Π½Π° функцията AES ΠΈΠΌΠ°Ρ‚ Ρ‚ΠΈΠΏ Int. Въй ΠΊΠ°Ρ‚ΠΎ записахмС рСгистритС Π² стСка Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ просто Π΄Π° ΠΏΡ€Π΅Π΄Π°Π΄Π΅ΠΌ функцията fwrite Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ адрСси Π² стСка.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ°ΠΌΠ΅ Ρ‚Ρ€ΠΈ структури, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π» към Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π·Π° ΠΊΠ»ΡŽΡ‡Π°, Π²Π΅ΠΊΡ‚ΠΎΡ€ Π·Π° инициализация ΠΈ ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½ΠΈ Π΄Π°Π½Π½ΠΈ.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Накрая Π·Π°Ρ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ Ρ„Π°ΠΉΠ»Π°, Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²Π΅Ρ‚Π΅ рСгистритС ΠΈ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»Π΅Ρ‚Π΅ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π΅Π°Π»Π½Π°Ρ‚Π° функция AES.

Π‘ΡŠΠ±ΠΈΡ€Π°ΠΌΠ΅ APK с ΠΏΠ°Ρ‡Π²Π°Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, подписвамС Π³ΠΎ, ΠΊΠ°Ρ‡Π²Π°ΠΌΠ΅ Π³ΠΎ Π½Π° устройството/Π΅ΠΌΡƒΠ»Π°Ρ‚ΠΎΡ€Π° ΠΈ Π³ΠΎ стартирамС. Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ‡Π΅ Π½Π°ΡˆΠΈΡΡ‚ дъмп сС създава ΠΈ Ρ‚Π°ΠΌ сС записват ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΈ. Π‘Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π΅ само Π·Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°, Π° цялото ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ ΠΌΠΈΠ½Π°Π²Π° ΠΏΡ€Π΅Π· Π²ΡŠΠΏΡ€ΠΎΡΠ½Π°Ρ‚Π° функция. Но ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π½Π΅ са Ρ‚Π°ΠΌ ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° заявка Π½Π΅ сС Π²ΠΈΠΆΠ΄Π° Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Π—Π° Π΄Π° Π½Π΅ Ρ‡Π°ΠΊΠ°ΠΌΠ΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ UC Browser Π±Π»Π°Π³ΠΎΠ²ΠΎΠ»ΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°Ρ‚Π° заявка, Π½Π΅ΠΊΠ° Π²Π·Π΅ΠΌΠ΅ΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ ΠΏΠΎ-Ρ€Π°Π½ΠΎ, ΠΈ ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π΄Π° Π·Π°ΠΊΡŠΡ€ΠΏΠΈΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ: Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ към onCreate Π½Π° основната дСйност.

    const/16 v1, 0x62
new-array v1, v1, [B
fill-array-data v1, :encrypted_data
const/16 v0, 0x1f
invoke-static {v0, v1}, Lcom/uc/browser/core/d/c/g;->j(I[B)[B
move-result-object v1
array-length v2, v1
invoke-static {v2}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v2
const-string v0, "ololo"
invoke-static {v0, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

БглобявамС, подписвамС, инсталирамС, пускамС. ΠŸΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ NullPointerException, Π·Π°Ρ‰ΠΎΡ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ Π²ΡŠΡ€Π½Π° Π½ΡƒΠ»Π°.

По Π²Ρ€Π΅ΠΌΠ΅ Π½Π° ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½ΠΈΡ Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄Π° бСшС ΠΎΡ‚ΠΊΡ€ΠΈΡ‚Π° функция, която Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π° интСрСсни Ρ€Π΅Π΄ΠΎΠ²Π΅: β€œMETA-INF/” ΠΈ β€œ.RSA”. ИзглСТда, Ρ‡Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ провСрява своя сСртификат. Или Π΄ΠΎΡ€ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΎΡ‚ Π½Π΅Π³ΠΎ. Наистина Π½Π΅ искам Π΄Π° сС Π·Π°Π½ΠΈΠΌΠ°Π²Π°ΠΌ с Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ сС случва със сСртификата, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ просто Ρ‰Π΅ ΠΌΡƒ прСдоставим правилния сСртификат. НСка Π·Π°ΠΊΡŠΡ€ΠΏΠΈΠΌ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ Ρ€Π΅Π΄, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ вмСсто β€žMETA-INF/β€œ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ β€žBLABLINF/β€œ, ΡΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΏΠ°ΠΏΠΊΠ° с Ρ‚ΠΎΠ²Π° ΠΈΠΌΠ΅ Π² APK ΠΈ Π΄ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ сСртификата Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π° Π½Π° ΠΊΠ°Ρ‚Π΅Ρ€ΠΈΡ†Π° Ρ‚Π°ΠΌ.

БглобявамС, подписвамС, ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π°ΠΌΠ΅, пускамС. Π‘ΠΈΠ½Π³ΠΎ! НиС ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΠ»ΡŽΡ‡Π°!

MitM

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ ΠΊΠ»ΡŽΡ‡ ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π·Π° инициализация, Ρ€Π°Π²Π΅Π½ Π½Π° ΠΊΠ»ΡŽΡ‡Π°. НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° Π² Ρ€Π΅ΠΆΠΈΠΌ CBC.

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅ URL адрСса Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π°, Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° MD5, β€žextract_unzipsizeβ€œ ΠΈ число. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅: MD5 Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π° Π΅ ΡΡŠΡ‰ΠΈΡΡ‚, Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΅ ΡΡŠΡ‰ΠΈΡΡ‚. ΠžΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ сС Π΄Π° ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°ΠΌΠ΅ Ρ‚Π°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ Π΄Π° я Π΄Π°Π΄Π΅ΠΌ Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°. Π—Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ Π½Π°ΡˆΠ°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с ΠΊΠΎΡ€Π΅ΠΊΡ†ΠΈΠΈ сС Π΅ Π·Π°Ρ€Π΅Π΄ΠΈΠ»Π°, Ρ‰Π΅ стартирамС Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈΠ΅ Π·Π° създаванС Π½Π° SMS с тСкст β€žPWNED!β€œ Π©Π΅ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π΄Π²Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π°: puds.ucweb.com/upgrade/index.xhtml ΠΈ Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΡ‚Π΅ Π°Ρ€Ρ…ΠΈΠ²Π°. Π’ ΠΏΡŠΡ€Π²ΠΈΡ замСнямС MD5 (Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π΅ сС промСня слСд Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π΅), във втория Π΄Π°Π²Π°ΠΌΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π° с Π·Π°ΠΊΡŠΡ€ΠΏΠ΅Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°.

Π‘Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ сС ΠΎΠΏΠΈΡ‚Π²Π° Π΄Π° ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈ Π°Ρ€Ρ…ΠΈΠ²Π° няколко ΠΏΡŠΡ‚ΠΈ, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ Π΄Π°Π²Π° Π³Ρ€Π΅ΡˆΠΊΠ°. Π―Π²Π½ΠΎ Π½Π΅Ρ‰ΠΎ
Ρ‚ΠΎΠΉ Π½Π΅ харСсва. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΌΡŠΡ‚Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сС ΠΎΠΊΠ°Π·Π°, Ρ‡Π΅ ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ ΠΏΡ€Π΅Π΄Π°Π²Π° ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π°:

Π’ΡŠΡ€ΡΡΡ‚ сС уязвимости Π² UC Browser

Π’ΠΎΠΉ Π΅ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ Π² LEB128. Π‘Π»Π΅Π΄ корСкцията Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π° с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° сС ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΌΠ°Π»ΠΊΠΎ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ счСтС, Ρ‡Π΅ Π°Ρ€Ρ…ΠΈΠ²ΡŠΡ‚ Π΅ ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Π½ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΈ слСд няколко ΠΎΠΏΠΈΡ‚Π° ΠΈΠ·Π΄Π°Π΄Π΅ Π³Ρ€Π΅ΡˆΠΊΠ°.

ΠšΠΎΡ€ΠΈΠ³ΠΈΡ€Π°ΠΌΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π°... И – ΠΏΠΎΠ±Π΅Π΄Π°! πŸ™‚ Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Π΅ във Π²ΠΈΠ΄Π΅ΠΎΡ‚ΠΎ.

https://www.youtube.com/watch?v=Nfns7uH03J8

ΠŸΠΎΡΠ»Π΅Π΄ΠΈΡ†ΠΈ ΠΈ рСакция Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

По ΡΡŠΡ‰ΠΈΡ Π½Π°Ρ‡ΠΈΠ½ Ρ…Π°ΠΊΠ΅Ρ€ΠΈΡ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ нСсигурната функция Π½Π° UC Browser, Π·Π° Π΄Π° разпространяват ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’Π΅Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‰Π΅ работят Π² контСкста Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ всички Π½Π΅Π³ΠΎΠ²ΠΈ систСмни Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. Π’ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° Ρ‚ΠΎΠ²Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° Ρ„ΠΈΡˆΠΈΠ½Π³ ΠΏΡ€ΠΎΠ·ΠΎΡ€Ρ†ΠΈ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΎΡ€Π°Π½ΠΆΠ΅Π²Π°Ρ‚Π° китайска ΠΊΠ°Ρ‚Π΅Ρ€ΠΈΡ†Π°, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ влизания, ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈ бисквитки, ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½ΠΈ Π² Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ.

Π‘Π²ΡŠΡ€Π·Π°Ρ…ΠΌΠ΅ сС с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π½Π° UC Browser ΠΈ Π³ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Ρ…ΠΌΠ΅ Π·Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠΎΠΉΡ‚ΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΡ…ΠΌΠ΅, ΠΎΠΏΠΈΡ‚Π°Ρ…ΠΌΠ΅ сС Π΄Π° посочим уязвимостта ΠΈ Π½Π΅ΠΉΠ½Π°Ρ‚Π° опасност, Π½ΠΎ Ρ‚Π΅ Π½Π΅ ΠΎΠ±ΡΡŠΠ΄ΠΈΡ…Π° Π½ΠΈΡ‰ΠΎ с нас. ΠœΠ΅ΠΆΠ΄ΡƒΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈ Π΄Π° ΠΏΠΎΠΊΠ°Π·Π²Π° опасната си функция ΠΏΡ€Π΅Π΄ ΠΎΡ‡ΠΈΡ‚Π΅. Но слСд ΠΊΠ°Ρ‚ΠΎ Ρ€Π°Π·ΠΊΡ€ΠΈΡ…ΠΌΠ΅ подробноститС Π·Π° уязвимостта, Π²Π΅Ρ‡Π΅ Π½Π΅ бСшС възмоТно Π΄Π° я ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΏΡ€Π΅Π΄ΠΈ. 27 ΠΌΠ°Ρ€Ρ‚ бСшС
бСшС пусната Π½ΠΎΠ²Π° вСрсия Π½Π° UC Browser 12.10.9.1193, която ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΡΡŠΡ€Π²ΡŠΡ€Π° Ρ‡Ρ€Π΅Π· HTTPS: puds.ucweb.com/upgrade/index.xhtml.

Π’ допълнСниС, слСд β€žΠΏΠΎΠΏΡ€Π°Π²ΠΊΠ°Ρ‚Π°β€œ ΠΈ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° написванС Π½Π° Ρ‚Π°Π·ΠΈ статия, ΠΎΠΏΠΈΡ‚ΡŠΡ‚ Π·Π° отварянС Π½Π° PDF Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° с тСкст β€žΠΠΌΠΈ сСга, Π½Π΅Ρ‰ΠΎ сС ΠΎΠ±ΡŠΡ€ΠΊΠ°!β€œ Заявка към ΡΡŠΡ€Π²ΡŠΡ€Π° Π½Π΅ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½Π° ΠΏΡ€ΠΈ ΠΎΠΏΠΈΡ‚ Π·Π° отварянС Π½Π° PDF, Π½ΠΎ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½Π° заявка ΠΏΡ€ΠΈ стартиранС Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π°ΠΌΠ΅ΠΊΠ²Π° Π·Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Ρ‰Π°Ρ‚Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° изтСглянС Π½Π° изпълним ΠΊΠΎΠ΄ Π² Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π½Π° Google Play.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€