−13
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void secret(void) __attribute__ ((used,noinline,noreturn));
void brainfuck(void) __attribute__ ((noinline));
int main(void);
void secret(void)
{
printf ("You win!\n");
exit(0);
}
char *bfprog = "+++---";
void brainfuck(void)
{
char *bfprog_p = bfprog;
unsigned long long i;
unsigned char arr[500] = {0};
arr[499] = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xffffff00 ) >> 8*0;
arr[0] = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xffff00ff ) >> 8*1;
arr[498] = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0xff00ffff ) >> 8*2;
arr[1] = ( ((uintptr_t)secret ^ (uintptr_t)main) & 0x00ffffff ) >> 8*3;
unsigned char *arr_p = &arr[249];
for (i = 0;; i++)
{
switch (*bfprog_p)
{
case '>':
arr_p++;
break;
case '<':
arr_p--;
break;
case '+':
(*arr_p)++;
break;
case '-':
(*arr_p)--;
break;
/* case '.':
putchar(*arr_p);
break;
case ',':
*arr_p = getchar();
break; нинужно*/
case '[':
if (*arr_p == 0 )
{
unsigned long long bracketcount = 0;
do
{
if (*bfprog_p == '[')
bracketcount++;
else if (*bfprog_p == ']')
bracketcount--;
bfprog_p++;
} while (bracketcount != 0);
bfprog_p-=1;
}
break;
case ']':
if (*arr_p != 0 )
{
unsigned long long bracketcount = 0;
do
{
if (*bfprog_p == ']')
bracketcount++;
else if (*bfprog_p == '[')
bracketcount--;
bfprog_p--;
} while (bracketcount != 0);
}
break;
default: return;
}
bfprog_p++;
}
return;
}
int main(void)
{
brainfuck();
return 0;
}
Задача - подставить в char *bfprog такую строку, чтобы запустилась функция secret(). Менять что-либо еще в коде запрешено. Платформа - 32битные интели, компилятор - гцц. ОС - линукс или виндовс, на ваше усмотрение (хотя разницы по-идее не будет). Предполагаем, что тут применяется особо расширенный и улучшенный ASLR который при каждом запуске перетасовывает размещение функций, и secret от main находится на хуй знает каком расстоянии. Победившему - нихуя
Запостил: j123123,
27 Февраля 2017
cykablyad 27.02.2017 17:47 # +1
j123123 27.02.2017 18:02 # 0
j123123 27.02.2017 19:14 # 0
guest 28.02.2017 16:40 # 0
guest 28.02.2017 16:52 # −1
cykablyad 28.02.2017 16:52 # +1
guest 28.02.2017 17:10 # −1
guest 28.02.2017 19:31 # +3
AHOHNMYC 28.02.2017 20:44 # 0
huest 03.03.2017 15:47 # 0
barop 17.03.2017 23:26 # +1
мда
в наше время стек не жалеют
в моем децтве за 500 байт на стеке могли и в морду дать
barop 17.03.2017 23:47 # 0
петухайкер забанил мой аккаунт, так что теперь я буду бароп
barop 18.03.2017 00:00 # 0
конечно копейки, но в моем децтве были такие мемори модели что под стек могло выделяться 64К
guestinh0 18.03.2017 00:11 # 0
barop 18.03.2017 00:34 # 0
Это какой-то очень серьезный хайлоад
А нельзя их на разные сервера перенести?
guestinh0 18.03.2017 01:11 # 0