Можем ли мы добавить и использовать регистр стека обратных адресов, чтобы предотвратить атаку переполнения стека? - PullRequest
0 голосов
/ 11 мая 2018

Исходя из этого вопроса , не будет ли безопаснее отправить адрес возврата в конкретный регистр стека, чтобы мы не могли использовать переполнение стека?

  1. Абонент переводит адрес возврата (call) в return address stack register.
  2. Звонящий выдвигает аргументы.
  3. Калли толкает местных жителей.
  4. В звонящем происходит какая-то работа.
  5. Калли очищает стек.
  6. ret вставляет значение return address stack register в RIP / EIP.

1 Ответ

0 голосов
/ 11 мая 2018

Передача адреса возврата в регистр, а не в стек, в большинстве случаев не помогает.

Большинство ISA RISC уже делают это с помощью регистра ссылок, и их call эквивалент - это переход и соединение (MIPS jal) или ARM bl). Вызываемый должен сохранить адрес возврата в стеке самостоятельно, если он хочет вызвать дочернюю функцию, потому что jal забивает регистр связи. (Таким образом, они в конечном итоге возвращаются, загружая адрес возврата в регистр и используя инструкцию перехода к регистру.)

Это принципиально не отличается от того, что делает x86, где ret в основном pop rip напрямую. Единственным отличием будут конечные функции, где адрес возврата никогда не будет помещен в память, если вызываемый объект не разлит / перезагружает его, чтобы получить дополнительный пустой регистр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...