Привет, эксплуататоры, добро пожаловать на мой канал. Сегодня я собираюсь решить задачу CTF, которая включает в себя: эксплуатацию, реверсирование, asm и pwntool.

Я настоятельно рекомендую сообществу информационной безопасности обратить внимание на эту проблему.

Чтобы решить эту задачу, нам нужно рассмотреть несколько вещей, которые я хочу показать вам при написании этого блога.

Мы должны проанализировать файл, прежде чем эксплуатировать и реверсировать файл.

Приступим к эксплуатации уязвимости.

Анализ файла

Вы всегда должны учитывать, что когда файл был предоставлен вам для анализа файла с помощью некоторых команд:

  1. Команда файл

Команда файла Linux помогает определить тип файла и его данные. Команда не учитывает расширение файла, а вместо этого запускает серию тестов для определения типа данных файла.

Как видите, этот файл имеет 64-битные данные. Мы должны вести себя в 64-битном формате. Я уже использовал команду sudo chmod +x.

2. Команда строки

Удивительно !/bin/bash дается, и это позволяет нам получить оболочку из системы.

Команда strings в Linux вернет каждый строковый тип символов, которые можно распечатать в файле.

Что мы делаем статически, так это определяем, какие строки, биты или что-то еще даются нам.

Перед анализом файла рекомендуется использовать статические инструменты или команды, чтобы определить ваши действия по его использованию.

Из этого файла мы поняли, что мы можем использовать технику эксплуатации для получения root-прав. Но нам нужно учитывать, какая уязвимость затрагивается.

3. Команда checksec

Я не буду слишком углубляться в эти меры безопасности, но хочу рассказать о некоторых из них. Вы можете проверить этот блог, если хотите узнать больше об этом: https://medium.com/@slimm609/checksec-d4131dff0fca

ПИРОГ

Файлы Executable Linkable Format (ELF) имеют фиксированное базовое адресное пространство и должны быть загружены в это адресное пространство во время выполнения. Динамические исполняемые файлы обычно зависят от позиции и требуют фиксированного адресного пространства в памяти.

Без выполнения (NX)

No-Execute — это технология, используемая в процессорах для разделения области памяти на 2 части: хранилище кода и хранилище данных. Это разделяет то, что должно быть выполнено как программный код, и то, что должно быть прочитано как данные программы.

Куча

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

Как вы можете видеть выше, нам не нужно беспокоиться об этих мерах безопасности.

Я собираюсь попытаться использовать этот файл с помощью буферизации с помощью «А».

Потрясающий! Мы видим, что появилась ошибка сегментации. Мы должны рассмотреть дизассемблированный код с помощью Cutter.

Во-первых, scanf() считается опасной функцией в языке C, но почему?

Основная причина заключается в том, что scanf() и любая функция, выполняющая запись в память независимо от распределения и размера, потенциально может выполнять запись в память, зарезервированную для чего-то еще — такое поведение также известно как «переполнение буфера».

Наиболее опасно переполнение буфера, когда scanf() записывает в память стека, который, помимо прочего, содержит адреса возврата (адрес в коде, на который переходит процедура, когда заканчивает свою работу). Если обратный адрес изменится на желаемый, скажем, злоумышленником, он потенциально может заставить процесс выполнять то, что он намеревался (это называется эксплуатацией), и в конечном итоге взломать систему всеми возможными способами.

Мы знаем, что функция scanf() занимает 0x20 байт (32 в десятичном формате), поэтому мы воспользуемся отладчиком GDB для более глубокого исследования.

Позвольте мне также отметить, что это не считается уязвимостью неконтролируемой строки формата, потому что:

формат задается как «%s», параметр задается в виде строки для стандартного вывода. Нас беспокоит переполнение буфера из-за переполнения стека и манипулирования адресом возврата.

GDB-PEDA

Мы уже знали, что 0x20 байт были сохранены в RSP (указатель стека). Я решил создать шаблон, который включает 100 символов, потому что мы должны знать смещение, чтобы манипулировать обратным адресом.

Вы можете использовать «информационные функции», чтобы просмотреть функции внутри файла. Наша цель: vuln()

Теперь я собираюсь запустить этот файл со 100 символами.

Мы только что вычислили смещение «RSP». Мы должны были уже знать, что RSP было дано 0x20 -> 32 байта.

Потрясающий! Мы собираемся попробовать что-то, что мы можем убедиться, что это работает 32 байта + 8 байтов, давайте попробуем.

Обратите внимание → Регистр %rbp имеет особое назначение: он указывает на нижнюю часть фрейма стека текущей функции, и доступ к локальным переменным часто осуществляется относительно его значения. Однако при включенной оптимизации компилятор может определить, что все локальные переменные можно хранить в регистрах.

Мы работаем с 64-битной версией, она может отличаться от 32-битной.

Потрясающий! нам просто нужно найти адрес памяти vuln()

Потрясающий! он начинается с адреса 0x400686 памяти. Теперь мы можем манипулировать с помощью техники бинарной эксплуатации.

PWN-ИНСТРУМЕНТЫ

Мы знаем все об этом файле. Мы знаем смещение и адрес памяти vuln и добавляем 8 байт для управления обратным адресом.

Я сначала попробовал обмануть файл локально.

  1. Мы знаем, что 0x20 байт хранились в RBP
  2. Мы также рассчитали смещение, которое составило (40) за вычетом (offset-RBP)
  3. На третьем шаге я создал упомянутую полезную нагрузку

результат:

Локально получилось, теперь попробую удаленно.

Я пытался сканировать с помощью инструментов NMAP для анализа порта, и результат:

порт 5700 для нас позволяет обмануть систему.

Потрясающий! Я собираюсь использовать оболочку, чтобы сделать ее стабильной.

Было легко использовать /bin/bash для получения оболочки.

Теперь мы можем прочитать файл flag.txt.

Краткое содержание

Прежде всего, я настоятельно рекомендую его людям, которые хотят учиться и изучать бинарную эксплуатацию и реверс-инжиниринг. Это стоило того, чтобы потратить свое время, чтобы решить и написать такой блог для энтузиастов. Если вы не поняли эту задачу, пожалуйста, задавайте мне вопросы, чтобы вместе разобраться в ваших проблемах!

Я буду писать больше блогов на эту тему.

Уровень будет легким, средним и сложным. Так что оставайтесь с нами, люди!

Вы можете подписаться на меня в социальных сетях:

LinkedIn: https://www.linkedin.com/in/ahmetgoker/

Инстаграм: https://instagram.com/0xcd4_

Твиттер: https://twitter.com/TurkishHoodie_

Гитхаб: https://github.com/0xCD4

Спасибо, что потратили свое драгоценное время на чтение этого блога!

~ 0xcd4