Переповнення стека. Частина 1, Windows 9x/NT, Security & Hack, статті

Underground InformatioN Center

1. Введення

Проблема переповнення локальних буферів виникла в софті з моменту появи
структурного програмування, тобто дроблення коду модуля на процедури і
полягає у передачі в деякий локальний буфер блоку даних, що перевищує
розміри цього буфера. Схематично це виглядає так:

Таким чином зайві дані записуються, ось в цьому то і вся фішка,
записуються вони в ту частину стека, яка призначена для забезпечення
коректного повернення з процедури. Таким чином переповнення призводить до
перезапису деяких регістрів процесора, а конкретно регістра EIP (командний
покажчик) і регістра EBP (база для стекових операцій). До чого це приводить – судіть
самі:

В даному випадку в EIP потрапив код 0х41 що відповідає ASCII коду літери
‘A’-це означає що додаток спробувало заповнити локальний буфер рядком
складається з літер А, а оскільки довжина рядка перевищила розмір буфера то й
сталося переповнення. Даний приклад показує, що переповнення змінило
звичайний процес виконання програми і призвело до переходу за адресою, яку
завдяки переповнення потрапив в командний покажчик. Тепер, власне, можна
перейти до опису експлойтів.

2. Експлоїти

Exploit (анг.-використовувати у своїх цілях) – Таким чином названа рядок коду,
викликає описане вище переповнення локального буфера. Але експлоїт – це не
просто тупий набір символів призводить до завершення програми (це звичайний
DoS-Denial Of Service), а інтелектуальна рядок-інакше кажучи програма.
Це означає що замість символів вона містить опкоди (машинні інструкції),
виконувані процесором і тому після переповнення процесор перейде по
адресою який буде вказувати на ці інструкції і виконає їх. Основна
трудність полягає у визначенні цієї адреси з метою подальшої його
передачі в командний покажчик. Розглянемо наступну схему:

При переповненні buffer’а, як видно з малюнка, будуть затерті сохран.значеніе EBP
і адреса повернення. Запустивши SoftIce легко визначити положення того байта в
рядку переданої в буфер який затрет собою перший байт адреси повернення.
Далі починаючи з визначеної вище позиції поміщаємо 4-байтовий покажчик на наш
код. При виході з процедури команда ret виштовхне цей покажчик в EIP і
виконання програми продовжиться з нашого адреси. Ця адреса знову ж таки можна
визначити за допомогою SoftIce. Але є й інший спосіб-після повернення з
процедури регістр ESP буде вказувати на область в якій розташовується наш
код-потомму набагато ефективніше передати в EIP адреса інструкції call esp
яка може розташовуватися в будь длл, подгружаемих програмою-залишається лише
з’ясувати цю адресу-для цього з’ясовується список імпорту, береться Hiew і в
вибраної длл шукається Інструкції call esp, потім знайдене зсув складається
з ImageBase і в результаті виходить абсолютний віртуальний адреса необхідної
інструкції, який і передається в EIP.
Вбиваємо в Сайс (SoftIce): s 10000000 L ffffffff ff e4
тобто шукати ff e4 (jmp esp) з 10000000 по ffffffff
І результат: Pattern found at 0010:77 e8898B, що відповідає kernel32.dll.
Цей метод зручніше, тому як Сайс шукає прямо в пам’яті підривається проги –
якщо природно вона в Сайс завантажена і трасується в даний момент.

3. Мета створення експлоїта

Необхідно зазначити що всі експлоїти діляться на дві групи – локальні та
видалені. Дистанційні використовуються в основному в локальних і глобальних мережах для
отримання доступу до віддаленій машині. Для створення та впровадження віддалених
експлойтів потрібно досить серйозна підготовка-тому ми будемо
розглядати локальні експлоїти, мають на меті атаку локальної машини. До
Наприклад ви маєте доступ до машини з ОС WinNT WKS або Win2000Pro і злий адмін
заборонив вам вихід в інет. “Так як його провчити?” – Відповідь проста – створіть локальний
експлоїт. “І що це мені дасть?” – Запитаєте ви – та майже всі! Простий приклад розставити
крапки над i.
Всі працювали з RAS, але мало хто знає, що він схильний переповнення буферу в дуже
банальному місці. Якщо передати занадто довгий номер телефону ISP то rasman.exe
вилетить. Дуже важлива наступна особливість – наприклад, якщо ви запустите
мейлер і спробуєте відправити пошту, то вінда запропонує вам під’єднатися до інтернету.
Перед цим потрібно замінити файл телефонної книги rasphone.pbk на однойменний файл,
містить замість телефону провайдера, експлоїт. Для зміни цього файлу не потрібні
спеціальні дозволи якщо звичайно адмін їх не створив. Але зазвичай з цим все в
порядку. Так як rasman запуститься в системному контексті (тобто з привілеями
системи – для нього буде створений такий дескриптор LSA), то запущена в результаті
переповнення консоль буде мати права аналогічними правам адміна, ну а
тепер вже роби, чого душа забажає і знання дозволяють. Замість Мейлера можна
запустити браузер і запросити який-небудь URL, якого немає в кеші – Iexplorer
запропонує підключиться і ось-тут то і запуститься rasman.exe. Вообщем поле для
діяльності широке.

4.Як визначити чого підривати

Як завжди є перевірений роками метод тику – перевіряйте на вразливість всі модулі,
парсірующіе рядка-від рядка адреси у вашому браузері або NetMeeting’e до
rundll32 – якщо зможете.
Можна використовувати SoftIce, але це справа для підготовлених людей. Найбільш простий
спосіб – шукати інформацію в інтрнет на різних форумах і сайтах, присвячених експлоїтом –
шукайте і знайдете – і потім просто вдосконалити написане – це найкращий спосіб
навчання. Тут же можна смесло сказати, що bugTraq (www.securityfocus.com) є
найбільшим архівом в світі за експлойтів.

5.Чего краще на (ш) Кодіть?

ІМХО: найкращим продовженням підривається проги (для тих хто в танку – для програми,
вразливою для stackoverflow) є запуск консолі. Це легко зробити запустивши
командну оболонку типу cmd.exe – в Unix-системах це називається shell. А реалізувати
виклик cmd.exe можна за допомогою виклику функції system (), що експортується з msvcrt.dll.
Якщо програма використовує дану dll’ку, то вам пофартіло, а якщо ні, то доведеться використовувати
LoadLibrary () в парі з GetProcAddress (). Причиною такої ради є те, що знає
людина з допомогою шелла, запущеного в контексті system (для NT та інших) або root (Unix і подібні)
може гори звернути, наприклад створить нового користувача з правами Адміна просто вставивши
його до групи “Адміністратори” (NT) і потім увійшовши знову цим юзером видалить старий акаунт адміністратора
(Це якщо потрібно адміна провчити), або включить групу простих юзерів в групу “Адміністратори” –
таким чином кожен новий юзер буде входити в контексті адміністратора і адміністратор не відразу
зрозуміє. Хотів би зауважити, що це поширюється тільки для локальних профілів користувачів –
глобальні профілі зберігаються на первинному контролері домену та змінивши адміністратора на
localhost’e ви не зачепите групу “Адміністратори” домену.

6.Структурная схема побудови експлоїта

Опкоди (скор: Operation Code (Коди Операции) або за іншим розшифровується як Оптимізовані коди) – це машинні інструкції в цифровому
поданні. Наприклад в асемблері використовуються мнемокода типу:
mov eax,ebx
push eax
ret
Опкоди для наведених вище АСМ-інструкцій мають вигляд:
mov eax,ebx >> 66 8B C3
push eax >> 66 50
ret >> C3
для отримання посвідки опкодов для будь-яких мнемонік можна використовувати будь-асемблер.
Я особисто користуюся асемблером, вбудованим в Hiew.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*