Переполнение буфера — уязвимость и эксплойт строки формата

#gdb #cpu-architecture #buffer-overflow #security

#gdb #архитектура процессора #переполнение буфера #Безопасность

Вопрос:

Я следую руководству на YouTube, чтобы узнать об эксплойтах переполнения буфера. Основное различие, которое я вижу между его машиной и моей, заключается в том, что его адреса состоят из 8 байт, а мои — из 12. Однако оба наших блока памяти имеют размер 8 байт.

Когда он запускает свою команду эксплойта внутри gdb, он использует
r $(python -c 'print "xffxffxffxff" "x-" * 6 "%s"')
где "xffxffxffxff" его адрес памяти.

Я запускаю свою команду с помощью
r $(python -c 'print "xFFxFFxFFxFFxFFxFF" "x-" * 3 "%s"')
где xFFxFFxFFxFFxFFxFF мой адрес памяти. (Я изменил его *6 на *3 , поскольку его указатель стека находился на расстоянии 6 от его адреса памяти, а мой — на расстоянии 3).

Я попытался изменить количество "x" имеющихся у меня значений, а также изменить значение на %x012 а также %x12 .

Существует ли конкретный способ работы с 12-байтовыми адресами, или этот эксплойт присутствует с 12-байтовыми адресами? ASLS отключен.

Комментарии:

1. Вы имеете в виду 12 шестнадцатеричных цифр? Это 6 байт, 48 бит. Вероятно, на самом деле 64-разрядный, но с большими нулями, как обычно для канонических адресов x86-64.

Ответ №1:

Скорее всего, вы скомпилировали свою программу как 64-битную, в то время как учитель сделал свою в 32-битной.

Переполнение буфера не будет работать так же в 64-битном режиме. Есть разные вещи, которые следует учитывать. Рекомендую скомпилировать как 32-битный и попробовать этот способ, если вы хотите сначала разобраться с основами.

Комментарии:

1. Я сделаю это и, возможно, вернусь к этому в будущем в 64-битной версии. Каковы будут основные соображения при преобразовании в 64-разрядную версию?