千家信息网

Paddind Oracle Attack的示例分析

发表于:2024-09-30 作者:千家信息网编辑
千家信息网最后更新 2024年09月30日,这篇文章将为大家详细讲解有关Paddind Oracle Attack的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。适用条件加密方式为AES.CBC模式已
千家信息网最后更新 2024年09月30日Paddind Oracle Attack的示例分析

这篇文章将为大家详细讲解有关Paddind Oracle Attack的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

适用条件

  • 加密方式为AES.CBC模式

  • 已知加密后的cipher

  • 已知加密时初始的iv

攻击原理

如果明文过长,需要一个块一个块的进行解密,只是iv发生了变换,其中的过程一模一样

对于每一块的明文,从后向前一位一位的解密

先看CBC经典图

在加密时

在解密时

攻击实现

存在一个服务器,会返回密文解密后的正确与否(padding),随后返回解密的状态,我们就可以通过该种方式取得加密后且与iv异或之前的中间态I,那么我们发现I=C⊕P,而C已知,我们就可以通过异或来得到原来的明文P,所以接下来的主要矛盾即是求得这个中间态I

我们选择构建iv=\x00*16,将这个iv发送给服务器后会进行padding测试,假设P的最后一位为X,那么当且仅当padding后的结果为0x01时(P⊕i⊕0x01),服务器才会判定正确,那么我们即可对该位iv进行爆破测试,当服务器返回正确时,我们很大几率上是得到了正确的I了,所以我们从最低位开始枚举,当该位正确时,接着向前一位开始枚举,知道全部位被取得时,也就是I已知的时候了,最后利用I⊕IV即可得到该块的明文P了。

随后将IV改为上一个块的密文,重复上述操作即可。

例题

1. 0xGame Padding Oracle

这里放一道标准实例题,相关分析如上,这里演示下具体操作。

胡乱分析.jpg

这里因为懒,所以手动改代码后多跑了几遍,因为这玩意爆破一次时间长得离谱,debug噩梦


from string import digits, ascii_letters
from pwn import *
from hashlib import sha256
from Crypto.Util.number import *
import os

table = digits+ascii_letters
r = remote("49.235.239.97", "10003")

def proof_of_work():
rev = r.recvuntil("sha256(XXXX+")
suffix = r.recv(16).decode()
r.recvuntil(" == ")
res = r.recv(64).decode()
def f(x):
hashresult = hashlib.sha256((x+suffix).encode()).hexdigest()
if hashresult == res:
return 1
else:
return 0
prefix = util.iters.mbruteforce(f,table,4,'upto')
r.sendline(str(prefix))

def read_data():
r.recvuntil("iv : ")
iv = r.recvuntil('\n')[:-1].decode()
iv = bytearray.fromhex(iv)
r.recvuntil("crypttext : ")
qwq = r.recvuntil('\n')[:-1].decode()
cbc = bytearray.fromhex(qwq)
return iv,cbc,qwq

proof_of_work()
print('Successfully pass the pow!')
iv,cbc,qwq=read_data()
mid = []
print('Successfully read the data!')
#print('iv =',iv)
#print('cbc =',cbc)
#print(cbc.hex()[64:])

r.recvuntil('> ')

iv = bytearray.fromhex(qwq)[16:32]
print(iv)
new_iv = bytearray(b'\x00'*16)
count = 1
for i in range(16):
for j in range(256):
new_iv[15-i] = j
r.sendline('1')
r.recvuntil('(in hex): ')
r.sendline(str(new_iv.hex()))
r.recvuntil('(in hex): ')
r.sendline(str(cbc.hex()[64:96]))
back = r.recvline(keepends = False)
r.recvuntil('> ')
if(b'success' in back):
print(back,j)
ans = j ^ count
break
count += 1
mid.append(ans)
for m in range(15-i,16):
new_iv[m] = count ^ mid[15-m]
find = ''
for i in range(16):
find += hex(iv[i] ^ mid[15 - i])[2:].rjust(2,'0')
flag = bytearray.fromhex(find)
print(flag)
r.interactive()

关于"Paddind Oracle Attack的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

加密 分析 明文 服务器 服务 篇文章 示例 可以通过 密文 方式 更多 攻击 测试 爆破 不错 实用 很大 最低 离谱 矛盾 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 盘州网络安全系统多少钱 梁平区工商软件开发服务公司 ifs是什么网络安全 战地五怎样创立服务器 数据库union 的用法 软件开发累 干不下去了 南平闵发网络技术有限公司 哈工大邀请赛 网络安全 惠州市英科网络技术有限公司 软件开发服务费有哪些 马来西亚科技互联网公司 初中计算机网络安全基础知识 电子商务软件开发方案费用 前端8原生获取数据库 互联网医院网络安全问题 江西机构养老软件开发哪儿好 软件开发 建模书籍 苹果手机文件管理连接服务器 数据库查询特定时间的语句 三调数据库颜色代码 电脑磁盘管理服务器 中国网络安全能力咋样 如何在服务器安装我的世界 重庆政务软件开发价格 计算机网络技术哪家好 管理数据库系统的报告题目 数据库视频字符 女生学哪种网络技术好 服务器前端部署和后端部署 山东硅石网络技术有限公司
0