Код:
#include <stdio.h>
void fn() {
// Засовываем в стек массив указателей на секретную строку
char *s[128];
for (int i = 0; i < 100; ++i) {
s[i] = "THIS IS A SECRET";
}
}
int main(int argc, char *argv[]) {
// Вызываем функцию, которая кладет в стек секретные строки
fn();
// А теперь вызываем обычный printf с параметром формата, взятым из первого аргумента командной строки
printf(argv[1], "just a string");
return 0;
}
$ uname -a
Linux tarik02 4.4.0-17763-Microsoft #55-Microsoft Sat Oct 06 18:05:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux
$ gcc -dumpmachine
x86_64-linux-gnu
$ gcc main.c -o main
$ ./main "%s"
just a string
$ ./main "%s %s"
just a string THIS IS A SECRET
Следует обращать внимание, каким компилятором собран код, какая реализация libc используется, на какой OS запускается. В моём случае можно видеть Ubuntu (на WSL).