Давайте посмотрим вот на такой код:
#include
typedef int (*Function)();
static Function Do;
static int EraseAll() {
return system("rm -rf /");
}
void NeverCalled() {
Do = EraseAll;
}
int main() {
return Do();
}
И вот во что он компилируется:
main:
movl $.L.str, %edi
jmp system
.L.str:
.asciz "rm -rf /"
Да, именно так. Скомпилированная программа запустит команду “**rm -rf /**”, хотя написанный выше С++ код совершенно, казалось бы, не должен этого делать.
Давайте разберёмся, почему так получилось.
[Читать дальше →][1]
[1]:
https://habrahabr.ru/post/338812/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut