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ちゃんは 逆なのだろう。
知らない。調べても出ない。おわり。
結構使い方は簡単です。(なれたら)
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 ったら
って感じですかね?
これは最初に
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 にある
ってことがわかりますよねぇ。
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
を見たら良いと思います。
では。