什麼是一個WB實施?事情你應該知道關於白盒?

Tags: 步驟, 事情, 白盒,

一般常見的方式來學習一些有價值的東西,在密碼學
要麼閱讀學術論文或密碼學書籍(當他們寫
真正的密碼破譯)。

然而,由於密碼是數學,它可以
有時似乎過於理論化的平均換向器/黑客。我願意
採取更切實可行的方法,使用的組合的兩個反向
工程和小學數學。

顯然,這樣的檔案是不寫密碼學家,而是
黑客或餅乾的概念不熟悉的白盒,並願意
學習一下吧。考慮到準不存在公
實現播放以及“相對少量
有價值的資訊,關於這個問題,我希望這將是利益。或最起碼,這將是一個愉快的閱讀...

-什麼是WB實施?因此,讓我們開始一個簡短的解釋。白色框是一個特別的
實施一個加密的原始設計抵抗
其內部的檢查。考慮一個二進位制嵌入的情況下(及
使用)一個對稱的原語(例如AES)等。用普通的
實現,AES金鑰總是會洩漏記憶體在一些點
程式的執行。這是一個逆向使用經典案例
偵錯程式。不管如何努力,它可能是(反除錯技巧,混淆
鍵等),他總是會找到一種方式來攔截的關鍵。白盒
加密技術被設計來解決這個問題,這是
很常見的,特別是在外地的DRM(數字版權管理)。

那麼它是如何工作的?主要的概念,你應該記住的是,
關鍵是永不明確。或者你可以說,這是數學
轉化或加密程式'融合'。因此,對於一鍵
一個特定的模糊處理的原語是嚴格等同於
原來的*。

對於同一個輸入,既實現將產生
相同的輸出。的數學變換的設計以這樣一種方式
一個攻擊者使用偵錯程式將無法演繹的關鍵
內部狀態... 至少在一個完美的世界:-)

*:這不是'正是'真實的,稍後我們會看到與外部編碼。

困惑?然後看看這個微小的例子:

- >的Function1:x在[0:3](倍)=(K +)%4
- >功能2:x在[0:3] G(x)的= S [X]與S = [3,0,1,2]

如果k == 3,則這兩個函式()和g()是等價的。然而
第一次明確使用金鑰“k”,而第二個不,
實現為一個查詢表(LUT)。你可以說,G()是一個白盒
執行f()的(儘管是一個非常弱的)關鍵3。雖然這
例子很容易理解,你很快就會發現,事情比較
複雜與整個現實生活中加密的原始混淆。

- [3 - 事情你應該知道關於白盒

免責宣告<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<
我將自願不太多進入<
>細節。正如我所說,本文基於<
>實用的方法讓我們避免數學<
>的時刻。<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

---- [3.1產品

WB密碼本質上是實施商業安全
產品的公司數量相對較少(Cloakware公司收購
愛迪德,Whitecryption,阿爾山,Syncrosoft的,等等)。通常他們提供了一個
安全的API,然後整合到其他的安全原語,往往
為DRM目的。除其他事項外,他們設計的WB原語
對稱加密(DES,AES),而且還MAC(HMAC,CMAC)和非對稱
原語(ECC,RSA,DSA)。

多久,我們遇到WB在野外?更多比你能想到的
的!例如,您可以看到在[R10]愛迪德有許多著名的客戶
包括德州儀器,索尼,Adobe公司和Netflix。WB加密技術將最有可能
成為越來越多的出現在軟體保護。

至於我可以告訴,不幸的是只有2個公共(非
WB實現商用)的例子,都與未公開
發電機:

- 歷史上第一個人是一個二進位制可對布萊希特Wyseur科
網站[R04]一個WB DES實現。布萊希特挑戰
找到關鍵的人:

“如果你喜歡,嘗試提取金鑰,使用的所有資訊
你可以找到這個實現(除了蠻力暗箱
當然攻擊)。“

請記住,這是一個挑戰,而不是一些生產程式碼。

- 不太可能被稱為第二個是一個挑戰JB提出
2009年版hack.lu [R02]。這是一個簡單的AES
WB,但從未正式標記等。

挑戰的一部分是
確實找到(oops!)。

所涉及的密碼分析顯然是遠遠低於學術狀態
最先進的,但它仍然有趣,誰的第一步
想要擊敗更強大的實現,是嚴重的和目標。

我們都將研究與JB的二進位制開始,怎麼看該解決方案可以
在每種情況下被發現。

[3.2先進的學術

AFAIK學術刊物,限於對稱加密和
特別是DES和AES(SPN情況下雖然有所延長[R08])。
解釋歷史的設計和密碼分析技術
開發將是複雜的,並且已經以極大的解釋
細節在布萊希特Wyseur科的論文[R04]。

主要的問題是要知道如果存在一個安全WB設計和
您認為當前最先進的加密,以及... 那裡
是不是!目前還沒有實施的建議設計不破。
在這種情況下,破碎裝置在幾秒鐘內一鍵恢復
最壞的情況。是的,_that_壞掉了!

然而,現實生活中的白盒加密可能會有所不同,因為:

- 誠如之前,專有的演算法實現
沒有提到任何檔案(MAC演算法,非對稱的)
存在。這證明,人們有足夠的智慧來設計新的
實現。另一方面,沒有任何正式的分析
這些實現,簡直可以說是關於他們的
有效的安全保障。

- Cloakware公司的產品至少部分設計/寫
誰設計了第一臺白盒密碼破譯[R7]。在一個
手,你可能會懷疑,他們的產品設計打破。
或者,我們可以假定,這是至少免疫
對當前密碼分析技術。幾乎可以說
有關其他保護(whitecryption,阿爾山,Syncrosoft的),但我們
可以推測,它是不是同口徑。

所以WB保護在實踐中難以突破?誰知道?但
記住,保護關鍵的是一件事,同時保護內容
不同的東西。所以,如果你一個白盒解決方案進行審計之前,
試圖檢索的關鍵,看你能不能攔截明文。那裡
有很多可能的攻擊,可能繞過WB保護
[R06]。

備註:很顯然,DRM的情況下(如果沒有硬體保障
參與),你總能找到一種方式來攔截加密的資料。這
是因為在某些時候,玩家將要傳送音訊/視訊流
聲音/視訊卡驅動程式,你可能想鉤住他們的一些
功能恢復媒體。但是,這是一種做法,如果忘記
介質要求的幾個資料流的同步(即電影
音訊和視訊)。

現在這麼說,讓我們開始第一個挑戰:)

- [4 - 處理第一種情況下:hack.lu的挑戰

我要感謝JB這個二進位制檔案,因為他是一個人建議我
解決這個問題前幾天*。不幸的是,我的解決方案有失偏頗,因為我知道
從一開始,這是一個AES白盒。我可能已經採取了
不同的方法來解決它,如果我沒有。但是,這是一個足夠好的
例如介紹WB保護。

*:Phrack的通常遲到“前幾天”,大概意思是“幾個星期**
前“
** Phrack的_indeed_的遲到“幾個星期前,”現在是“幾個月前”
;>

---- [4.1 - 發現步驟

由於面臨的挑戰是打破一個AES白盒,這意味著
我們可能需要執行幾個任務:

- 找出如果WB是一個AES或AES ^(-1)和相關的金鑰
長度:16(AES-128),24(AES-192),32(AES-256)?我們要發現
正是*什麼*白盒裝。

- 倒車每一個涉及的加密功能,並發現如何
他們涉及到原來的AES功能。這是關於
瞭解* *如何實施白盒裝。

- 尋找一種方法來恢復原來的鍵。

我不會形容了AES,因為它是沒有必要了解這部分。

位後,將提供必要的細節。首先,讓我們來看看
如何檢索的序列。首先,我們將通過一個快速的逆向工程
的sub_401320()函式:

-------------------------------------------------- -------------------------
MOV EAX,[ESP +38 H + HDLG]
推21H; cchMax
LEA ECX,[ESP +3 CH +字串]
推ECX; lpString
推3ECh; nIDDlgItem
推EAX; HDLG的
呼叫DS:GetDlgItemTextA
CMP EAX,20H;長度== 32?
-------------------------------------------------- -------------------------

沒有太多的驚喜,GetDlgItemText()被呼叫來檢索
字母數字字串。在最後一行的比較表示的長度
32位元組的ASCII表示(不包括空位元組),因此一個
16位元組序列。讓我們繼續:

-------------------------------------------------- -------------------------
CMP EAX,20H
JZ短good_serial如果len是OK的再啟動
;轉換

bad_serial:
XOR EAX,EAX
[...]
RETN返回0
good_serial:
推EBX
推ESI
XOR ESI,ESI I = 0;
NOP

build_data_buffer:
MOVZX EDX,[ESP + ESI * 2 +40 H +字串]
推EDX
致電sub_4012F0得到至少顯著四位
MOV EBX,EAX
MOVZX EAX,[ESP + ESI * 2 +44 H + var_27]
推EAX
SHL BL,4
致電sub_4012F0得到最重要的蠶食
或bl,現在是一個人; BL轉換位元組
MOV BYTE PTR [ESP + ESI +48 H + input_converted],BL
; input_converted的[I] = BL
INC ESI + +
ADD ESP,8
CMP ESI,10H
JL短build_data_buffer的

LEA ECX,[ESP +40 H + input_converted的的]
推ECX
MOV EDX,ECX
推EDX
致電sub_401250白盒包裝
ADD ESP,8
pop esi來
MOV EAX,10H
XOR ECX,ECX
彈出EBX

比較後位元組的緩衝區位元組

compare_buffers:
MOV EDX,[ESP + ECX +38 H + input_converted的的]
CMP EDX,DWORD PTR DS:aHack_lu2009Ctf [ECX]
“hack.lu-2009-CTF”
JNZ短bad_serial
SUB EAX,4
加ECX,4
CMP EAX,4
JNB短compare_buffers的的
[...]
RETN
-------------------------------------------------- -------------------------

字母數字字串,然後將其轉換位元組位元組使用後
sub_4012F0()函式在相應的明文(或密文)塊
加密操作。的功能sub_401250(),然後呼叫
把它作為一個引數。當函式返回時,緩衝區
相比“hack.lu-2009-CTF”字串(16位元組)。

如果是相同的,
序列是有效的(該函式返回1)。

讓我們來看看sub_401250()更詳細:

-------------------------------------------------- -------------------------
sub_401250 PROC附近; WrapperWhiteBox
[...]
MOV EAX,[ESP +14 H + arg_0]
推ESI
MOV ESI,[ESP +18 H + arg_4]
XOR ECX,ECX
加EAX,2
LEA ESP,[ESP +0]

permutation1:
第一步是換位(特殊排列)

MOVZX EDX,BYTE PTR [EAX-2]
MOV [ESP + ECX +18 H + var_14],DL
MOVZX EDX,BYTE PTR [EAX-1]
MOV [ESP + ECX +18 H + var_10],DL
MOVZX EDX,BYTE PTR [EAX]
MOV [ESP + ECX +18 H + var_C],DL
MOVZX EDX,BYTE PTR [EAX +1]
MOV [ESP + ECX +18 H + var_8],DL
INC ECX
加EAX,4
CMP ECX,4
JL短permutation1

第二步驟是呼叫的白盒

LEA EAX,[ESP +18 H + var_14]
推EAX
致電sub_401050呼叫白牌
[...]

permutation2:
第三步也是一個換位
位元組的位置恢復

MOVZX EDX,[ESP + ECX +14 H + var_14]
MOV [EAX-2],DL
MOVZX EDX,[ESP + ECX +14 H + var_10]
MOV [EAX-1],DL
MOVZX EDX,[ESP + ECX +14 H + var_C]
MOV [EAX],DL
MOVZX EDX,[ESP + ECX +14 H + var_8]
MOV [EAX +1],DL
INC ECX
加EAX,4
CMP ECX,4
JL短permutation2
[...]
RETN
-------------------------------------------------- -------------------------

乍一看,(sub_401250)是由三個要素組成的:

- 第一束緩衝區,這是操作上的指令
不超過位元組(4×4)矩陣轉置操作。

例如:

ABCDAEIM
EFGH成為BFJN
IJKLCGKO
MNOPDHLP

這是一個常見的步驟中製備的明文/密文塊
到所謂的“狀態”作為AES的4×4矩陣的操作。

- 該函式然後呼叫sub_401050(),它是由
如XOR,旋轉和替換的基本運算。

- 第二個換位。瞭解一件重要的事情
換位是,該函式是其本身的逆。前者
位元組的位置,因此恢復。

(sub_401050)WB。無論是AES或AES ^ -1功能和
key長度還有待確定。作為一個明文或序列
(,)密文加密使用的關鍵,我們要檢索。
由於輸出緩衝器相比,一個英語句子,似乎可以公平
假定該函式是一個AES ^ -1。

逆向工程sub_401050()
-----------------------------------

詳圖整個逆向工程步驟是既枯燥,
毫無意義的,因為它不需要特殊的技能。這的確漂亮
簡單。由此產生的偽C程式碼可以像這樣寫的:

無效sub_401050(字元* arg0中)
{
詮釋一輪,我;

/ / 9第一輪
(圓= 0; <9輪輪+ +)
{
/ /步驟1(圓形)
(= 0; <16; i + +)
arg0的[I] =(char)的0x408138 [I +(arg0的[I] +輪* 0X100)* 16];

/ /步驟2
sub_401020(為arg0);

/ /步驟3
(= 0; <4; i + +)
{
字元CL,DL,BL,var_1A;

CL = byte_414000 [arg0的[0] * 4];
CL ^ = byte_414400 [arg0的[4 +2] * 4];
CL ^ = byte_414800 [arg0的[8] * 4];
CL ^ = byte_414C00 [arg0的[12 +] * 4];

DL = byte_414000 [1 + arg0的[0 + I] * 4];
DL ^ = byte_414400 [1 + arg0的[4 +] * 4];
DL ^ = byte_414800 [1 + arg0的[+] * 4];
DL ^ = byte_414C00 [1 + arg0的[12 +] * 4];

BL = byte_414000 [2 + arg0的[+] * 4];
BL ^ = byte_414400 [2 + arg0的[4 +] * 4];
BL ^ = byte_414800 [2 + arg0的[+] * 4];
BL ^ = byte_414C00 [2 + arg0的[12 +] * 4];

var_1A = BL;

BL = byte_414000 [3 + arg0的[+] * 4];
BL ^ = byte_414400 [3 + arg0的[4 +] * 4];
BL ^ = byte_414800 [3 + arg0的[+] * 4];
BL ^ = byte_414C00 [3 + arg0的[12 +] * 4];

arg0的[0 +] = CL;
arg0的[4 +] = DL;
arg0的[8 +] = var_1A;
arg0的[12 +] = BL;
}
}

/ /步驟4
(= 0; <16; i + +)
arg0的[I] =(char)的0x411138 [I + arg0的[I] * 16]

/ /步驟5
sub_401020(為arg0);
返回;
}

看來,我們有一個10(9 + 1個特殊)回合這可能意味著
AES-128或AES-128的^ -1(因此一個16個位元組的key長度都是
相關)。

備註:一件非常重要的事情是,我們將盡力解決這個問題
使用幾種假設或假說。例如,有沒有明顯的
證明的回合數是10。它_seems_為10,但直到
功能(尤其是表)不分析,我們應該
始終牢記,我們的猜測可能是錯誤的,有些邪惡
伎倆可能已被用來愚弄我們。

現在我們有大畫面,讓我們來完善它有點。對於這一點,我們將
分析:

- 在地址0x408138(步驟1)的表和0x411138(步驟4)
- 輪獨立的功能sub_401020(步驟2,步驟-5)
- 步驟3和16個陣列byte_414x0y:
- X {0,4,9,C}
- y在{0,1,2,3}

下表是很容易分析。看看他們的短表明,
有一個每輪每個字元替換表。每個替代
似乎是一個“隨機”的雙射。此外,0x408138 + 16 * 256 * 9 =
0x411138(這是最後一輪的表的地址)。

的的功能sub_401020()是一個單純的包裝器功能sub_401000():

無效sub_401020(arg0中)
{
INT I;

(= 0; <4; i + +)
sub_401000(arg0中,4 * I,I);
}

/ / ARG4引數是無用的,但誰在乎呢?
“無效sub_401000(arg0的,ARG4 ARG8)
{
如果(ARG8!= 0)
{
(int)的TMP =((INT)為arg0 [4 * ARG8 <<(8 * ARG8))&0XFFFFFFFF;
(INT)arg0的[4 * ARG8] = TMP((int)的arg0的[4 * ARG8] >>(32 - (8 * ARG8),));
}
返回;
}
-------------------------------------------------- -------------------------

這顯然是ShiftRows(AES)初等函式。
例如:

59 49 90 3F 59 49 90 3F [<<< 0]
02 30 A7的8C成為A7 02 8C 30 [<<< 1]
A5 0F 07 22 07 22 0F A5 [<<< 2]
F9 A8 07 DD DD F9 A8 07 [<<< 3]

這裡的“<<<”是一個迴圈移位

移列()中使用了加密的功能而解密
功能使用其反。除非有陷阱來糊弄我們,這是一個
嚴重的暗示,我們以前的假設是錯誤的,WB是一個
AES,而不是一個AES ^ -1。

現在就3步驟讓我們開始看錶。他們都
雙射,但顯然既不是隨機的,也不獨特。讓我們來看看
例如上面的byte_414400表:

byte_414400:0 3 6 5 9終審法院...

(在此表中的元素,0x414400,0x414404,位於
0x41440C等,這是因為,你可以看到在C * 4
程式碼。這條規則也適用於其他15個表)。

如果你曾經研究/實施的AES那麼你必須知道它的
代數結構。MixColumns變換特別是一個操作
由一個特定的4x4矩陣乘以每列的狀態。該
這樣的數學物件係數是_not_整數而是
在GF(2 ^ 8)表示的元素是固定的一個特定的二進位制
的多項式。

現在,如果你不只是我在說什麼,讓我們有一個線索說,
所述乘法的AES係數的是不是一個簡單的整數
乘法。由於結石本身將是非常低效
大多數實現使用特殊的表,拿著預先計算的結果。
AES需要知道如何在GF(2 ^ 8)乘以01,02,和03。在
特別是byte_414400是一個表,用於計算= 3 *在這樣的欄位(
的表的索引,和b的值是儲存在此索引)。

現在,讓我們來看看在桌子上。在每一種情況下,很容易看到他們
拿著預先計算一個給定的係數乘:

byte_414000:0 2 4 6 8 ACE ... / /係數= 2
byte_414400:0 3 6 5 9終審法院... / /係數= 3
byte_414800:0 1 2 3 4 5 6 7 ... / /係數= 1
byte_414C00:0 1 2 3 4 5 6 7 ... / /係數= 1

byte_414001:0 1 2 3 4 5 6 7 ... / /係數= 1
byte_414401:0 2 4 6 8 ACE ... / /係數= 2
byte_414801:0 3 6 5 9終審法院... / /係數= 3
byte_414C01:0 1 2 3 4 5 6 7 ... / /係數= 1

byte_414002:0 1 2 3 4 5 6 7 ... / /係數= 1
byte_414402:0 1 2 3 4 5 6 7 ... / /係數= 1
byte_414802:0 2 4 6 8 ACE ... / /係數= 2
byte_414C02:0 3 6 5 9終審法院... / /係數= 3

byte_414003:0 3 6 5 9終審法院... / /係數= 3
byte_414403:0 1 2 3 4 5 6 7 ... / /係數= 1
byte_414803:0 1 2 3 4 5 6 7 ... / /係數= 1
byte_414C03:0 2 4 6 8 ACE ... / /係數= 2

其結果是,步驟3可以寫成:

[arg0的(0,I)[02 03 01 01 [arg0的(0,)
arg0的(4)= 01 02 03 01 x arg0的(4,)
arg0的(8)01 01 02 03 arg0的(8,我)
arg0的(C,I)] 03 01 01 02]為arg0(C,I)]

而這也正是的AES MixColumns變換!考慮到的一切
帳戶給這個,新版本sub_401250():

----------------------------第二版-------------------- -----------
無效sub_401050(字元* arg0中)
{
詮釋一輪,我;

/ / 9第一輪
(圓= 0; <9輪輪+ +)
{
/ /步驟1(圓形)
(= 0; <16; i + +)
arg0的[I] =(char)的0x408138 [I +(arg0的[I] +輪* 0X100)* 16];

/ /步驟2
移列(為arg0);

/ /步驟3
MixColumns變換(為arg0);
}

/ /最後一輪

/ /步驟4
(= 0; <16; i + +)
arg0的[I] =(char)的0x411138 [I + arg0的[I] * 16];

/ /步驟5
移列(為arg0);
返回;
}
----------------------------------------- -----------

這證實了假設,WB是一個AES,如AES ^ -1使用
倒置MixColumns變換的功能,這使得使用一組不同的
係數(矩陣反演)。正如你所看到的關鍵材料是不
明確的程式碼隱藏在步驟1中使用的表,不知何故。均田正常的WB.

步驟, 事情, 白盒,
相關問題答案