Погляд на використання вразливостей

Оскільки я з нетерпінням чекав продовження обговорення цієї теми, дозвольте мені розповісти вам трохи історії, теорії та практики щодо уразливостей. На сьогодні всі ми чули, що недоліки безпеки можуть коштувати дорого, ми всі знаємо, що ми повинні постійно оновлювати наше програмне забезпечення, всі ми знаємо, що багато оновлень спричинені помилками безпеки. Але сьогодні я розповім вам трохи про те, як ці помилки знаходять і використовують 🙂 Але перед цим ми збираємося пояснити кілька деталей, щоб мати кращий огляд.

Перед початком

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

Це не буде реальним світовим сценарієм

Я не можу дозволити собі навчити їх ламати будь-яку програму, яку вони бачать 🙂 по-перше, тому що це небезпечно для їхніх комп’ютерів, по-друге, тому що це займе більше, ніж моя звичайна квота слів.

Ми вирушаємо у подорож до 80-х

Те, що я збираюся показати вам, що я можу робити на своєму ноутбуці, але це не означає, що сьогодні це можна зробити простим способом 🙂 багато з цих концепцій вже використовувались стільки разів, що з’явились нові методи захисту та нові методи їх уникнення 😛 але це повертає нас туди ж, немає місця, щоб все це сказати 🙂

Це може не працювати на вашому процесорі

Хоча я збираюся використати дуже простий приклад, я хочу, щоб з самого початку було цілком зрозуміло, що деталі цього настільки різноманітні і такі різноманітні, що так само, як це може вийти таким же, як і я, якщо ви хочете спробувати , бажаний ефект може також не бути досягнутий. Але ви можете собі уявити, що я не можу пояснити, що в цьому просторі, тим більше, що з цим вступом я вже взяв більше 300 слів, тож ми переходимо прямо до нашої думки.

Що таке a Переповнення буфера

Щоб відповісти на це, ми спочатку повинні зрозуміти першу половину цієї комбінації.

Буфери

Оскільки все стосується пам’яті в комп’ютері, логічно, що повинен бути певний тип інформаційного контейнера. Коли ми говоримо про витрати виходи, ми підходимо безпосередньо до концепції буфери. Щоб це було коротко, a буфера Це простір пам'яті визначеного розміру, в якому ми збираємось зберігати кількість інформації, просту 🙂

Як випливає з назви, переповнення відбувається, коли буфер заповнює більше інформації, ніж може обробити. Але чому це важливо?

Стек

Також відомі як стеки, вони є абстрактним типом даних, в якому ми можемо стек інформації, їх основною характеристикою є те, що вони мають впорядкування LIFO (останній у першому виході). Давайте на секунду подумаємо про стопку тарілок, ми кладемо їх зверху по черзі, а потім виймаємо по черзі зверху, це робить останню тарілку, яку ми поклали (ту, яка знаходиться вгорі ) - це перша платівка. Що ми збираємося дістати, очевидно, якщо ми можемо дістати лише одну тарілку за раз, і ми вирішили зробити це в такому порядку: P.

Тепер, коли ви знаєте ці два поняття, ми маємо їх упорядкувати. Стеки важливі, оскільки кожна програма, яку ми запускаємо, має свою стек виконання. Але цей стек має a особлива характеристикаросте вниз. Єдине, що вам слід про це знати, це те, що під час запуску програми, коли викликається функція, стек переходить із числа X у пам'яті до числа (Xn). Але для того, щоб продовжувати, ми повинні зрозуміти ще одне поняття.

Покажчики

Це концепція, яка зводить з розуму багатьох програмістів, коли вони починають працювати у світі C, насправді велика сила програмування на C частково зумовлена ​​використанням покажчиків. Для спрощення - вказівник вказує на адресу пам'яті. Це звучить складно, але це не так складно, у всіх нас є оперативна пам’ять, чи не так? Ну, це можна визначити як послідовне розташування блоків, ці місця зазвичай виражаються в шістнадцяткових числах (від 0 до 9, а потім від А до F, наприклад 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). Тут як курйозна нотатка, 0x10 НЕМАЄ дорівнює 10 😛, якщо ми перетворимо його в десятковий порядок, це буде те саме, що сказати 15. Це те, що спочатку також бентежить більше, ніж одне, але давайте приступимо до цього.

Записи

Процесори працюють з низкою registros, які працюють над передачею розташувань з фізичної пам’яті в процесор, для архітектур, що використовують 64-біт, кількість регістрів велика і тут важко описати, але, щоб зрозуміти, регістри схожі на покажчики, серед іншого вони вказують , простір пам'яті (розташування).

Тепер практикуйся

Я знаю, що досі було оброблено багато інформації, але насправді це дещо складні проблеми, які я намагаюся пояснити дуже простим способом. Ми побачимо невеличку програму, яка використовує буфери, і ми збираємося розбийся, щоб зрозуміти це про переливи, очевидно, що це не Це справжня програма, і ми збираємось "ухилитися" від багатьох контрзаходів, які використовуються сьогодні, лише для того, щоб показати, як все робилося раніше 🙂 і тому, що деякі з них принципи необхідні, щоб мати можливість пізнавати більш складні речі 😉

GDB

Чудова програма, яка, безсумнівно, є однією з найбільш використовуваних програмістами C. Серед її численних достоїнств ми маємо той факт, що вона дозволяє нам бачити все це, про що ми говорили до цього часу, регістри, стек, буфери тощо 🙂 Давайте подивимось програму, яку ми будемо використовувати для нашого прикладу.

retinput.c

Власний. Крістофер Діас Ріверос

Це досить проста програма, ми збираємось користуватися бібліотекою stdio.h мати можливість отримувати інформацію та відображати її в терміналі. Ми можемо побачити функцію, яка називається return_input що породжує a буфера званий масив, яка має довжину 30 bytes (тип даних char становить 1 байт).

Функція gets(array); запитувати інформацію за допомогою консолі та функції printf() повертає вміст масиву і відображає його на екрані.

Кожна програма, написана на мові C, починається з функції main(), це буде відповідати лише за виклик return_input, тепер ми збираємося скомпілювати програму.

Власний. Крістофер Діас Ріверос

Візьмемо трохи того, що я щойно зробив. Варіант -ggdb говорить gcc скомпілювати програму з інформацією для gdb, щоб мати змогу правильно налагоджувати. -fno-stack-protector Це варіант, який, очевидно, ми не повинні використовувати, але який ми будемо використовувати, оскільки в іншому випадку можна було б генерувати переповнення буфера в стеку. Врешті-решт я перевірив результат. ./a.out він просто запускає те, що я щойно скомпілював, запитує інформацію та повертає її. Біг 🙂

Попередження

Ще одна примітка тут. Ви бачите попередження? очевидно, це щось враховувати, коли ми працюємо з кодом або компілюємо, це трохи очевидно, і є мало програм, які сьогодні мають функцію gets() У коді. Однією з переваг Gentoo є те, що, складаючи кожну програму, я бачу, що може бути неправильним, у «ідеальній» програмі їх не повинно бути, але ви були б здивовані, скільки великих програм мають ці попередження, оскільки вони просто ДУЖЕ великі, і важко їх відстежувати. небезпечні функції, коли одночасно є багато попереджень. Тепер, якщо ми продовжимо

Налагодження програми

Власний. Крістофер Діас Ріверос

Зараз ця частина може трохи заплутати, але оскільки я вже написав достатньо, я не можу дозволити собі все пояснити, так що вибачте, якщо ви бачите, що я йду занадто швидко 🙂

Зняття з охорони коду

Почнемо з розгляду нашої складеної програми машинної мови.

Власний. Крістофер Діас Ріверос

Це код нашої основної функції в збірка, це те, що розуміє наш процесор, рядок зліва - це фізична адреса в пам'яті, <+ n> відомий як зсув, в основному відстань від початку функції (main) до цього твердження (відомого як опкод). Потім ми бачимо тип інструкції (push / mov / callq…) та один або кілька регістрів. Узагальнено можна сказати, що це вказівка, за якою слідують джерело / походження та пункт призначення. <return_input> відноситься до нашої другої функції, давайте подивимось.

return_input

Власний. Крістофер Діас Ріверос

Це трохи складніше, але я просто хочу, щоб ви перевірили кілька речей, є тег, який називається <gets@plt> і останній код операції, який називається retq вказуючи на закінчення функції. Ми збираємося поставити пару точок зупинку, одну у функції gets а інший у retq.

Власний. Крістофер Діас Ріверос

прогін

Зараз ми запустимо програму, щоб побачити, як починається дія.

Власний. Крістофер Діас Ріверос

Ми бачимо, що з’являється маленька стрілка, яка вказує код операції, де ми знаходимось, я хочу, щоб вони враховували напрямок 0x000055555555469b, це адреса після дзвінка на return_input у функції main , це важливо, оскільки саме тут програма повинна повернутися, коли ви закінчите отримувати файл вхід, давайте перейдемо до функції. Тепер ми перевіримо пам’ять перед входом у функцію gets.

Власний. Крістофер Діас Ріверос

Я повернув для вас основну функцію і виділив код, на який я посилався, як бачите, завдяки ендіаційність було розділено на два сегменти, я хочу, щоб ви взяли до уваги напрямок 0x7fffffffdbf0 (перший зліва після командоса x/20x $rsp) оскільки це місце, яке ми повинні використовувати для перевірки результатів get, продовжимо:

Порушення програми

Власний. Крістофер Діас Ріверос

Я виділив їх 0x44444444тому що вони представляють наші D 🙂, тепер ми почали додавати вхід до програми, і, як ви бачите, ми знаходимося лише в двох рядках від бажаної адреси, ми будемо заповнювати її до тих пір, поки не опинимося перед адресами, які ми виділили на попередньому кроці.

Зміна зворотного шляху

Тепер, коли нам вдалося ввести цей розділ коду, де він вказує на повернення функції, давайте подивимося, що трапиться, якщо ми змінимо адресу 🙂 замість того, щоб перейти до розташування коду операції, що слідує за тим, який ми мали мить тому, що ви думаєте якщо ми повернемося до return_input? Але для цього потрібно записати адресу, яку ми хочемо, в двійковій системі, ми будемо робити це за допомогою функції printf від баш 🙂

Власний. Крістофер Діас Ріверос

Зараз ми отримали інформацію двічі 😀, звичайно, програма не була створена для цього, але нам вдалося зламати код і змусити його повторити те, чого не слід було робити.

Роздуми

Цю просту зміну можна вважати a експлуатувати дуже елементарно 🙂 йому вдалося зламати програму і зробити те, що ми хочемо від нього.

Це лише перший крок у майже нескінченному списку речей, які потрібно побачити та додати, є способи додати більше речей, ніж просто повторити замовлення, але цього разу я написав багато і все, що стосується кодування оболонки це предмет, який слід писати більше, ніж статті, я б сказав, цілі книги. Вибачте, якщо я не зміг трохи глибше заглибитися в теми, які б мені сподобалися, але, безумовно, буде шанс 🙂 Вітаю та дякую, що потрапили сюди.


Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   2p2 - сказав він

    Будьте більш безпосередніми. Менше пишіть і зосереджуйтесь на тому, що важливо

    1.    ChrisADR - сказав він

      Привіт, дякую за коментар.

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

      привіт

      1.    Анонімний - сказав він

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

        Я гадаю, ти не можеш достукатися до кожного, ти маєш вибрати, і в цьому випадку ти згрішив, хотівши багато охопити.

        До речі, я кажу вам як конструктивну критику, я люблю ці теми і хотів би, щоб ви продовжували писати статті, вітаю!

    2.    Анонімний - сказав він

      Я думаю те ж саме.

      1.    ChrisADR - сказав він

        Велике спасибі обом !! Безумовно, важко зрозуміти, як охопити цільову аудиторію, коли правда полягає в тому, що кількість людей з просунутим рівнем програмування, які читають ці статті, невелика (принаймні, це можна зробити на основі коментарів)

        Я, безперечно, згрішив від бажання спростити те, що вимагає розуміння широкої бази знань. Сподіваюся, ви розумієте, що, оскільки я лише починаю займатися блогінгами, я ще не виявив точного моменту, коли мої читачі знають і розуміють, що я кажу. Це набагато полегшило б говорити правду 🙂

        Я постараюся бути коротшим, коли це заслуговує, без знеособлення формату, оскільки відокремлення способу написання від вмісту дещо складніше, ніж можна собі уявити, я, принаймні, цілком пов’язаний з ними, але я гадаю, що врешті-решт я зможу додати рядки, а не вирізати вміст.

        привіт

  2.   Маріо - сказав він

    Де ви могли б дізнатись більше про цю тему? Будь-яка рекомендована книга?

    1.    ChrisADR - сказав він

      Приклад взяли з Довідника Shellcoder Кріс Енлі, Джон Хісман, Фелікс Ліндер та Херардо Річарте, але для того, щоб зробити 64-розрядний переклад, мені довелося дізнатись про мою архітектуру, посібник розробника Intel, томи 2 і 3 - це досить надійне джерело для цього. Також добре прочитати документацію GDB, яка постачається з командою 'info gdb'. Для вивчення Assembly та C існує багато дуже хороших книг, за винятком того, що книги збірки трохи старі, тому є прогалина для заповнення іншим типом документація.

      Сам по собі шелл-код з різних причин на сьогодні вже не такий ефективний, але все одно цікаво вивчати нові техніки.

      Сподіваюся, це трохи допоможе 🙂 Вітаю

  3.   Franz - сказав він

    Гарна стаття, старий блог desdelinux відродилась =)
    Коли ви говорите, що віддалена оболонка не така ефективна, ви маєте на увазі контрзаходи, призначені для пом'якшення атак, вони називають це наступальною безпекою.
    Привіт і так продовжуйте

    1.    ChrisADR - сказав він

      Щиро дякую, Франц, дуже добрі слова, насправді я мав на увазі, що Shellcoding сьогодні набагато складніше, ніж те, що ми бачимо тут. У нас є ASLR (генератор випадкових пам’яті) захисника стека, різні заходи та контрзаходи, які обмежують кількість кодів операційних кодів, які можна вводити в програму, і це лише початок.

      З повагою,

  4.   Вільне програмне забезпечення - сказав він

    Привіт, ти зробиш ще одну частину, розширюючи тему? Це цікаво

    1.    ChrisADR - сказав він

      Привіт, звичайно, тема досить цікава, але рівень складності, який ми б взяли, став би дуже високим, мабуть, залучаючи велику кількість постів, щоб пояснити різні передумови для розуміння іншого. Я, напевно, напишу про це, але це не будуть наступні дописи, я хочу написати кілька тем, перш ніж продовжувати цю.

      Вітаю та дякую за поділ

  5.   кактус - сказав він

    Дуже хороший че! Ви робите чудові публікації! Одне питання: я починаю цю ІТ-безпеку, читаючи книгу "Забезпечення безпеки тестуванням пера". Чи рекомендується ця книга? Як ви пропонуєте мені почати запитувати ці питання?

    1.    ChrisADR - сказав він

      Привіт, кактусе, це цілий всесвіт про вразливості, а інші, чесно кажучи, багато в чому залежить від того, що привертає вашу увагу, та потреб, які у вас є, ІТ-менеджеру не потрібно знати те саме, що і тестер пера, Або дослідник вразливості, або судовий аналітик, група з ліквідації наслідків катастрофи має зовсім інший набір навичок. Очевидно, що кожен з них вимагає різного рівня технічних знань, я рекомендую вам почати виявляти саме те, що вам подобається, і починати поглинати книги, статті та інші, а головне, практикувати все, що ви читаєте, навіть якщо воно застаріло , що в кінцевому рахунку змінить ситуацію.
      З повагою,

  6.   Айцен - сказав він

    Здравствуйте.
    Щиро дякуємо за пояснення цієї теми, а також зауваження, що для отримання додаткової інформації ми маємо "Довідник Shellcoder". Я вже маю прочитати reading