読者です 読者をやめる 読者になる 読者になる

Pwn De Ring

初心者がPwnを勉強していくために使っている標準出力先です。

IA-32のレジスタの役割

基礎

今回は,PwnやReversingをするために必要そうなレジスタの知識をまとめてみる.逆アセンブル結果を見ていくうえでレジスタの知識は必要だと感じたからである.なお今回はx86アーキテクチャレジスタの話を見ていこうと思う.またタイトルにあるIA-32とはIntel PentiumAMD Athlon などの x86 系と総称されるプロセッサのことである.

レジスタ

レジスタ自身は特に,難しいことなくCPUが使用する変数だと考えれば良いと思う.x86アーキテクチャには,汎用レジスタと呼ばれるが8個ありEAX, EBX, ECX, EDX, ESI,EDI, EBP, ESPの合計8つである.

EAX

EAXは,算術計算と戻り値の保存に使われる.つまり,四則演算等があるときには,一種の変数として使われるので頻繁に見られるレジスタであると思う.また戻り値として,C言語

int ret10(){
    return 10;
}

などのコードがある時,この10という値はEAXに格納されるということだ.なおEAXのAは,Accumulatorの略である.

EBX

EBXは,特定の目的のために作られたレジスタとかではないので,レジスタがさらに必要にあるときになど使われる.EBXのBは,Baseの略である.

ECX

ECXは,ループ処理のカウンタとして使われる.C言語

for(int i = 0;i < 10; i++)

などのコードがあるときiと同じ役割をする.しかし逆アセンブル結果的にはインクリメントしていくわけではなく,事前にループ回数の値を格納しておき,デクリメントしていく処理になっている.またループカウンタが必要ないときは変数としても使用して良いとなっている.なお自明だがECXのCは,Countの略である.

EDX

EDXも,EAXと同様に変数の一種であるが戻り値の保存には使用されない.また,乗算や除算などでより複雑な演算が必要なときにも使われたりする.EDXのDは,Dataの略である.

ESI, EDI

この二つのレジスタは,EAXやEDXが主に演算処理に使われるのに対して,ESIやEDIは文字列やデータの繰り返し処理やメモリ内容の移動に使われる.もっと格式ばっか説明すると,ESIはスタートアドレスのインデックス,EDIはディストネーションアドレスのインデックスとして使われる.C言語のmemcpy関数を用いて説明すると,

memcpy(void* dest, void* src, size_t count)

のdestがEDI, srcがESIにあたる.また処理する値が大きくない限りESIとEDIは使われない.ESIのSIは,Start Index,EDIのDIは,Destinaton Indexの略である.

EBP, ESP

これらの二つのレジスタは,スタックの操作時に使われる.この二つはまた別の機会に詳しくまとめたいと思う.大雑把にいうなればESPはスタックのいちばん上のアドレスを格納し, EBPはスタックの底のアドレスを格納する.ESPのSPは,Stack Pointer, EBPのBPは,Base Pointerの略である.

その他の知識

ソースコード中にAXやALなどが見られることがある.これはレジスタをさらに細かい視点で見たときに表れるものである.以下の図を参照していただきたい.

EAXは32bitレジスタであり,AXはその下位16bitを表す.さらにAHとALはAX中の上位8bitと下位8bitを表す.AXのXはHexの略で,AHのHはHighの略で,ALのLはLowの略である.