Crypto ECB模式攻擊

2021-08-22 10:24:35 字數 2976 閱讀 5940

(參考

ecb模式使用相同的key分塊對明文分別進行加密,相同的明文獲得相同的密文輸出 

根據這一特性,可以構造如下資料進行攻擊: 

首先輸入blocksize-1的填充,這樣未知字串的第乙個字元將落到填充塊的最後乙個位元組:  

******aa aaaaaaaa aaaaaaxx

******ba aaaaaaaa aaaaaaax

******bb aaaaaaaa aaaaaaaa

這時會得到填充塊的乙個密文輸出,爆破最後乙個位元組,直到產生與剛才相同的密文輸出,就可以確定未知字串的乙個位元組,重複這個過程就可以得到完整的未知字串。

向包含未知字串的明文中插入資料,其實也是列舉驗算的過程:

1.獲取未知字串的第一位

比輸入name為111111111111,

伺服器生成未知字串"hello, 111111111111, your mission's flag is:  flag******"的用ecb加密過的字串s1給我們,

其中flag******是我們希望得到的flag,通過觀察題目程式可知,此處ecb使用的是16位的, 

進而觀察可知,16個字元的字串加密後就變成32個字元的密文了。

就是說"hello, 111111111111, your mission's flag is:  x"的最後乙個x剛好是第32位,我們首先通過這個32字元的字串獲取一下加密過的encrypto, 也就是64個字元的字串s2,那麼這個s2必然是s1的前64位。

然而我們剛開始並不知道這個x是什麼,於是我們列舉這個x,令x為乙個ascii字元,

比如向伺服器傳送"hello, 111111111111, your mission's flag is:  a",獲取密文,如果這個密文恰好是s1的前64位,那麼a就是flag未知字串的第一位,於是我們就破解了flag的第一位。

2.獲取未知字串的剩餘位

因為a已經是flag的第一位,根據破解的原理,我們要把未知字元放在第32位(此處和第一步一樣取乙個合理的16的倍數)

那麼我們只要把name的名字長度縮小乙個字元就可以了

即此時變為"hello, 11111111111, your mission's flag is:  ax"

(可以對照第一步的字元"hello, 111111111111, your mission's flag is:  a"

依然列舉x即可,以此類推,獲取全部的字串(此處以"}"為結尾標誌)

主程式**:

#!/usr/bin/env python

# coding=utf-8

import conn

import os

number = 30 + 16

mess = "hello, 111111111111, your mission's flag is: moeflag_-~!@#$%^&*()-=+?>

for i in array:

conn.reads()

# print("嘗試 "+i)

mess = "hello, " + "1" * number + ", your mission's flag is: " + ans + i

conn.sends(mess)

data = conn.reads()

# print(data)

# print data

if data[0:128 + 32] == blockdata:

found = true

print("發現 " + i)

ans += i

number = number - 1

if i == "}":

number = -1

print("答案:" + ans)

os.system("pause")

# message=message+i

break

conn.close()

if not found :

print("沒有找到~~")

os.system("pause")

print(ans)

元件conn的**

import socket

import os

obj = none

def remote(addr, ip):

global obj

obj = socket.socket()

obj.connect((addr, ip))

def reads():

global obj

ret_bytes = obj.recv(1024)

ret_str = str(ret_bytes, encoding="utf-8")

#print(ret_str)

return ret_str

def sends(content):

global obj

obj.sendall(bytes(content + "\n", encoding="utf-8"))

def close():

global obj

obj.close()

注:這兩個**需要放在同級目錄下,只要執行main就可以了

見這可能是因為輸入的字串最後沒有 換行符,導致伺服器認為輸入未結束。

可能有這麼幾個原因:

原因1:列舉的字元集合不夠大,有些flag中例如「=」這樣的資料沒有包含進去。也可以採用轉ascii,這樣更完整,但是運算速度就降低了。

原因2:flag位數太大, 移位以後還不夠,可以 分批執行程式,也可以擴大初始name的長度

web攻擊模式

主動攻擊 攻擊者直接訪問web應用,把攻擊 傳入的攻擊模式.代表的有sql注入攻擊和os命令注入攻擊 被動攻擊 被動攻擊 passive attack 是指利用圈套策略執行攻擊 的攻擊模式。在被動攻擊過程中,攻擊者不直接對目標 web 應用訪問發起攻擊。被動攻擊通常的攻擊模式如下所示。步驟 1 攻擊...

Web應用的攻擊模式

web應用的攻擊模式 主動攻擊 通過訪問web應用,把攻擊 插入的攻擊模式,sql注入攻擊,os命令注入攻擊 被動攻擊 利用全套策略執行攻擊 的攻擊模式不直接對web應用訪問發起攻擊 指令碼攻擊,跨站點請求偽造 步走如下 攻擊者誘發使用者觸發已經設好的陷阱,然後這個陷阱會自動傳送http請求,其中以...

Aircrack ng的6種攻擊模式

0 deautenticate 衝突模式 使已經連線的合法客戶端端強制斷開與路由器的連線,使其重新連線。在重新連線過程中獲得驗證資料報,從而產生有效的 arp資料。如果乙個客戶端連在路由器上,但是沒有人上網來產生有效資料,此時即使用 3也無法產生有效的 arp資料,所以就需要用 0攻擊模式來配合 3...