CTF BOF: Регулировщик громкости (writeup)

Привет.
Погнали дальше.

Скачиваем, unzip, IDA, main.
IDA.png

Тут видим, что у нас есть одна уязвимая функция принимающая в массив 4. Так же видим что есть условие по которому мы должны попасть в ветку где можем получить флаг. Так же видим, что можем увеличивать громкость только 2 раза, если у нас не премиум.

Смотрим как у нас лежат переменные в памяти
IDA-memory_clear.png

Ага, ну погнали переполнять и искать нагрузку.

Введя как нагрузку 11111111111111 - получаем вот такое вот в памяти
IDA-memory_bad.png

Можно посмотреть в псевдокоде что у нас хранится в переменных. Мы переписали переменную v8, попали в премиум ветку, но флаг не распечатался.

Идем смотреть что у нас происходит во время печати
IDA-print.png

Не обращайте внимания на названия переменных на данном скрине - в псевдокоде можно переименовывать переменные по правому клику мыши, чтобы код был читабельнее и понятнее.
Тут видно, что в функции печати принимаются 2 аргумента, которые используются для печати флага, который был скопирован в массив длиной 28 байт. Но почему не распечатал?

Для понимания что же у нас перетерлось можно смотреть на память после применения нашей нагрузки (см. скрин с памятью), либо в отладке в IDA наводить на переменную мышью и будет хинт в которой будет значение которое туда записалось.
IDA-memory_v7.png

Штош, получилось что мы переписали эти параметры для печати, фигово. Значит надо переписать память таким образом, чтобы и v8 переписать и v7 и v6 переписать правильно, так как они даже в коде выставляются не верно. Так как размер массива флага 28 и если мы хотим, получить полный флаг, то нам надо переписать переменные, которые передаются в функцию печати так, чтобы они были равны 0 и 28. Ничего из ASCII table нам тут тоже не поможет. Так как pwn, то используем pwn.

Вы не однократно видели, что у меня в exploit.py есть ветки с EDB и GDB (я еще доустанавливал pwndbg), но там я пока не разобрался, но придумал маленький костыль. В exploit.py я поставил запрос ответа пользователя, что бы успеть подключиться в IDA к запущенному процессу, что бы можно было посмотреть что в память легло. Спустя n-ое время и огромное количество проб получил таки нагрузку.

IDA-memory_payload.png


sploit.png


PWNED

PS
Разрыл дома старую библиотеку и нашел пару интересных книг аж от 2004 года:
1. Использование языка Ассемблера (Финогенов)
2. С++ глазами хакера (Фленов)
Будет чем заниматься и что читать в отпуске.

PPS
Всем хороших выходных!
 

Вложения

  • IDA-memory.png
    IDA-memory.png
    171,1 КБ · Просмотры: 109
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!