Π’ΡŠΡ€ΡΠΈΠΌ уязвимости Π² 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 Π·Π°Ρ€Π΅ΠΆΠ΄Π° изпълним ΠΊΠΎΠ΄, Ρ‚ΠΎΠΉ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ Π½Π΅Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ΠΎ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΎ Π·Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Π½Π΅ Π½Π° Π°Ρ‚Π°ΠΊΠ° Man-in-the-Middle. НСка Π²ΠΈΠ΄ΠΈΠΌ Π΄Π°Π»ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠΈΠΌ Ρ‚Π°ΠΊΠ°Π²Π° Π°Ρ‚Π°ΠΊΠ°.

Всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ написано ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ, Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»Π½ΠΎ Π·Π° вСрсията Π½Π° 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:

    ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ Ρ„ΠΈΠ½Π°Π»Π΅Π½ 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("]ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚:");
            v4.append(arg9.iGX.ipR);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]вСрсия:");
            v4.append(arg9.iGX.iEn);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]Ρ‚ΠΈΠΏ_надстройка:");
            v4.append(arg9.iGX.mMode);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]Ρ„Π»Π°Π³_сила:");
            v4.append(arg9.iGX.iEo);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]Ρ‚ΠΈΡ…Π°_Ρ€Π΅ΠΆΠΈΠΌ:");
            v4.append(arg9.iGX.iDQ);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]Ρ‚ΠΈΡ…_Ρ‚ΠΈΠΏ:");
            v4.append(arg9.iGX.iEr);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]Ρ‚ΠΈΡ…_ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅:");
            v4.append(arg9.iGX.iEp);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]Ρ‚ΠΈΡ…_Ρ„Π°ΠΉΠ»:");
            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("]Ρ‚ΠΈΠΏ_изтСглянС:");
            v4.append(arg9.mDownloadType);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]Π³Ρ€ΡƒΠΏΠ°_изтСглянС:");
            v4.append(arg9.mDownloadGroup);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]ΠΏΡŠΡ‚_изтСглянС:");
            v4.append(arg9.iGH);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]вСрсия_Π°ΠΏΠΎΠ»ΠΎ_Π΄Π΅Ρ‚Π΅:");
            v4.append(arg9.iGX.iEx);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]сСрия_Π°ΠΏΠΎΠ»ΠΎ:");
            v4.append(arg9.iGX.iEw);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°_cpu_Π°ΠΏΠΎΠ»ΠΎ:");
            v4.append(arg9.iGX.iEt);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]vfp3_cpu_Π°ΠΏΠΎΠ»ΠΎ:");
            v4.append(arg9.iGX.iEv);
            v4 = new StringBuilder("[");
            v4.append(v3_1);
            v4.append("]vfp_cpu_Π°ΠΏΠΎΠ»ΠΎ:");
            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("]ΠΈΠΌΠ΅_ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:");
                    v5.append(((au)v4_1).getName());
                    v5 = new StringBuilder("[");
                    v5.append(((au)v4_1).getName());
                    v5.append("]ΠΈΠΌΠ΅_вСрсия_ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:");
                    v5.append(((au)v4_1).aDA());
                    v5 = new StringBuilder("[");
                    v5.append(((au)v4_1).getName());
                    v5.append("]ΠΊΠΎΠ΄_вСрсия_ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:");
                    v5.append(((au)v4_1).gBl);
                    v5 = new StringBuilder("[");
                    v5.append(((au)v4_1).getName());
                    v5.append("]Ρ‚ΠΈΠΏ_заявка_ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚:");
                    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("ver_os", c.getRomInfo()));
            v3_2.add(g.fs("Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°_процСсор", com.uc.b.a.a.c.getCpuArch()));
            v3_2.add(g.fs("Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°_cpu", com.uc.b.a.a.c.Pb()));
            String v4_3 = com.uc.b.a.a.c.Pd();
            v3_2.add(g.fs("vfp_cpu", v4_3));
            v3_2.add(g.fs("Ρ‚ΠΈΠΏ_ΠΌΡ€Π΅ΠΆΠ°", String.valueOf(com.uc.base.system.a.Jo())));
            v3_2.add(g.fs("отхост", arg9.iGX.iEm));
            v3_2.add(g.fs("вСрсия_ΠΏΠ»Π°Π³ΠΈΠ½", arg9.iGX.iEn));
            v3_2.add(g.fs("Ρ†Π΅Π»Π΅Π²ΠΈ_Π΅Π·ΠΈΠΊ", arg9.iGX.iEs));
            v3_2.add(g.fs("Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°_cpu_vitamio", arg9.iGX.iEt));
            v3_2.add(g.fs("vfp_vitamio", arg9.iGX.iEu));
            v3_2.add(g.fs("vfp3_vitamio", arg9.iGX.iEv));
            v3_2.add(g.fs("вСрсия_Π΄Π΅Ρ‚Π΅_ΠΏΠ»Π°Π³ΠΈΠ½", arg9.iGX.iEx));
            v3_2.add(g.fs("сСрия_вСрсия", arg9.iGX.iEw));
            v3_2.add(g.fs("Π΄Π΅Ρ‚Π΅_вСрсия", r.aVw()));
            v3_2.add(g.fs("md5_cur_вСрсия", arg9.iGX.iEl));
            v3_2.add(g.fs("подпис_cur_вСрсия", SystemHelper.getUCMSignature()));
            v3_2.add(g.fs("Π»ΠΎΠ³_надстройка", i.bjt()));
            v3_2.add(g.fs("Ρ‚ΠΈΡˆΠΈΠ½Π°_инсталация", String.valueOf(arg9.iGX.iDQ)));
            v3_2.add(g.fs("Ρ‚ΠΈΡ…ΠΎ_ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅", String.valueOf(arg9.iGX.iEp)));
            v3_2.add(g.fs("Ρ‚ΠΈΡ…_Ρ„Π°ΠΉΠ»", arg9.iGX.iEq));
            v3_2.add(g.fs("Ρ‚ΠΈΡ…_Ρ‚ΠΈΠΏ", String.valueOf(arg9.iGX.iEr)));
            v3_2.add(g.fs("Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°_cpu", com.uc.b.a.a.c.Pc()));
            v3_2.add(g.fs("настройка_cpu", SystemHelper.getCpuInstruction()));
            boolean v4_4 = v4_3 == null || !v4_3.contains("neon") ? false : true;
            v3_2.add(g.fs("Π½Π΅ΠΎΠ½", String.valueOf(v4_4)));
            v3_2.add(g.fs("ядра_cpu", 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("ΠΎΠ±Ρ‰ΠΎ_ram", 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("Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅_Π΅ΠΊΡ€Π°Π½", v7.toString()));
            v3_2.add(g.fs("Π½ΠΈΠ²ΠΎ_api", String.valueOf(Build$VERSION.SDK_INT)));
            v3_2.add(g.fs("списък_uc_apk", 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", "Π΄Π°", "нСуспСх");
            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", "Π΄Π°", "нСуспСх");
            return;
        }

        if(TextUtils.isEmpty(this.iGY.mUpgradeUrl)) {
            this.iGY.iGI.a(arg9, "up_url", "Π΄Π°", "нСуспСх");
            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", "Π΄Π°", "успСх");
        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. Π—Π°Π±Π΅Π»Π΅ΠΆΠ΅Ρ‚Π΅, Ρ‡Π΅ ΠΊΠ°Ρ‚ΠΎ ΠΏΡŠΡ€Π²ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π² Π½Π΅Π³ΠΎ сС ΠΏΠΎΠ΄Π°Π²Π° Π±Π°ΠΉΡ‚ ΠΎΡ‚Offset 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 ΠΊΠΎΠ΄Π° ΠΊΠ°Ρ‚ΠΎ Π½Π°Ρ‚ΠΈΠ²Π΅Π½. ΠŸΡŠΡ€Π²ΠΈΡΡ‚ β€” Π΄Π° ΠΌΡƒ Π΄Π°Π΄Π΅ΠΌ ΠΈΠΌΠ΅ ΠΎΡ‚ Π²ΠΈΠ΄Π° 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 "индСкс =", 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 "Ρ‚Π°Π±Π»ΠΈΡ†Π° =", 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 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  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 "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 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, Ρ‡Π΅ Ρ‚ΠΎΠ²Π° Π΅ Ρ‚Π°ΠΊΠΎΠ²Π° ΠΏΡ€Π΅Π²ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅: Edit -> Other -> Specify switch idiom.

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

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΡΡ‚ ΠΊΠΎΠ΄ Π΅ ΡΡ‚Ρ€Π°ΡˆΠ΅Π½. Но, ΠΏΡ€ΠΎΡƒΡ‡Π²Π°ΠΉΠΊΠΈ Π΄Π΅Π±Ρ€ΠΈΡ‚Π΅ ΠΌΡƒ, ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π·Π°Π±Π΅Π»Π΅ΠΆΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π²Π΅Ρ‡Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚Π° Π½ΠΈ функция. sub_6115C:

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

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

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

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

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

ΠŸΠ°Ρ‚Ρ‡

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

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

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

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

Π’ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° ARM ΠΏΡŠΡ€Π²ΠΈΡ‚Π΅ Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€Π° Π½Π° функцията сС ΠΏΡ€Π΅Π΄Π°Π²Π°Ρ‚ Ρ‡Ρ€Π΅Π· рСгистритС R0-R3, Π° останалитС, Π°ΠΊΠΎ ΠΈΠΌΠ° Ρ‚Π°ΠΊΠΈΠ²Π°, - Ρ‡Ρ€Π΅Π· стСка. Π’ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° LR сС ΠΏΡ€Π΅Π΄Π°Π²Π° Π°Π΄Ρ€Π΅ΡΡŠΡ‚ Π·Π° Π²Ρ€ΡŠΡ‰Π°Π½Π΅. Всичко Ρ‚ΠΎΠ²Π° трябва Π΄Π° сС Π·Π°ΠΏΠ°Π·ΠΈ, Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ функцията Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ слСд ΠΊΠ°Ρ‚ΠΎ ΠΈΠ· dump-ΠΈΠΌ Π½Π΅ΠΉΠ½ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ. ОсвСн Ρ‚ΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΠΌ всички рСгистри, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² процСса, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΏΡ€Π°Π²ΠΈΠΌ 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 с ΠΏΡ€ΠΎΠΏΠ°Ρ‚Ρ‡Π΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, подписвамС, ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΠΌΠ΅ Π½Π° устройството/Π΅ΠΌΡƒΠ»Π°Π³ΠΎΡ€, стартирамС. Π’ΠΈΠΆΠ΄Π°ΠΌΠ΅, Ρ‡Π΅ Π½Π°ΡˆΠΈΡΡ‚ dump сС създава ΠΈ Ρ‚Π°ΠΌ сС записват ΠΌΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΈ. Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ΡŠΡ‚ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π΅ само Π·Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° ΠΈ всичкото ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° Ρ‡Ρ€Π΅Π· Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Π½Π°Ρ‚Π° функция. А Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ ΠΏΠΎ някаква ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° липсват ΠΈ Π² Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Π½Π΅ сС Π²ΠΈΠΆΠ΄Π° нуТният Π·Π°ΠΏΠΈΡ‚. Π—Π° Π΄Π° Π½Π΅ Ρ‡Π°ΠΊΠ°Ρ‚Π΅, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ 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 Π·Π° създаванС Π½Π° 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.

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

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