Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π—Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ Ρ…Π°ΠΊΠ΅Ρ€ΠΎΠ² ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… сСтСй». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 64

Автор ΠšΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ² Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²

Π―Π²Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄. Если ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π° извСстСн адрСс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅ΠΌΡƒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ явного ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° (direct jump). ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ стСка. НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ адрСс стСка ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ, ΠΏΡ€ΠΈ явном ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ошибки. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, адрСс стСка ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ, поэтому ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² памяти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π΄ΠΎ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ°, сокращая Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΊΠΎΠ΄Ρƒ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, адрСс размСщСния Π² памяти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, поэтому Π½ΡƒΠΆΠ½ΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ измСнСния адрСса ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°. Бпособ явного ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° прост для использования. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ…ΠΈΡ‚Ρ€ΠΎΡƒΠΌΠ½Ρ‹Π΅ способы, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ адрСса (см. ΡΠ΅ΠΊΡ†ΠΈΡŽ Β«ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ NOPΒ»). Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС UNIX адрСс стСка Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ, поэтому для Π½Π΅Π΅ описываСмый способ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ссли ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ Π²Π½Π΅ стСка, Ρ‚ΠΎ способ явного ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π²Π½Π΅ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ†ΠΈΠΈ.

НСявный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄. РСгистр ESP ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² стСкС. Бпособ нСявного ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°(blind return) основан Π½Π°Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ любая ΠΊΠΎΠΌΠ°Π½Π΄Π° ret, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Π²Ρ‹Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· стСка, Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ Π² рСгистр EIP Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· области, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСгистр ESP. БущСствСнно Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° ret Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ Π² рСгистр EIP Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠ°ΠΊ адрСс ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Если Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ смоТСт ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ сохранСнноС Π² стСкС содСрТимоС рСгистра EIP Π½Π° адрСс своСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚ΠΎ ΠΏΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ret Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.

Π’ рядС способов ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ рСгистры процСссора для указания Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π² стСкС. РСгистр EIP ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ нСдоступСн, поэтому нСльзя ΠΏΠΎΠ΄ΠΌΠ΅Π½Π΅Π½Π½Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ нСпосрСдствСнно Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² рСгистр EIP ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ это ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 8.20. Для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ указатСля Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π² рСгистр EIP ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, ΠΊΠ°ΠΊ это ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 8.21.

Рис. 8.20. Π’ рСгистр нСльзя Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

Рис. 8.21. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ

Π‘ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄. Если Ρ…Ρ€Π°Π½ΠΈΠΌΠΎΠ΅ Π½Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ являСтся адрСсом Π°Ρ‚Π°ΠΊΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π°, Ρ‚ΠΎ для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ способом скрытого ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° (pop return). Бпособ скрытого ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° позволяСт Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² рСгистр EIP Π½ΡƒΠΆΠ½Ρ‹ΠΉ адрСс ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ pop, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ret, ΠΊΠ°ΠΊ это ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° рис. 8.22. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄ pop Π²Ρ‹Ρ‚Π°Π»ΠΊΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ· стСка нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ адрСса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ загруТаСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ret Π² рСгистр EIP. Бпособ цСлСсообразно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли искомый адрСс находится Π½Π΅Π΄Π°Π»Π΅ΠΊΠΎ ΠΎΡ‚ Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка. Насколько извСстно, способ скрытого ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° использован Π² общСдоступной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ пСрСполнСния Π±ΡƒΡ„Π΅Ρ€Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ сСрвСра Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ IIS.

Рис. 8.22. ИспользованиС ΠΊΠΎΠΌΠ°Π½Π΄ pop ΠΈ ret для получСния адрСса ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°

– pop EAX 58

– pop EBX 5B

– pop ECX 59

– pop EDX 5A

– pop EBP 5D

– pop ESI 5E

– pop EDI 5F

– ret C3

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ содСрТимому рСгистра. Бпособ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΏΠΎ содСрТимому рСгистра (call register) примСняСтся, Ссли Π² рСгистрС содСрТится адрСс Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. Π’ этом случаС Π² рСгистр EIP загруТаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ call EDX, call EDI ΠΈΠ»ΠΈ ee эквивалСнта (Π² зависимости ΠΎΡ‚ рСгистра, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ).

– call EAX FF D0

– call EBX FF D3

– call ECX FF D1

– call EDX FF D2

– call ESI FF D6

– call EDI FF D7

– call ESP FF D4

ΠŸΡ€ΠΈ просмотрС памяти процСсса ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ KERNEL32. DLL Π±Ρ‹Π»ΠΈ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ подходящиС ΠΏΠ°Ρ€Ρ‹ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ²:

77F1A2F7 FF D0 call EAX

77F76231 FF D0 call EAX

7FFD29A7 FF D0 call EAX ; a whole block of this pattern exists

7FFD2DE3 FF E6 jmp ESI ; a whole block of this pattern exists

7FFD2E27 FF E0 jmp EAX ; a whole block of this pattern exists

77F3D793 FF D1 call ECX

77F7CEA7 FF D1 call ECX

77F94510 FF D1 call ECX

77F1B424 FF D3 call EBX

77F1B443 FF D3 call EBX

77F1B497 FF D3 call EBX

77F3D8F3 FF D3 call EBX

77F63D01 FF D3 call EBX

77F9B14F FF D4 call ESP

77F020B0 FF D6 call ESI

77F020D5 FF D6 call ESI

77F02102 FF D6 call ESI

77F27CAD FF D6 call ESI

77F27CC2 FF D6 call ESI

77F27CDB FF D6 call ESI

77F01089 FF D7 call EDI

77F01129 FF D7 call EDI

77F01135 FF D7 call EDI

Π­Ρ‚ΠΈ ΠΏΠ°Ρ€Ρ‹ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ практичСски Π² любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‹ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ² – Ρ‡Π°ΡΡ‚ΡŒ интСрфСйса ядра динамичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ DLL, Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΎΠ½ΠΈ находятся ΠΏΠΎ фиксированным адрСсам памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ТСстко Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π˜ΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… вСрсиях Windows ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, вСрсиях слуТСбных ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Service Pack ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ записанному Π² стСк адрСсу. Бпособ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΏΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ записанному Π² стСк адрСсу (push return) слСгка отличаСтся ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ, хотя ΠΈ Π² Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, сохранСнноС Π² рСгистрС. Π Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² использовании вмСсто ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ret ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ call. Если извСстно, Ρ‡Ρ‚ΠΎ адрСс ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π² рСгистр EAX, EBX, ECX, EDX, EBP, ESI ΠΈΠ»ΠΈ EDI, Π½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ call Π½Π°ΠΉΡ‚ΠΈ Π½Π΅ удаСтся, Ρ‚ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΠ°Ρ€Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄ push <рСгистр> ΠΈ ret.

– push EAX 50

– push EBX 53

– push ECX 51

– push EDX 52

– push EBP 55

– push ESI 56

– push EDI 57

– ret C3

Π’ динамичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Kernel32.DLL содСрТатся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ подходящиС ΠΏΠ°Ρ€Ρ‹ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ²:

77F3FD18 push EDI

77F3FD19 ret

(?)

77F8E3A8 push ESP

77F8E3A9 ret

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° поиска Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Findjmp. На рисункС 8.23 прСдставлСна нСбольшая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая сканируСт Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ динамичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ имя динамичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ рСгистра ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡ‰Π΅Ρ‚ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½Ρ‹Π΅ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… способов ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… Ρ†ΠΈΡ„Ρ€ Π² Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠΌ Π² памяти Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ динамичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Она ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ способы ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния ΠΏΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ записанному Π² стСк адрСсу (push return), ΠΏΠΎ содСрТимому рСгистра (call register) ΠΈ явный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΏΠΎ содСрТимому рСгистра (jump register).

Рис. 8.23. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Findjmp.c

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡ‰Π΅Ρ‚ Π² динамичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своих цСлях. Π’ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ для экспСримСнтов с ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ Π±ΡƒΡ„Π΅Ρ€Π° потрСбуСтся подходящСС мСсто для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ управлСния ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, адрСс ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ Π² ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ рСгистр. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° подскаТСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ мСсто Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² рСгистр EIP адрСса Π½ΡƒΠΆΠ½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π»Π΅Π³ΠΊΠΎ адаптируСтся для поиска Π΄Ρ€ΡƒΠ³ΠΈΡ… способов ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π·Ρ†ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π² динамичСски ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ DLL. Π’ настоящСС врСмя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ поиск ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄:

1) jmp reg;

2) call reg;

3) push reg / ret.

ВсСх ΠΈΡ… ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚: Π² рСгистр EIP загруТаСтся содСрТимоС рСгистра reg. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‚Π°ΠΊΠΆΠ΅ распознаСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ рСгистры:

β€’ EAX;

β€’ EBX;

β€’ ECX;

β€’ EDX;

β€’ ESI;

β€’ EDI;

β€’ ESP;

β€’ EBP.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся ΠΊΠ°ΠΊ консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° любой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ интСрфСйс 32-разрядных Windows-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ сайта ΠΈΠ·Π΄Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π° www.syngress.com/solutions, посвящСнном ΠΊΠ½ΠΈΠ³Π΅.

ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° usage() Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π² стандартноС устройство Π²Ρ‹Π²ΠΎΠ΄Π° (консоль ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ½Ρ‚Π΅Ρ€) ΠΊΡ€Π°Ρ‚ΠΊΡƒΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΏΠΎ использованию ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

void usage()

{

printf(β€œFindJmp usage\nfindjmp DLL reg\nEx: findjmp

KERNEL32.DLL ESP\n”);

exit (0);

}

/*The findjmp function is the workhorse. It loads the

requested dll, and searches for specific patterns for jmp

reg, push reg ret, and call reg.*/

void findjmp(char *dll,char *reg)

{

/* patterns for jmp ops */

BYTE jmppat[8][2]= {{0xFF,0xE0},{0xFF,0xE3},{0xFF,0xE1},

{0xFF,0xE2},{0xFF,0xE6},{0xFF,0xE7},

{0xFF,0xE4},{0xFF,0xE5}};

/* patterns for call ops */

BYTE callpat[8][2]= {{0xFF,0xD0},{0xFF,0xD3},{0xFF,0xD1},

{0xFF,0xD2},{0xFF,0xD6},{0xFF,0xD7},

{0xFF,0xD4},{0xFF,0xD5}};

/* patterns for pushret ops */

BYTE pushretpat[8][2]= {{0x50,0xC3},{0x53,0xC3},{0x51,0xC3},

{0x52,0xC3},{0x56,0xC3},{0x57,0xC3},

{0x54,0xC3},{0x55,0xC3}};

/*base pointer for the loaded DLL*/

HMODULE loadedDLL;

/*current position within the DLL */

BYTE *curpos;

/* decimal representation of passed register */

DWORD regnum=GetRegNum(reg);

/*accumulator for addresses*/

DWORD numaddr=0;

/*check if register is useable*/

if(regnum == -1)

{

/*it didn’t load, time to bail*/

printf(β€œThere was a problem understanding the

register.\n”\

β€œPlease check that it is a correct IA32 register

name\n”\

β€œCurrently supported are:\n ”\

β€œEAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP\n”\

);

exit(-1);

}

loadedDLL=LoadLibraryA(dll);

/* check if DLL loaded correctly*/

if(loadedDLL == NULL)

{

/*it didn’t load, time to bail*/

printf(β€œThere was a problem Loading the requested

DLL.\n”\

β€œPlease check that it is in your path and readable\n” );

exit(-1);

}

else

{

/*we loaded the dll correctly, time to scan it*/

printf(β€œScanning %s for code useable with the %s

register\n”,

dll,reg);

/*set curpos at start of DLL*/

curpos=(BYTE*)loadedDLL;