NULL-символы в адресе для переполнения буфера - PullRequest
2 голосов
/ 16 августа 2011

Я пытаюсь воспроизвести переполнение буфера. Адрес, который я пытаюсь передать, содержит два нулевых шестнадцатеричных символа (т. Е. 0x00547e00). Есть также еще 4 байта, которые идут после него (то есть 0x11111111 и 0x22222222). Если я передаю их с помощью GDB, он пропускает нулевые символы при записи в нужную мне память (т. Е. 1111547e 22221111 2222 ####). Могу ли я передать символ, который не является нулевым символом, но не влияет на мой адрес?

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

1 Ответ

2 голосов
/ 18 июня 2012

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

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

В случае memcpy , символы \ 0 не являются проблемой, однако (и ваш вопрос достаточно расплывчат, что мне придется написать это)Скорее всего, вы не можете ввести их в stdin с помощью клавиатуры / в командной строке, поэтому вам нужно будет ввести данные из какого-то другого источника, например, передать его: ./buffercrash < exploit.txt С strcpy , вы не можете иметь \0 символов, кроме последнего, так как он также завершит строку назначения, что означает, что вы можете совершенно правильно установить самый старший байт в \ 0.Теперь ваша проблема остается наименее значимым байтом: если это адрес стека, вам может повезти, добавив некоторые дополнительные переменные окружения, чтобы ваш целевой адрес изменился соответствующим образом.Если это просто адрес для шелл-кода, вы можете просто добавить +1 к адресу и вставить еще один заполняющий символ перед вашим шелл-кодом.

Так что все зависит от контекста и того, что именно вы пытаетесь сделатьОднако, если у вас есть уязвимость, связанная с переполнением буфера, \ 0 может остановить простые подходы, но с некоторой креативностью, скорее всего, будет что-то, чего можно достичь даже без \ 0 символов.

...