Проверка регистров стека

Можно использовать команду apropos для поиска ключевых слов в установленных справочных страницах:

$ apropos builtin
bash-builtins (7)    - bash built-in commands, see bash(1)
builtins (7)         - bash built-in commands, see bash(1)
$ apropos __builtin_popcount
__builtin_popcount: nothing appropriate.
$ 

Не похоже, что для этого расширения GCC существует справочная страница. Я думаю, что вам придется использовать онлайн-документацию вместо:

- встроенная функция: int __builtin_popcount (неподписанная int x)

Возвращает число 1-бит в x.

-121--228739-

Только для записи, правильный xargs -0 использование:

find . -inum 12321475 -print0 | xargs -0 -I '{}' mv '{}' new-filename

, но

-121--47462-

Другие ответы интересны, но никто не ответил на вопрос OP: не имея какой-либо конкретной настройки, почему некоторые терминалы показывают разное поведение?

Консоль Linux давно (с начала 1990-х) отображала цвет для интересных атрибутов видео, которые она не поддерживает. @ Incnis mr.

  • Однако грофф не знает, что существует недостаток возможностей для подчеркивания. Описание терминала говорит, что это так; что приятно, потому что groff игнорирует это (он использует жестко закодированные побеги). Однако консоль Linux отображает их как , которые она выбирает.
  • Комментарии о меньших переменных среды интересны, но не часто используются.

Некоторые другие терминалы могут отображать атрибуты видео в виде цветов; xterm может, установив ресурсы colorUL и colorULMode (и кажется, что часто дистрибутивы на основе Red Hat настраивают его таким образом). Аналогично, rxvt может (также на основе ресурсов, хотя и менее конфигурируемый).

0
11.03.2018, 09:22
2 ответа

Регистр указателя стека является аппаратным регистром. Он указывает на ячейку памяти *, которая находится в области, используемой для стека. Регистр указателя стека используется при адресации данных в стеке.обычно увеличение или уменьшение значения указателя до или после доступа к памяти. Проверка, которая выполняется, когда происходит системный вызов, проверяет, указывает ли регистр на действительный адрес стека. «Оппортунистически» не означает «необязательно».

[ *] :действительный адрес также может быть на единицу позже последнего адреса страницы стека на некоторых архитектурах.

1
28.01.2020, 02:43

Каждый поток имеет стек. Стек — это особая область памяти, используемая потоком для хранения локальных переменных. адрес возврата функции и т. д. Когда ЦП выполняет поток, его регистр (SP )должен указывать на адрес памяти со стеком.

В большинстве случаев ядро ​​выделяет стек потока, но иногда стеки создаются приложением :Приложения могут создавать собственный стек для кода обработчиков сигналов (, который выполняется, когда ядро ​​отправляет сигнал процессу ). или они могут сделать это для реализации библиотеки потоков.

Для этого приложение запрашивает у ядра область памяти, а затем помечает ее как стек, чтобы ядро ​​знало, что эта область является стеком. Но из-за ошибок разработчиков приложение может запросить у ядра часть памяти для стека, которая не была зарегистрирована для него. тот. В этом случае может произойти что-то плохое :ядро ​​может перезаписать полезные данные, потому что думает, что пишет в стек, но оно это не стек! Хакеры могут использовать его для взлома программ.

В OpenBSD, когда вы резервируете память (с помощью mmap, например ), вы должны ЯВНО сказать, что:

Сценарий солнечного дня:

  • Ядро приложения :, можно мне немного памяти, которую я буду использовать в качестве стека?
  • Ядро :Конечно, вот твоя память
  • Приложение :ок, используйте его как стек для сигналов
  • Ядро :ok (настраивает внутренние структуры таким образом, чтобы регистр ЦП SP указывал на эту память при обработке сигнала)

Сценарий дождливого дня:

  • Ядро приложения :, можно немного памяти?
  • Ядро :Конечно, вот твоя память
  • Приложение :ок, используйте его как стек для сигналов
  • Ядро :но эта память не для стека! Вы пытаетесь меня обмануть!
  • (Ядро убивает приложение)

Вот еще несколько примеров таких флагов:

PROT _EXEC :просит ядро ​​зарезервировать память для хранения кода (что-то, что ЦП может выполнить )PROT _WRITE :просит ядро ​​зарезервировать память для записываемых данных

Таким образом, вы не можете выполнить свои данные или записать в свой код (это называется W^X и люди OpenBSD гордятся этим)

Вы можете прочитать man mmapи map sigaltstackдля получения дополнительных примеров

0
28.01.2020, 02:43

Теги

Похожие вопросы