Представьте себе два дома на улице. Один - это дом твоего друга, а другой - дом его злого параноика, соседа, на три двери вниз. Злой параноидальный сосед никогда не входит и не уходит, и его место плотно заперто.
Теперь, ваш друг такой хороший, доверчивый друг, что он позволит вам хранить что угодно на своем месте, ставя коробки один за другим, начиная с одной стены. На самом деле, он такой хороший друг, что будет продолжать класть ящики один за другим, не проверяя, ударился ли он о стену, пока они не продолжат идти в воздухе и, наконец, пройдут прямо через два других дома на улице и в дом злого параноика соседа. Но твой друг верит, что ты не будешь этого делать, потому что ты ему нравишься (и он немного наивен).
Таким образом, у вас есть возможность положить что-то в дом злого параноидального соседа, используя своего доброго доверчивого друга.
Замените следующие термины, и вы увидите аналогию с атакой переполнения буфера:
- "дом вашего друга" -> "часть программы, которая не проверяет переполнение буфера"
- "Дом его злого параноидального соседа" -> "другая часть программы, которая должна быть безопасной"
- «коробки» -> «аргументы / параметры для программы, которая не проверяет переполнение буфера»
Это успешно, только если кто-то выяснит, где находится безопасная область памяти, и что нужно будет передать в качестве аргумента рассматриваемой программе, которая в конечном итоге окажется в безопасной области, чтобы получить желаемый эффект. (будь то данные или код, вызывающий выполнение кода эксплуататора)