CyberDen
19.07.2024, 17:28
Друзья всех приветствую! Продолжаем "пывнить" Кто не прочитал первую статью - она есть ТУТ!
Часть 4 (https://forum.antichat.xyz/threads/1643746/)
Часть 3 (https://forum.antichat.xyz/threads/1643731/)
Часть 1 (https://forum.antichat.xyz/threads/1643686/)
Перед началом оставлю пару полезных ресурсов:
Теория - Статьи на тему, что такое и с чем едят Buffer Overflow (https://forum.antichat.xyz/threads/1641110/)
Практика - Крутые таски на тему PWN от Antichat
В этой статье будем решать таск Stack1 (скачать EXEшник можно ТУТ).
Stack1
Начинаем со статического анализа, открываем stack1.exe в GHIDRA:
https://forum.antichat.xyz/attachments/29112997/1.png
Анализируем наш бинарный файл:
https://forum.antichat.xyz/attachments/29112997/2.png
https://forum.antichat.xyz/attachments/29112997/3.png
Получаем декомпилированный код:
https://forum.antichat.xyz/attachments/29112997/4.png
Сразу же обращаем внимание на использование небезопасной функции strcpy(), которая копирует наш переданный аргумент в 64-байтный массив (local_54). В прошлый раз мы перезаписывали переменную, а в этот раз нам нужно присвоить ей конкретное значение, а именно 0x61626364. Перезаписав переменную, наше условие сработает, и мы увидим строчку "you have correctly...".
Переходим к "динамике"! Открываем x64dbg, открываем stack1.exe и нажимаем "Изменить аргументы командной строки":
https://forum.antichat.xyz/attachments/29112997/5.png
Но что-же писать в качестве аргумента? Вспоминаем, что массив у нас на 64 байта, поэтому заполним его символами "A". Далее нам нужно дозаписать 0x61626364. Открываем ASCII-таблицу, чтобы узнать, что это за символы:
https://forum.antichat.xyz/attachments/29112997/6.png
Отлично! С учетом порядка байтов наш аргумент будет выглядеть следующим образом:
https://forum.antichat.xyz/attachments/29112997/7.png
Нажимаем "OK", ставим "бряк" на инструкции сравнения "cmp EAX,61626364":
https://forum.antichat.xyz/attachments/29112997/8.png
Запускаем! Заполняем массив символами "A" и успешно записываем в EAX - 61626364 (это наши символы "dcba"):
https://forum.antichat.xyz/attachments/29112997/9.png
Инструкция CMP "успешно" сравнивает значение в регистре EAX с значением 61626364, и мы получаем заветное сообщение в терминале (З.Ы. CMP фактически выполняет операцию вычитания между двумя операндами для проверки равенства или неравенства этих операндов):
https://forum.antichat.xyz/attachments/29112997/10.png
Всем спасибо за внимание! З.Ы. Ставьте лайк, если понравился райтап! Так я буду знать, что тема многим полезна, чтобы продолжать серию статей на эту тему!
Часть 4 (https://forum.antichat.xyz/threads/1643746/)
Часть 3 (https://forum.antichat.xyz/threads/1643731/)
Часть 1 (https://forum.antichat.xyz/threads/1643686/)
Перед началом оставлю пару полезных ресурсов:
Теория - Статьи на тему, что такое и с чем едят Buffer Overflow (https://forum.antichat.xyz/threads/1641110/)
Практика - Крутые таски на тему PWN от Antichat
В этой статье будем решать таск Stack1 (скачать EXEшник можно ТУТ).
Stack1
Начинаем со статического анализа, открываем stack1.exe в GHIDRA:
https://forum.antichat.xyz/attachments/29112997/1.png
Анализируем наш бинарный файл:
https://forum.antichat.xyz/attachments/29112997/2.png
https://forum.antichat.xyz/attachments/29112997/3.png
Получаем декомпилированный код:
https://forum.antichat.xyz/attachments/29112997/4.png
Сразу же обращаем внимание на использование небезопасной функции strcpy(), которая копирует наш переданный аргумент в 64-байтный массив (local_54). В прошлый раз мы перезаписывали переменную, а в этот раз нам нужно присвоить ей конкретное значение, а именно 0x61626364. Перезаписав переменную, наше условие сработает, и мы увидим строчку "you have correctly...".
Переходим к "динамике"! Открываем x64dbg, открываем stack1.exe и нажимаем "Изменить аргументы командной строки":
https://forum.antichat.xyz/attachments/29112997/5.png
Но что-же писать в качестве аргумента? Вспоминаем, что массив у нас на 64 байта, поэтому заполним его символами "A". Далее нам нужно дозаписать 0x61626364. Открываем ASCII-таблицу, чтобы узнать, что это за символы:
https://forum.antichat.xyz/attachments/29112997/6.png
Отлично! С учетом порядка байтов наш аргумент будет выглядеть следующим образом:
https://forum.antichat.xyz/attachments/29112997/7.png
Нажимаем "OK", ставим "бряк" на инструкции сравнения "cmp EAX,61626364":
https://forum.antichat.xyz/attachments/29112997/8.png
Запускаем! Заполняем массив символами "A" и успешно записываем в EAX - 61626364 (это наши символы "dcba"):
https://forum.antichat.xyz/attachments/29112997/9.png
Инструкция CMP "успешно" сравнивает значение в регистре EAX с значением 61626364, и мы получаем заветное сообщение в терминале (З.Ы. CMP фактически выполняет операцию вычитания между двумя операндами для проверки равенства или неравенства этих операндов):
https://forum.antichat.xyz/attachments/29112997/10.png
Всем спасибо за внимание! З.Ы. Ставьте лайк, если понравился райтап! Так я буду знать, что тема многим полезна, чтобы продолжать серию статей на эту тему!