-
Notifications
You must be signed in to change notification settings - Fork 91
/
meltdown.c
153 lines (134 loc) · 3.92 KB
/
meltdown.c
1
2
3
4
5
6
7
8
9
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* ---------------------------------------------------------------------
*
* DISCLAIMER
*
* ---------------------------------------------------------------------
*
* Author takes no responsibility for any actions with provided
* informations or codes.
*
* ---------------------------------------------------------------------
*
* Speculative optimizations execute code in a non-secure manner leaving
* data traces in microarchitecture such as cache.
*
* Refer to the paper by Lipp et. al 2017 for details:
* https://meltdownattack.com/meltdown.pdf.
*
* ---------------------------------------------------------------------
*
* Exploited by BuddasLittleFinger
*
* Tested on:
*
* Ubuntu 16.04
* CentOS 7.2
*
* Kudos for:
* Vasyan, Mews, Laurent Pootie(cat) and all the mates i know, peace.
* Special kudos for Zhabka for testing this shit.
*
*/
#define _GNU_SOURCE
#define _XOPEN_SOURCE
#include <stdio.h>
#include <string.h>
#include <setjmp.h>
#include <signal.h>
#include <ucontext.h>
#include <unistd.h>
#include <fcntl.h>
#include <x86intrin.h>
// #define DEBUG 1
/* comment out if getting illegal insctructions error */
#ifndef HAVE_RDTSCP
#define HAVE_RDTSCP 1
#endif
#define TARGET_OFFSET 9
#define TARGET_SIZE (1 << TARGET_OFFSET)
#define BITS_BY_READ 2
static char target_array[BITS_BY_READ * TARGET_SIZE];
void clflush_target(void)
{
int i;
for (i = 0; i < BITS_BY_READ; i++)
_mm_clflush(&target_array[i * TARGET_SIZE]);
}
const char * array[] = {
"We're no strangers to code",
"You know the rules and so do I",
"A full commit's what I'm thinking of",
"You wouldn't get this from any other script",
"",
"I just wanna tell you what I am coding",
"Gotta make you understand",
"",
"Never gonna scare you up",
"Never gonna melt you down",
"Never gonna bug around and hack you",
"Never make you wanna cry",
"Never gonna say deny",
"Never gonna let a pipeline hurt you",
"",
"We've known each other for so long",
"Your memory's been hiding and you're too shy to dump it",
"Inside we both know what's been going on",
"We know the game and we're gonna play it",
"",
"And if you ask me what's my spectre",
"Don't tell me you have branch prediction",
"",
"Never gonna scare you up",
"Never gonna melt you down",
"Never gonna bug around and hack you",
"Never make you wanna cry",
"Never gonna say deny",
"Never gonna let a pipeline hurt you",
"Never gonna scare you up",
"Never gonna melt you down",
"Never gonna bug around and hack you",
"Never make you wanna cry",
"Never gonna say deny",
"Never gonna let a pipeline hurt you",
"",
"Never gonna scare, never gonna scare",
"(Scare you up)",
"(Ooh) Never gonna melt, never gonna melt",
"(Melt you down)",
"",
"We've known each other for so long",
"Your memory's been hiding and you're too shy to dump it",
"Inside we both know what's been going on",
"We know the game and we're gonna play it",
"",
"I just wanna tell you what I am coding",
"Gotta make you understand",
"",
"Never gonna scare you up",
"Never gonna melt you down",
"Never gonna bug around and hack you",
"Never make you wanna cry",
"Never gonna say deny",
"Never gonna let a pipeline hurt you",
"Never gonna scare you up",
"Never gonna melt you down",
"Never gonna bug around and hack you",
"Never make you wanna cry",
"Never gonna say deny",
"Never gonna let a pipeline hurt you",
"Never gonna scare you up",
"Never gonna melt you down",
"Never gonna bug around and hack you",
"Never make you wanna cry",
};
#define n_array (sizeof (array) / sizeof (const char *))
int main(int argc, char *argv[])
{
int i;
for (i = 0; i < n_array; i++) {
printf ("%s\n", array[i]);
fflush(stdout);
usleep(100000);
}
return 0;
}