Ⅰ. 概要
前回の投稿に続き CPUと Memory欠落している情報をすべて入力します PEView プログラムを使用する PE 構造を見てみましょう。 Ollydbg プログラムを使用して、コンパイルされたプロセスの流れを調べたり操作したりできます。
II. CPUおよび MEMORY
CPU詳しい説明は、前回の投稿を参照してください。 CPUこれはデュアルコア、ヘキサコアなどに分けられ、それぞれのコアは個別のものです。 Registerなぜならそれは現代的だからです マルチタスク処理 (Multi-Tasking)状況はより簡単になりました。ここで注意すべきことは、複数のプロセッサを使用することで、 CPUデュアルコア、ヘキサコアなどは異なる概念です。プロセッサ CPU 同じハードウェアデバイスを指しているため、これはマルチプロセッサです。 CPU2つ以上のコアがあり、これらのコアはCPUの一部です。 マルチプロセッサ2人以上でラーメン CPUそれぞれ CPUそれはヘキサコアと同様に複数のコアを持つことができます。
メモリ構造をもう一度まとめてみましょう。

これは次のように機能します。カーネルはハードウェアからシグナルを送受信します。 シェル (Shell)ユーザーのコマンドが受信されたとき、対応するデバイスを操作する役割を果たします。そのため、すべてのオペレーティングシステムはシェルを介してカーネルにコマンドを送信し、コンピュータのスピーカー、モニター、LANカードなどのさまざまなハードウェアコンポーネントを操作します。 Linuxで
[SK Shillers SeSAC Sungdong 第1世代] 仮想マシン、Linux、ubuntu
内容をもう少し詳しくまとめましたので、参考にしてみてください。セキュリティと安全性の観点から、ハードウェアへの直接アクセスは許可されていません。つまり、ドライバへのアクセスはカーネルを介して行われ、カーネルへのアクセスにはシェルが必要です。シェルとは、マシン言語を知らない私たちのようなユーザーがカーネルとハードウェアにコマンドを出すことを可能にする一種のラッパーです。このシェル 親子関係継承があります。これは、Web 開発をしたことがある人なら簡単に考えることができます。メインシェルがあり、このシェルはさまざまなプログラムシェルを作成します。 主プロセスが 子プロセスそれは物事を作り、動かすことです。 Windowsメインシェルでは、「
'explorer.exe'ブラウザを開いたり、Word、PowerPointなどを実行したりすると、メインシェルが動作します。新しく作成されたシェルは子プロセスとなり、その中でメインスレッドと子スレッドがそれぞれプログラムの機能を実行します。 メインスレッドそれは全プロセスを制御します 子スレッドこれらはそれぞれ特定の機能を実行します。
※ Windows プロセス管理モジュールのプログラムを作成する際に便利な Python モジュールがあります。Python の wmi モジュールを試してみるのも楽しいので、ぜひお試しください。
カーネルについての長い議論だったが、メモリに戻ろう。Memory)それは下から始まります 'スタック (Stack) エリア - HIPHeap) ゾーン - データData) ドメイン - コードCode) 地域' これは順序に従っていると考えることができます。実際のところ、データ領域とコード領域は順序に関係がないため、上の画像ではデータ領域が上に配置されています。 グローバル変数、静的変数などが格納されていますコード領域は文字通り プロセスの実行に関連するコードが格納されていますスタック領域とヒープ領域は重要な順序で配置されています。 メモリアドレスは下が高いアドレス、上が低いアドレスですスタック領域はヒープ領域の下にあります。 高アドレスから低アドレスへ保存代わりに、ヒープ領域が 低アドレスから高アドレスへ 保存スタック領域は ローカル変数またはパラメータが格納されますそして、ヒープ領域はいつでも参照可能です 動的に割り当てられ、インスタンスですが保存されます。
Ⅲ. PE(Portable Executable)
以前の投稿で簡単に触れましたが、 Windows実行可能なプログラム(プロセス) PE このように構成されています。 構造構造が私たちが知っているものであることは良いことです。 リストJSONを使用する代わりに、それをバイトに分解し、コード、データ、およびプロセスのその他の要素を示します。この構造をどのように表示するかは、特定のコンテキストによって異なります。 Headerそれは、それが zip ファイルか PE ファイルかによって異なります。 MFT, VBR など、すべてが異なり、多様です Header 構造類似点がある。 Headerこれはバイト単位で分けられ、どのバイトがどの機能や役割を果たしているのか、実際のデータはどのようなものなのかなど、詳細に分類されています。

はすでに簡単に説明した部分ですが、PE構造を表示するプログラムを使うことで、Header の種類や分類を調べたり、実際のアドレス値を知ることができます。固定のHeader 値もありますが、動的なHeader 値もありますので、分析する際に各バイトが何を表しているのかを知ることが重要です。プロセスの流れを操作する簡単な演習を試してみたいと思います。
Zero Flag 操作
このサンプルプログラムでは、実際の実行メインコードはアドレス 401000 から始まります。 BreakPointそこに置いておきなさい。 F9 ショートカット (Break Pointアドレス 401000 に移動します(最大 1 回実行)。 Zero Flag比較すると、等しい場合は 1 を、等しくない場合は 0 を返します。

その赤い部分を見ると、それがアセンブラです。Assembly)の CMP(比較コマンド)を通じて JNZ(比較演算の結果が等しい値でない場合は、以下の処理はスキップされます。) F7, F8 ショートカットを使用してプログラムを実行する場合

このように 1 に設定すると、比較演算子は結果値が等しいと認識し、コードはスキップせずに続行します。
JNZ命令の変更
では、Zero Flagを変更する代わりに、JNZコマンドをJEとJZに変更することはできませんか(比較演算の結果が等しい場合は、次の実行コードをスキップします)。もちろん、できます。

このように、プロセスフローがスキップされず、スムーズに渡されることがわかります。コマンドを変更するには、図のように、JE と JZ コマンドは十六進数で 75 です。この値を 74 に変更するか、JE と JZ というコマンド自体を入力することができます。
プロセスロジックアドレスの変更
上の写真をよく見ると、 Sample_0 サンプルの後ろに 00401079 が表示されています。前面のサンプルはプログラム名で、後ろのアドレスはコードアドレスです。 JNZ コマンドを実行すると、どのコードが実行されるかを示しています。このコードアドレスを最初の 401000 に変更すると、どうなるでしょうか。


上の図のように、401000から401048が無限に繰り返されます。
* 401000 や 401048 などのアドレスは、技術的には Offset(オフセット) と呼ばれ、メモリ内の特定のアドレスからの相対アドレスを表します。これらの Offset を頻繁に使用するため、これらについて知っておくと良いでしょう。
HxDを通じて比較操作データの変更
開発者が記述した比較演算の値は、実際にはHxDを通じてによって変更されます。

の赤い部分は実際の比較値であり、上の GetLocalTime は現在の時刻を取得しています。上の PE 構造から、Base Code の開始点が 1000 であることがわかります。また上の図から、コマンドが含まれる 16進数 7D5 がアドレス 401040 にあることがわかります。前面の 400000 はプロセスのメモリ開始点であり、実際のコードは Base Code に基づいているため、1000 から始まるため、HxDを通じて の 1040 番目のポイントに行くと、 が表示されます。

ご覧いただけます。次に、この値を現在の年に変更し、残りの 0 と 20 を現在の月と日付に変更します。

OllyDbg を再度実行すると、 というメッセージが表示されます。

ご覧の通り、値が変更され、CMP比較操作に成功しました。

※ このプロセスは、メモリに割り当てられたアドレス値を参照して、変数、関数、またはデータを使用して動作します。スタック領域は高いアドレスから始まり、低いアドレスに向かって構築されます。 LIFO(Last in First out) 構造です。したがって、コードの開始アドレスを見ると、 SUB コマンドを使用して ESP114を引いています ESPスタック領域の下部(最後のアドレス、混乱するかもしれませんが、上部が下部です)から 114 を引きます。 これは上から下への順序で行われ、高いアドレスから低いアドレスへ移動するため、機能を実行するために必要なメモリ量(114)を減らします。
レビュー
新しく始まったアプリケーションの理解と活用は、先週の難しいネットワークよりもさらに困難でした…🤑フォレンジックやリバースは、最低限の経験がないと簡単に取り組めないようなものだったので、専攻科以外の学生としては、学習の大きな障害になっていましたが、なんとか今週を乗り切れたように思います…🤣もちろん、私が理解したかどうかと聞かれたら、それは別の話ですが、今後もう少し記事を投稿して、学んだことを振り返り、まとめてみようと思います。
ログイン