Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² 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.b.x, Π° ΠΎΡ‚ Π½Π΅Π³ΠΎ към com.uc.browser.core.d.c.f.e:

    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β€œ), Ρ‚ΡƒΠΊ трябва Π΄Π° сС ΠΈΠ·Π²ΠΈΠΊΠ° ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π°.
ΠŸΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ към ΠΌΠ΅Ρ‚ΠΎΠ΄Π° g.j. ЗабСлязвамС, Ρ‡Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΏΡŠΡ€Π²ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² Π½Π΅Π³ΠΎ сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π±Π°ΠΉΡ‚ с отмСстванС 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 ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Ρ‚Ρ€ΠΈΡ‚Π΅ възмоТни Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°.

ΠŸΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ с Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΊΠΎΠ΄Π°. Π‘Π»Π΅Π΄ няколко прСскочивания стигамС Π΄ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ с Π³ΠΎΠ²ΠΎΡ€Π΅Ρ‰ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ decryptBytesByKey.

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

    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  0) {
            return this.b(magicInt, keyId, encrypted, magicString);
        }
 
        throw new SecException("", 301);
    }
//...
}

Π’ΡƒΠΊ Π½Π°ΡˆΠΈΡΡ‚ списък с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ сС допълва с ΠΎΡ‰Π΅ Π΄Π²Π΅ Ρ†Π΅Π»ΠΈ числа: 2 ΠΈ 0. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ,
2 ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° Π΄Π΅ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅, ΠΊΠ°ΠΊΡ‚ΠΎ Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° doFinal систСмния клас javax.crypto.Cipher. И всичко Ρ‚ΠΎΠ²Π° сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π½Π° някакъв Router с Π½ΠΎΠΌΠ΅Ρ€ 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 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌΠ΅ ΠΊΡƒΠΏ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ·ΠΎΡ€Ρ†ΠΈ с Π³Ρ€Π΅ΡˆΠΊΠΈ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡŠΡ‚ Π΅, Ρ‡Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π½Π° сСкциитС (section header table) Π΅ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½Π°. Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ Π½Π°Ρ€ΠΎΡ‡Π½ΠΎ, Π·Π° Π΄Π° сС услоТни Π°Π½Π°Π»ΠΈΠ·ΡŠΡ‚.

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

Но тя Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ°: Π·Π° Π΄Π° Π·Π°Ρ€Π΅Π΄ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ELF-Ρ„Π°ΠΉΠ»Π° ΠΈ Π΄Π° Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅, напълно Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½Π° Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π½Π° сСгмСнтитС (program header table). Π—Π°Ρ‚ΠΎΠ²Π° просто ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°ΠΌΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° Π½Π° сСкциитС, Π½ΡƒΠ»ΠΈΡ€Π°ΠΉΠΊΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ»Π΅Ρ‚Π° Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°Ρ‚Π°.

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

ΠžΡ‚Π½ΠΎΠ²ΠΎ отварямС Ρ„Π°ΠΉΠ»Π° Π² IDA.

Има Π΄Π²Π° Π½Π°Ρ‡ΠΈΠ½Π° Π΄Π° ΡΡŠΠΎΠ±Ρ‰ΠΈΠΌ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π°Ρ‚Π° Java машина къдС Ρ‚ΠΎΡ‡Π½ΠΎ Π² Π½Π°Ρ‚ΠΈΠ²Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° сС Π½Π°ΠΌΠΈΡ€Π° рСализацията Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, обявСн Π² Java ΠΊΠΎΠ΄Π° ΠΊΠ°Ρ‚ΠΎ native. ΠŸΡŠΡ€Π²ΠΈΡΡ‚ β€” Π΄Π° ΠΌΡƒ Π΄Π°Π΄Π΅ΠΌ ΠΈΠΌΠ΅ Π² Π²ΠΈΠ΄Π° Π½Π° Java_ΠΈΠΌΠ΅_ΠΏΠ°ΠΊΠ΅Ρ‚Π°_ИмСКлас_ΠΈΠΌΠ΅ΠœΠ΅Ρ‚ΠΎΠ΄Π°.

Вторият Π΅ Π΄Π° Π³ΠΎ рСгистрирамС ΠΏΡ€ΠΈ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° (Π² функцията JNI_OnLoad)
Ρ‡Ρ€Π΅Π· ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° функцията RegisterNatives.

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

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

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

Какво сС случва Ρ‚ΡƒΠΊ? На ΠΏΡŠΡ€Π²ΠΎ място, Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ ΠΈ краят Π½Π° функцията са Ρ‚ΠΈΠΏΠΈΡ‡Π½ΠΈ Π·Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ARM. ΠŸΡŠΡ€Π²Π°Ρ‚Π° инструкция Π² стСка Π·Π°ΠΏΠ°Π·Π²Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° рСгистритС, ΠΊΠΎΠΈΡ‚ΠΎ функцията Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² своята Ρ€Π°Π±ΠΎΡ‚Π° (Π² Ρ‚ΠΎΠ·ΠΈ случай R0, R1 ΠΈ R2), ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° рСгистра LR, Π² ΠΊΠΎΠΉΡ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π°Π΄Ρ€Π΅ΡΡŠΡ‚ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ ΠΎΡ‚ функцията. ΠŸΠΎΡΠ»Π΅Π΄Π½Π°Ρ‚Π° инструкция Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π° Π·Π°ΠΏΠ°Π·Π΅Π½ΠΈΡ‚Π΅ рСгистри, ΠΊΠ°Ρ‚ΠΎ Π°Π΄Ρ€Π΅ΡΡŠΡ‚ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅ Π²Π΅Π΄Π½Π°Π³Π° сС поставя Π² Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° PC β€” ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚ функцията. Но Π°ΠΊΠΎ сС Π²Π³Π»Π΅Π΄Π°Ρ‚Π΅ ΠΏΠΎ-Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π±Π΅Π»Π΅ΠΆΠΈΡ‚Π΅, Ρ‡Π΅ прСдпослСдната инструкция промСня адрСса Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅, ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ Π² стСка. НСка изчислим какъв Ρ‰Π΅ бъдС Ρ‚ΠΎΠΉ слСд
ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄Π°. Π’ R1 сС Π·Π°Ρ€Π΅ΠΆΠ΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ адрСс 0xB130, ΠΎΡ‚ Π½Π΅Π³ΠΎ сС ΠΈΠ·Π²Π°ΠΆΠ΄Π° 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  1023 or 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 "НСправилСн Ρ‚ΠΈΠΏ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° Π½Π°", hex(ea1), "-", get_operand_type(ea1, 0), get_operand_type(ea1, 1)
            table = None
        if table is None:
            print "ΠΠ΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π°"
        else:
            print "table =", hex(table)
            offset = get_wide_dword(table + (index << 2))
            put_unconditional_branch(ea, table + offset)
    else:
        print "НСпознат ΠΊΠΎΠ΄", get_operand_type(ea1, 0), get_operand_value(ea1, 0), get_operand_type(ea1, 1) == 2
else:
    print "ΠΠ΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ Π½Π° ΠΏΡŠΡ€Π²Π°Ρ‚Π° инструкция"

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

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

IDA ΠΎΡ‚Π½ΠΎΠ²ΠΎ Π½Π΅ Π΅ Ρ€Π°Π·ΠΏΠΎΠ·Π½Π°Π»Π° Ρ‚ΠΎΠ·ΠΈ ΡƒΡ‡Π°ΡΡ‚ΡŠΠΊ ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ΄. ПомагамС ΠΉ ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Ρ‚Π°ΠΌ Π΄Ρ€ΡƒΠ³Π° конструкция:

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

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

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

И наистина, Ρ‚ΡƒΠΊ сС Π²Π·ΠΈΠΌΠ° dword ΠΎΡ‚ адрСса, ΠΊΠΎΠΉΡ‚ΠΎ сС Π½Π°ΠΌΠΈΡ€Π° Π² LR, прибавя сС към Ρ‚ΠΎΠ·ΠΈ адрСс, слСд ΠΊΠΎΠ΅Ρ‚ΠΎ стойността ΠΎΡ‚ получСния адрСс сС поставя Π² стСка. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° към LR сС прибавя 4, Π·Π° Π΄Π° пропуснСм Ρ‚ΠΎΠ²Π° отмСстванС ΠΏΡ€ΠΈ Π²Ρ€ΡŠΡ‰Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚ функцията. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° 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 <> 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 Π½Π΅ Π΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π°"
    else:
        print "НСправилСн Ρ‚ΠΈΠΏ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ Π½Π° +4:", get_operand_type(ea + 4, 0)
else:
    print "ΠΠ΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ ΠΏΡŠΡ€Π²ΠΈ инструкции"

ΠŸΠΎΡΡ‚Π°Π²ΡΠΌΠ΅ курсора Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° конструкцията, която искамС Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΠΌ β€” 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  1023 or 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 "ΠΠ΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€ΠΈΡ‚ ΠΏΡŠΡ€Π²Π° инструкция"

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

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² 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, която ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΊΠ°Ρ‚ΠΎ Π²Ρ‚ΠΎΡ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° класа. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, числото Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Π±ΡƒΡ„Π΅Ρ€Π° ΠΈΠ»ΠΈ Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° Π½ΠΈΠ·a. НСка ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΠΌΠ΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° класа, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚ΠΎ трябва Π΄Π° Π½ΠΈ посочи Π² ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° посока. НСка Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ сС случва Π² 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;
}

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

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

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

Π‘Π΅Π³Π° трябва Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ RegisterNatives, ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‰Π΅ Π½ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ΅ функцията 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.

По ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Π΅ ΠΎΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° сС ΠΈΠ·Π²Π»ΠΈΡ‡Π°Ρ‚ Ρ‚Ρ€ΠΈ числа: command / 10000, command % 10000 / 100 ΠΈ command % 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, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ Ρ‚Π°ΠΊΡŠΠ² switch: Edit -> Other -> Specify switch idiom.

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

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

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

Π’Π°ΠΌ имашС switch, Π² ΠΊΠΎΠΉΡ‚ΠΎ Π² case 3 сС Π½Π°ΠΌΠΈΡ€Π°ΡˆΠ΅ Π΄Π΅ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ RC4. А Π² Ρ‚ΠΎΠ·ΠΈ случай структурата, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½Π° Π½Π° функцията, сС запълва ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅, ΠΏΡ€Π΅Π΄Π°Π΄Π΅Π½ΠΈ Π² doCommandNative. БпомнямС си, Ρ‡Π΅ Ρ‚Π°ΠΌ имашС magicInt с стойност 16. ПоглСТдамС ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΈΡ case – ΠΈ слСд няколко прСминавания Π½Π°ΠΌΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π°, с ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°ΠΌΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ°.

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

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

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

ΠŸΠ°Ρ‚Ρ‡

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

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

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

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

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

Π‘ ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функцията fopen Ρ‰Π΅ ΠΎΡ‚Π²ΠΎΡ€ΠΈΠΌ Ρ„Π°ΠΉΠ»Π° /data/local/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, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΡŠΡ‚ Π΅ Π²ΡŠΡ€Π½Π°Π» null.

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

Π‘ΡŠΠ±ΠΈΡ€Π°ΠΌΠ΅, подписвамС, инсталирамС, стартирамС. Π‘ΠΈΠ½Π³ΠΎ! ΠšΠ»ΡŽΡ‡ΡŠΡ‚ Π΅ наш!

MitM

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

Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² UC Browser

Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅ URL Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π°, Π½Π΅Ρ‰ΠΎ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° MD5, Β«extract_unzipsizeΒ» ΠΈ число. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ²Π°ΠΌΠ΅: MD5 Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π° съвпада, Ρ€Π°Π·ΠΌΠ΅Ρ€ΡŠΡ‚ Π½Π° Ρ€Π°Π·ΠΎΠΏΠ°ΠΊΠΎΠ²Π°Π½Π°Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° съвпада. ΠžΠΏΠΈΡ‚Π²Π°ΠΌΠ΅ Π΄Π° ΠΏΠ°Ρ‚Ρ‡ΠΈΠΌ Ρ‚Π°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈ Π΄Π° я прСдоставим Π½Π° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°. Π—Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Π΅ Π½Π°ΡˆΠ°Ρ‚Π° ΠΏΠ°Ρ‚Ρ‡ΠΈΡ€Π°Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π΅ Π·Π°Ρ€Π΅Π΄Π΅Π½Π°, Ρ‰Π΅ стартирамС Intent Π·Π° създаванС Π½Π° БМБ с тСкст Β«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.

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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster