HACKING:美しき策謀  続き・基本まで

 

今メモリセグメントというところまで、なんども読み返している所ですが、

 

この章は本当に難しいです。 C言語で変数というものを使う時に

 

特になんも思わずに(変数を)使いますが、 

 

static変数とかグローバル変数が初期化されている場合はデータセグメント

 

そうじゃないやつは bssセグメント。

 

ヒープセグメントは最初に malloc()というメモリ割当関数を使って

 割り当てておく必要があると。

 

スタックセグメントは、複数のスタックフレームが保持されることになるため、

  ローカル変数は関数コンテキストごとに独立した物として扱われる。

 

うん。最初は本当に意味が分からん!! そもそもボクのボキャブラリーに

  「セグメント」って言葉すら無いし。

 

 ぐぐれば、

  セグメント[segment]:

    コンピューターで、大きなプログラムやデータを

     記憶装置に読み込むときに分割する単位。

 

らしいです。

 

だから、単位って言われても…。 

 

まぁ、このあとをどんどん見ていったら何を言いたいか分かります。

 

 

 

 int flag;

 char buffer[10];

これらは「スタックセグメント内」に確保されています。

 

該当関数のマシン命令はテキストセグメントに確保される。

push %rbp

mov %rsp,%rbp

sub $0x30,%rsp

 

 

はい。ここで『疑問』。

 

普通、

 

アセンブリの命令?って

 

mov ebp,esp      ==     ebp = esp

sub  esp,0x8         ==      esp-=0x8

 

ってことですよね!?

 

しかし、なぜ ボクのCPUちゃんは 逆なのだろう。

 

知らない。調べても出ない。おわり。

 

 

 

この本の最初は GCCにある gdbの説明をしてくれます。

結構使い方は簡単です。(なれたら)

 

hoge.c  っていうソースが合って、これをデバッグするんだったら

 

gcc -g hoge.c

ってして

 

コンパイル出来たら

 

gdb -q ./a.out

 

ってすれば、

 

(gdb)   って感じで、出来ます。

 

list  というコマンドで

 

ソースが見れます。

(gdb)list

#include<stdio.h>

 

int main(void){

 int hoge=10;

 printf("%d\n",hoge);

}

みたいな感じで。

 

で、

disas main

とすると、 main関数を逆アセンブリしてくれます。

本当は disassemble って書くのですが

そこは省略出来ると。

 

さっきのソースを dis ったら

 

f:id:reonreon3reon:20121014212505p:plain

って感じですかね?

 

f:id:reonreon3reon:20121014213411p:plain

 

これは最初に

break main

で main関数にbreakpointをかけて

そのあとに

 

run 

で実行しました。

 

nexti で次に移ります。

i r $rip

は info register $rip

の略です。レジスタ$ripの情報?

って感じですかね。

 

t 2進数

o  8進数で表示する

u 符号なし10進数

x 16

 

で何進数で表すかかけます。

 

 

まぁこんな感じで <main+8>は adress 0x100000f08 にある

ってことがわかりますよねぇ。

f:id:reonreon3reon:20121014214058p:plain

p  は print の略で、  変数の中身を見ます。

/x は16進数でって意味です。

ということは

p/x hoge    ==  変数hoge を 16進数で見る

って意味になります。

 

最初は  0x0  でしたが

nexti (次のステップ)

0xa  になりましたね?

はい。

 

この本曰く、  メモリ内容のチェックは、ハッカーにとって重要!!

   らしいです。

 

で、メモリ内容のチェックコマンドは:  examineです。

 

「x」でいいです。

 

 

例えば、    x/o 0x8045858  

と書けば、

8進数で 0x8045(ry

                   ⬆アドレス

のメモリを見る。ということになります。

 

はい。

これは一例です。

 

で、この本は結構 コマンドの説明が曖昧なので

 

http://www.madlabo.com/mad/edat/GDB/index.htm

 

を見たら良いと思います。

 

では。