Друзья всех приветствую! Продолжаем «пывнить» :) Кто не прочитал первую статью — она есть ТУТ!
Перед началом оставлю пару полезных ресурсов:
Теория — Статьи на тему, что такое и с чем едят Buffer Overflow
Практика — Крутые таски на тему PWN от Codeby Games
В этой статье будем решать таск Stack1 (скачать EXEшник можно ТУТ).
Stack1
Начинаем со статического анализа, открываем stack1.exe в GHIDRA:
![Вывод информации о нашем EXE-файле Вывод информации о нашем EXE-файле](https://habrastorage.org/getpro/habr/upload_files/250/a9c/9ec/250a9c9eceb3f99f416a85eaf6fc562a.jpg)
Анализируем наш бинарный файл:
![](https://habrastorage.org/getpro/habr/upload_files/b74/b96/177/b74b961774e534947bfdbcc7e62138a7.jpg)
![](https://habrastorage.org/getpro/habr/upload_files/323/3e3/0ce/3233e30cef719bd79c288b7b9453c70e.jpg)
Получаем декомпилированный код:
![](https://habrastorage.org/getpro/habr/upload_files/45f/39d/402/45f39d4022d89f87fc3f81f67aecfb37.jpg)
Сразу же обращаем внимание на использование небезопасной функции strcpy(), которая копирует наш переданный аргумент в 64-байтный массив (local_54). В прошлый раз мы перезаписывали переменную, а в этот раз нам нужно присвоить ей конкретное значение, а именно 0x61626364. Перезаписав переменную, наше условие сработает, и мы увидим строчку «you have correctly...».
Переходим к «динамике»! Открываем x64dbg, открываем stack1.exe и нажимаем «Изменить аргументы командной строки»:
![](https://habrastorage.org/getpro/habr/upload_files/fa9/d46/452/fa9d46452612a723dd468fa38f4c534d.jpg)
Но что-же писать в качестве аргумента? Вспоминаем, что массив у нас на 64 байта, поэтому заполним его символами «A». Далее нам нужно дозаписать 0x61626364. Открываем ASCII-таблицу, чтобы узнать, что это за символы:
![](https://habrastorage.org/getpro/habr/upload_files/2b1/3aa/fc9/2b13aafc9f0676b637c1c72e625c6f42.jpg)
Отлично! С учетом порядка байтов наш аргумент будет выглядеть следующим образом:
![64 символа "A" и "dcba" 64 символа "A" и "dcba"](https://habrastorage.org/getpro/habr/upload_files/bca/05e/d3f/bca05ed3fb5ab3c0fefa31670e1e3f8b.jpg)
Нажимаем «OK», ставим «бряк» на инструкции сравнения «cmp EAX,61626364»:
![](https://habrastorage.org/getpro/habr/upload_files/c31/f3b/a24/c31f3ba24ecd358e3cde0447caa65b69.jpg)
Запускаем! Заполняем массив символами «A» и успешно записываем в EAX — 61626364 (это наши символы «dcba»):
![](https://habrastorage.org/getpro/habr/upload_files/46c/87f/279/46c87f279ad68491245966d02e6a2718.jpg)
Инструкция CMP «успешно» сравнивает значение в регистре EAX с значением 61626364, и мы получаем заветное сообщение в терминале (З.Ы. CMP фактически выполняет операцию вычитания между двумя операндами для проверки равенства или неравенства этих операндов):
![Profit! Profit!](https://habrastorage.org/getpro/habr/upload_files/8bf/cd4/588/8bfcd4588ca08d1d28b6061022851296.jpg)
Всем спасибо за внимание!
З.Ы. Ставьте лайк, если понравился райтап! Так я буду знать, что тема многим полезна, чтобы продолжать серию статей на эту тему! :)