#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>

#ifdef __GNUC__
    // Optimization removes VLA and inlines `exploitable()` into `main()`.
    #pragma GCC optimize("O0")

   // IdeOne does not like our `buffer`.
    #pragma GCC diagnostic ignored "-Wunused-variable"

    // Unfortunately it does not work on 32-bit targets without this.
    #pragma GCC optimize("no-stack-protector")
#endif

static void evil(void) {
    puts("pwned!");
    exit(0);
}

#ifdef __LP64__

// x86-64 Linux.

static void magic(bool a, bool b, bool c, bool d, bool e, bool f,
                  bool g, void *func) {
    // Инновационный синтаксис вызова функций: справа налево!
    // И он... работает!
    (void)func;
}

static void exploitable(size_t length) {
    char buffer[length];
    magic(0, 0, 0, 0, 1, 0, 1, evil);
}

int main(int argc, char **argv) {
    exploitable(~69);
}

#else

// x86 Linux.

static void magic(long double unknown, void *func) {
    // Инновационный синтаксис вызова функций: справа налево!
    // И он... работает!
    (void)func;
}

static void exploitable(size_t length) {
    char buffer[length];
    magic(true, evil);
}

int main(int argc, char **argv) {
    exploitable(~42);
}

#endif
