上海ネットワークセキュリティコンテスト-writeup-REVERSE-サタンで2019-大学生

サタン

彼らはRJJ夕方に戻ってきて、歌うこと以上引っ張ったとき、ちょうど質問で、このチャネル逆、午後のうち高速転送を見て競争がこの質問のうち、バグ数のスクリプトを調整し、オーバーです。

64ビットのELFに従う、IDAが開いスロー、C ++ / STLを使用して、メイン関数内のメインロジックは、文字列操作の多くを調製しました。

最初の数行の動作を見て、最初の行183は、文字列を初期化します。184 OK「演算子は>>」C ++は、入力ストリームであり、「unk_6072A0」CINは、この行は、ユーザ入力文字列を読み取るために、相互参照することによって見出すことができます。ユーザーの入力文字列から最初の185行がsub_4020DFに新しい文字列を行うテスト、テストが失敗した場合、出力は「エラー」の後に、別の文字列を構築しました。

「 - 」セパレータ我々はsub_4020DF機能入力形式、5つのセクションから構成され第1のフラグ{}パッケージから参照します。試料は、動的デバッグフラグを容易にするように構成することができます。

フラグ{ABCD1234-ABCD1234-ABCD-ABCDEFGHIJKL}

フラグの最初の文字最初の段落、シャッフルを決定するための方法の大きさに応じて大きなスイッチした後、入力の5個は、シャッフルを行います。たとえば、以下の図では、最初の文字「0」の最初のセクションでは、配列は、01433をスクランブルされます。この変換は一度だけ、何の困難注意深く見る必要はありませんがありません。

後に、この問題の最も重要な領域は、暗号化、来ました。シャッフル後のフラグの32ビット・コードは、二つ、すなわち、暗号化に分割されています。sub_401AA3は、暗号化機能です。

暗号化キーは、機能自体のテキストセグメントによって生成され、スタート+ 0x3D22まで開始位置、すべての内容に応じた機能を起動sub_4025A2、V96は整数、256ビットのV177のその後整数キー構成を生成します。明らかに、テキストコンテンツセグメントは、キーが固定され、変更されません。(あなたが思うならそれは,,,ピットになります)

唯一の暗号化アルゴリズムを残して、キーを取得します。私は暗号化して何が見つからないために使用されるボックスの暗号化アルゴリズムをチェックします。AESの全体の暗号化プロセスに類似SP構造。各ラウンドキーと、非線形変換およびカートリッジ変位トランスデューサを通過する必要があります。知られているアルゴリズムを見つけることができない、私たちは逆に頭を取ることができます。AESの復号処理することを思い出して、ラウンド鍵は、排他的OR、Sボックス変換の順序を交換し、変位トランスデューサはアルゴリズムを記述するために必要とされる逆に適用しました。キーが固定されているためと、gdbのうち、すべてのラウンド鍵をから直接控除することができ、逆に多くの作業を必要としないようです。

  1. Round関数

    平文アルゴリズムは、4つの32ビット整数の存在下で各ブロックに分割されています。31フロント、33の合計、ラウンド鍵の各ペアは、カートリッジを混合平文、線形変換および非線形を適用しました。最終的な32及び33は、わずかに異なっていても、同じ機能が使用されています。

  2. 非線形変換カセット

    ここでは、どのようにこの変換を理解する必要があります。4ビット整数に組み合わさ逆鉄ヘッド、平文から4つのブロックのそれぞれからのコードの後、次いで、ボックス内の4個の元の置換最後の後に一緒にスプライス置換値を代入を行います平文。

    リバース、全体の流れは同じですが、それを行うには逆代替ボックスを使用します。IDAは直接出てうまく控除で話題と人々は、箱の裏に保存されているより心優しい、非線形逆ボックスです。最後に、パイソンを使用して逆変換を記述します。

  3. 線形混合

    ここで巡回シフトとXORを行います。最初に私は、問題、または直接逆を解決していない、Z3と怠惰になりたかったです。

    第一及び第三のチャンクが修正されていない後我々は、ライン13及び14、第1のブロック0の第3のブロックのXOR及び第二ブロックを生成することのみ0,2巡回シフトブロックを見ることができます。それは、とき逆に、我々は、削減線13と14、排他的論理和0,2アップブロックを指示することができますされ、それは、元の排他的ORを復元0,2をブロックすることができます。同様に第一および第3のブロックを復元することができます。だから、このコードは直接逆のアルゴリズムを記述することができます。

いくつかの問題が解決された、ダイナミックなデバッグがちょうどラウンド鍵の外に摘み取られ、その後、ライン上で検証を行います。ここでピットに会いました。あなたはGDBデバッグの原則について知っておく必要があります。

ターゲット命令、実際の実行トラップ命令、GDBでコントローラへの制御を実行するときに次のブレークポイントの時間に実装GDB内部使用のptraceは、トラップのターゲット命令に置き換えられます。そのGDBのブレークポイントの値は、暗号鍵生成機能が影響を受けたプログラムのテキストセグメントを変更します。gdbのラウンド鍵を頻繁に変更し、疑わしいケース矛盾してこの質問は、曲を見つけるでしょう。

これは、把握が簡単で、直接、その後、実際のラウンド鍵を取得することができ、デバッグgdbを、関数sub_4025A2の戻り値を計算するスクリプトを記述します。

最後に、復号化を行うshuflleフラグを得たもの復元します。

フラグ{96ae4d91-7595-48da-8a40-62dd06baf7a4}

おすすめ

転載: www.cnblogs.com/helica/p/11787481.html