Linux内核分析:実験一

3969 ワード

劉畅のオリジナル作品の転載は出所の《Linux内核分析》MOOC課程を明記してください.http://mooc.study.163.com/course/USTC-1000029000
コンピュータシステムの構造とプログラムの運行過程
近代的なコンピュータは多く採用されているのが「馮.No依曼」のシステム構造で、その核心思想はプログラム記憶、命令とデータを区別せずに一つのメモリに置くことです.命令ポインタレジスタには、次の命令を実行するアドレスが格納されています.このレジスタは32ビットシステムではeigp、64ビットシステムではripと呼ばれています.
命令はバイナリで符号化されていて、覚えにくいです.より効果的なプログラミングのために、人々はアセンブリ言語を発明しました.バイナリ命令に対する簡単なマッピングです.普段私たちが書いているプログラムは二進法にコンパイルしなければいけません.機械に実行されます.私たちは反アセンブリCプログラムを通じてプログラムの実行過程を知ることができます.
アセンブラCプログラム
実験1のソースコードはとてもシンプルで、以下の通りです.
int g( int x )
{
  return x + 3;
}

int f( int x )
{
  return g(x);
}

int main(void)
{
  return f(8) + 1;
}
私たちは次のコマンドを使用できます.
gcc -S -o main.S main.c -m32
このCプログラムのコードを取得しました.
-S:コンパイルのみ-m 32を表します.32ビットを生成する命令形式を表します.
私たちはコンパイルされたCプログラムを得ると、LinuxでObjdumpツールを使ってこのプログラムの逆アセンブリ命令を得ることができます.
アセンブリ命令分析
関数の開始
各関数の開始部分を観察できます.この2つの命令があります.
pushl %ebp
movl %esp, %ebp
subl $4, %esp
第一の命令は古いebpを保存して倉庫に置くことです.これは関数が終了すると、この関数を呼び出す前のスタック空間に回復するためです.
第二のコマンドは、現在のスタックトップポインタの位置をebpに保存します.関数のパラメータと関数内部の局所変数は、ebpをベースとしてアドレス指定されています.
第三条命令はスタック空間を開拓し、
関数部分
実験で与えられたソースコードは簡単なので、アセンブリコマンドが少ないです.f関数の内部に三つの命令があります.
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
第一の命令は、スタックが下方向に成長しているため、8(%ebp)は、スタックの呼び出し慣例に従って、f関数の最初のパラメータであるxを表している.
第二のコマンドは、eaxレジスタを媒介として、その値を%espに置くのも関数gのパラメータです.
第三条コマンドは、g関数の呼び出しを表します.
スタックの使用慣例によれば、funに4つのパラメータがあれば、以下のようになります.
void fun( int a, int b, int c, int d );
fun関数を呼び出すと、まず16バイトの空間を開きます.
subl $0x10, %esp
a,b,c,dの値をそれぞれこの空間に入れて、それらをスタックに押し込む.
pushl 0x0c(%esp)  ;    d   
pushl 0x08(%esp)  ;    c   
pushl 0x04(%esp)  ;    b   
pushl (%esp)      ;    a   
関数のパラメータは最後のパラメータから始まって、最初のパラメータは(%esp)において、最後から二番目のパラメータは4(%esp)において…
関数の終了
逆アセンブリ命令から、関数の終了部分の命令は以下の通りであることが分かります.
leave
ret
この中でleaveはパッケージ後の命令ですが、実は2つのコマンドで構成されています.
movl %ebp, %esp
popl %ebp
この2つの言葉は、関数fを呼び出すために、スタック内に空間を開き、ebp、espなどを修正したものです.
最後にretコマンドは、関数fを実行した後、プログラムが実行されるように、関数の戻りアドレスをempにセットします.
締め括りをつける
Cプログラムの反アセンブリコードを分析することによって、プログラムは計算内部の実行過程に直感的な認識を持ち、関数呼び出しにおいて、スタックは重要な役割を果たし、多くのコンピュータセキュリティ上の脆弱性は直接間接的にスタックを利用している.
劉畅のオリジナル作品の転載は出所の《Linux内核分析》MOOC課程を明記してください.http://mooc.study.163.com/course/USTC-1000029000