2016-02-09 13 views
5

最近、プログラムがいくつかのデータをどのように解読しているかを特定するために、アセンブリ全体を巡って自分の道を巡ってきました。これまでのところ、私はIVがどのように抽出され、IVは16バイトであり、復号化方法は暗号ブロック連鎖を使用するのかを特定した。その結果、私は使用されている暗号化方式がAES-128-CBCであると信じています。難読化されたAES解読アセンブリ

次の手順では、解読に使用されているキーを特定しようとしていますが、個々のブロック暗号化暗号化のアセンブリが約2.5MBのサイズであるという問題があります。しかし、私が観察したことは、それは非常によく似た形の全てであるということです、例えば、スニペット:

を:

add.w  r0, r12, #0x13 
str.w  r0, [lr, #0x44] 
tst.w  r0, #0xff 
mov  r0, r12 
it   eq 
eoreq  r0, r12, #0x75 

add.w  r1, r12, #0x5d 
str.w  r1, [sp, #0xf00] 
tst.w  r1, #0xff 
it   eq 
addeq  r0, #0x3b 

r12は、次のように引数(r0)に渡されたからロードされ、暗号化されたデータが含まれていますサブルーチンで

mov  r4, r0 
add.w  lr, sp, #0x1000 
ldrb.w  r12, [r4] 

アセンブリの全ては、オフセット一部は、暗号化されたデータに付加された格納され、0xffに対して試験され、標本形式である(常に0xff)といくつかのOPERその結果、XOR、OR、ADDまたはMOVのいずれかが別のレジスタ(例ではr0)に影響します。

これはAES-128に見えますが、鍵を隠すために意図的に難読化されていることに同意しますか?そうであれば、どのように難読化されており、鍵を見つけることが可能でしょうか?

ブロック暗号の暗号化サブルーチンのための完全なASMファイルへの追加情報

Here's a link

this is a link CBCを使用し、メインの質問で参照されている上記のサブルーチンを呼び出すサブルーチンに。

+1

私は[タグ:リバースエンジニアリング]は[タグ:セキュリティ]以上を適用しますが、これを元に戻してください。しかし、実際にはarchitectureタグが必要です。 PS:私は通常downvoteに速いですが、今回は私ではありませんでした;) – Jester

+0

@Jester私には良い音です。あなたはあなたの名前をクリアしました:Pそれが話題から外れている/広いので、私はいつもそれをリバースエンジニアリングまたはセキュリティSEに移すことができました。 – Joshua

+0

私はこのことがCBC-AESとどのように結論づけられたのか理解できません。しかし、AESの全ポイントは、方法がわかっていても鍵が壊れないということです。 AESは難読化を必要としません。 –

答えて

0

AESが使用されているかどうかを確認するのは非常に簡単です。
AES/Rijndaelは、魔法の定数の大きなテーブルを使用しています。
これらのマジックナンバーがなければ、AESは動作しません。
参照実装からこれらの数値を簡単に収集できます。必要に応じてbig/littleエンディアンを補うことを忘れないでください(私は常に両方のバリエーションをチェックします)。

また、RijndaelはXOR命令の非常に重いユーザであり、orを使用せず、加算を使用しません。

AESを確認/除外するには、魔法の数字を探します。ルーチンは、メモリ(ディスク)のどこかのテーブルから数値を読み取る必要があります。アセンブリ内の数値をデコードすることはできません。なぜなら、プレーンテキスト/暗号文を使用して配列内の数値を検索し、xorデータでそれを検索するからです。

数値をレジスタに保持するときは、そのようにすることはできません。

アセンブリから見ると、AESのようには見えません。

テストAES AESのためのコードレビューを使用してのみ
おそらく最高のテストは、コードだけを見て、init_keyのリファレンス実装に対してそれを比較することです。AESは特定のコードを使用して秘密鍵を初期化し、アルゴリズムで使用できるようにします。

あなたが現在AESリファレンスソースコードを見つけることができます:https://tls.mbed.org/aes-source-code
(またはちょうど約どこでもインターネット上のあなたがCに別の言語を好む場合)。

関連する問題