Атака переполнения буфера - возвращение к адресу в стеке? - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть назначение, которое говорит мне, что мне нужно выполнить переполнение буфера, запустив код из стека. Я пытался это сделать, но каждый раз, когда я заменяю позицию «ret» стека на местоположение стека, в котором я хочу разместить код, он сохраняет ошибку seg. Если я заменяю позицию «ret» на адрес, который существует в физическом файле .o (например, код физической сборки), он работает нормально. Вам не разрешено возвращаться на позиции в стеке? Я запутался, как вы можете выполнить переполнение буфера с вашим собственным кодом сборки, если вы не можете вернуться к адресу стека ... (кстати, я использую машину с прямым порядком байтов IA32).

Мои шаги:

  1. переполнение 32-символьного буфера (положить все FF)
  2. перезаписать местоположение% ebp (с сохраненным там фактическим значением)
  3. перезаписать точку «ret» над ней адресом в стеке, а не адресом в файле сборки
  4. имплантируйте мой ассемблерный байт-код (я обязательно добавляю nop-инструкции в начале, чтобы убедиться, что он выполняется кратно 4 байтам)
  5. запустите

и это приводит к ошибке сегмента

Ответы [ 2 ]

4 голосов
/ 20 февраля 2012

Убедитесь, что страницы стека помечены как исполняемые;современные операционные системы обычно устанавливают стек как неисполнимый и, следовательно, будут сразу же вызывать segfault, когда вы установите для него счетчик программы.

1 голос
/ 20 февраля 2012

Это зависит от платформы во многих отношениях.Не вся ваша память является исполняемой, и в современной системе обычно существует исключительная ситуация - или между памятью, которая может быть записана, и памятью, которая является исполняемой, именно по этим причинам.Если вы используете linux, вы можете захотеть собрать стек с дополнительными вызовами mprotect, поэтому вы измените его на исполняемый.Это потребует более сложной и составленной полезной нагрузки, но выполнимо.

Другой вариант заключается в том, что у вас все еще есть проблемы в аргументах после обратного адреса, что означает, что вам может «повезти» с вызовом другогофункция, поскольку вы не повредили стек, но когда вы вставили свой код, вы сделали.

Для дальнейшего чтения:

  1. NX бит
  2. mprotect
...