#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) {
}
#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
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkYm9vbC5oPgoKI2lmZGVmIF9fR05VQ19fCiAgICAvLyBPcHRpbWl6YXRpb24gcmVtb3ZlcyBWTEEgYW5kIGlubGluZXMgYGV4cGxvaXRhYmxlKClgIGludG8gYG1haW4oKWAuCiAgICAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgiTzAiKQoKICAgLy8gSWRlT25lIGRvZXMgbm90IGxpa2Ugb3VyIGBidWZmZXJgLgogICAgI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC12YXJpYWJsZSIKCiAgICAvLyBVbmZvcnR1bmF0ZWx5IGl0IGRvZXMgbm90IHdvcmsgb24gMzItYml0IHRhcmdldHMgd2l0aG91dCB0aGlzLgogICAgI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIm5vLXN0YWNrLXByb3RlY3RvciIpCiNlbmRpZgoKc3RhdGljIHZvaWQgZXZpbCh2b2lkKSB7CiAgICBwdXRzKCJwd25lZCEiKTsKICAgIGV4aXQoMCk7Cn0KCiNpZmRlZiBfX0xQNjRfXwoKLy8geDg2LTY0IExpbnV4LgoKc3RhdGljIHZvaWQgbWFnaWMoYm9vbCBhLCBib29sIGIsIGJvb2wgYywgYm9vbCBkLCBib29sIGUsIGJvb2wgZiwKICAgICAgICAgICAgICAgICAgYm9vbCBnLCB2b2lkICpmdW5jKSB7CiAgICAvLyDQmNC90L3QvtCy0LDRhtC40L7QvdC90YvQuSDRgdC40L3RgtCw0LrRgdC40YEg0LLRi9C30L7QstCwINGE0YPQvdC60YbQuNC5OiDRgdC/0YDQsNCy0LAg0L3QsNC70LXQstC+IQogICAgLy8g0Jgg0L7QvS4uLiDRgNCw0LHQvtGC0LDQtdGCIQogICAgKHZvaWQpZnVuYzsKfQoKc3RhdGljIHZvaWQgZXhwbG9pdGFibGUoc2l6ZV90IGxlbmd0aCkgewogICAgY2hhciBidWZmZXJbbGVuZ3RoXTsKICAgIG1hZ2ljKDAsIDAsIDAsIDAsIDEsIDAsIDEsIGV2aWwpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgIGV4cGxvaXRhYmxlKH42OSk7Cn0KCiNlbHNlCgovLyB4ODYgTGludXguCgpzdGF0aWMgdm9pZCBtYWdpYyhsb25nIGRvdWJsZSB1bmtub3duLCB2b2lkICpmdW5jKSB7CiAgICAvLyDQmNC90L3QvtCy0LDRhtC40L7QvdC90YvQuSDRgdC40L3RgtCw0LrRgdC40YEg0LLRi9C30L7QstCwINGE0YPQvdC60YbQuNC5OiDRgdC/0YDQsNCy0LAg0L3QsNC70LXQstC+IQogICAgLy8g0Jgg0L7QvS4uLiDRgNCw0LHQvtGC0LDQtdGCIQogICAgKHZvaWQpZnVuYzsKfQoKc3RhdGljIHZvaWQgZXhwbG9pdGFibGUoc2l6ZV90IGxlbmd0aCkgewogICAgY2hhciBidWZmZXJbbGVuZ3RoXTsKICAgIG1hZ2ljKHRydWUsIGV2aWwpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgIGV4cGxvaXRhYmxlKH40Mik7Cn0KCiNlbmRpZgo=
0KLRgNC10LHRg9GO0YLRgdGPIExpbnV4INC4IEdDQy4KCtCf0L4g0YLQtdGF0L3QuNGH0LXRgdC60LjQvCDQv9GA0LjRh9C40L3QsNC8INGN0YLQviDQv9GA0LjQvdGG0LjQv9C40LDQu9GM0L3QviDQvdC1INGA0LDQsdC+0YLQsNC10YIg0LIKV2luZG93cywg0LLQvdC1INC30LDQstC40YHQuNC80L7RgdGC0Lgg0L7RgiDQuNGB0L/QvtC70YzQt9C+0LLQsNC90L3QvtCz0L4g0LrQvtC80L/QuNC70Y/RgtC+0YDQsC4=
Требуются Linux и GCC.
По техническим причинам это принципиально не работает в
Windows, вне зависимости от использованного компилятора.