您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Paddind Oracle Attack的示例分析,小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
加密方式為AES.CBC模式
已知加密后的cipher
已知加密時(shí)初始的iv
如果明文過長,需要一個(gè)塊一個(gè)塊的進(jìn)行解密,只是iv發(fā)生了變換,其中的過程一模一樣
對(duì)于每一塊的明文,從后向前一位一位的解密
先看CBC經(jīng)典圖
在加密時(shí)
在解密時(shí)
存在一個(gè)服務(wù)器,會(huì)返回密文解密后的正確與否(padding),隨后返回解密的狀態(tài),我們就可以通過該種方式取得加密后且與iv異或之前的中間態(tài)I
,那么我們發(fā)現(xiàn)I=C⊕P
,而C
已知,我們就可以通過異或來得到原來的明文P
,所以接下來的主要矛盾即是求得這個(gè)中間態(tài)I
。
我們選擇構(gòu)建iv=\x00
*16,將這個(gè)iv發(fā)送給服務(wù)器后會(huì)進(jìn)行padding測試,假設(shè)P
的最后一位為X
,那么當(dāng)且僅當(dāng)padding后的結(jié)果為0x01
時(shí)(P⊕i⊕0x01
),服務(wù)器才會(huì)判定正確,那么我們即可對(duì)該位iv進(jìn)行爆破測試,當(dāng)服務(wù)器返回正確時(shí),我們很大幾率上是得到了正確的I
了,所以我們從最低位開始枚舉,當(dāng)該位正確時(shí),接著向前一位開始枚舉,知道全部位被取得時(shí),也就是I
已知的時(shí)候了,最后利用I⊕IV
即可得到該塊的明文P
了。
隨后將IV
改為上一個(gè)塊的密文,重復(fù)上述操作即可。
這里放一道標(biāo)準(zhǔn)實(shí)例題,相關(guān)分析如上,這里演示下具體操作。
胡亂分析.jpg
這里因?yàn)閼?,所以手?dòng)改代碼后多跑了幾遍,因?yàn)檫@玩意爆破一次時(shí)間長得離譜,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()
關(guān)于“Paddind Oracle Attack的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。