См. ответы Томаса Порнина (+1) и Флаудера (+1), они хороши. Я хочу добавить дополнительный ответ, который, возможно, упоминался, но не был конкретно указан, и это разлив регистра.
Хотя «где» исходного вопроса (по крайней мере, в такой формулировке), похоже, основано на ложном предположении, что %eax находится в стеке и, будучи регистром, не является частью стек на x86
(хотя вы можете эмулировать любой аппаратный регистр, установленный в стеке, и некоторые архитектуры действительно делают это, но это не имеет значения), кстати, регистры часто сбрасываются/заполняются из стека. Таким образом, можно разбить значение регистра с переполнением стека, если регистр был перенесен в стек. Это потребует от вас знания механизма сброса конкретного компилятора, и для этого вызова функции вам нужно будет знать, что %eax был удален, куда он был удален, и топать это местоположение стека, и когда он будет следующим. заполненный из своей копии в памяти, он получает новое значение. Как бы маловероятно это ни казалось, эти атаки обычно инспирированы чтением исходного кода и знанием чего-то о рассматриваемом компиляторе, так что на самом деле это не так уж надуманно.
См. это, чтобы узнать больше о разливе регистров.
перенос регистра аргументов gcc на x86-64
https://software.intel.com/en-us/articles/dont-spill-that-register-ensuring-optimal-performance-from-intrinsics
person
codenheim
schedule
03.11.2014