正確には読み終わってないんだけど、途中で放棄した(爆。 #amazon||> ||< Amazonのレビューでも指摘されているが、誤植が多い上に索引が無い。 WindowsやLinuxでNASM/gas/gdbを使ったアセンブラプログラミングを始める良いきっかけ/手引きになる事は確かだが、少なくともC言語のポインタを理解していないと説明を追うのはキツイと思う。 放棄したのは、Linux上でのアセンブラの後半、バッファオーバーフローのexploits辺りでどうしてもshellcodeへの組み込みASMでのJMPでSegmentation faultが発生してしまい、今の自分では先に進めなくなった為。さらに後半にはWindows上でのアセンブラプログラミングの話も出てくるのだけれど、正直お腹一杯で食べきれなくなった。 他気になった点: - C言語とアセンブラの境界部分が沢山出てくる。 -- →「C言語の文法を把握している」だけじゃ駄目で、オブジェクトファイルやリンカ等のレベルまで把握していないと振り回される。 -- →C言語のポインタとアセンブラ上でのメモリアドレスがどう関連するのかの説明が少ない。逆に言えばC言語のポインタをきっちり理解していないと、サンプルコードが理解できないかも知れない。 - 誤植が多い。サポートページに載っていない箇所もある。exploitsのshellcodeなど、"\x.."がなぜか"vx..."になってたりする箇所があった。 - スタックの説明が冗長 -- 230p(3章32ビットプログラミング, 数値カウントプログラム)でESPやEBPの挙動と絡めて丁寧に解説されているが、その後294p(3章32ビットプログラミング, スタック)でさらに簡略化されてもう一度説明がされている。 - "LEA"の説明が無い。 -- 読み間違いだったら御免なさい。でも、巻末付録のアセンブラ命令の一覧にも"leal"は出てこない。その割にはbbs.s辺りでいきなり使われてたりする。 と言う感じです。 他にも、いきなり #pre||> .globl main main: ... ||< と出てきて、gccでコンパイルしてどうのこうのという進め方ですが・・・これ、絶対「え、".globl main"って何なの?なんでそれで、main以降が実行されるの?」って疑問に思いません?この辺りも、".globl main"はリンカから見えるシンボルで、こうする事でリンカがCの標準ライブラリが要求しているmain関数の呼び出しを解決できる、という予備知識がないとキツイと思います。まあ「おまじない」って言ってしまえばそうなんでしょうが、そもそも「おまじない」で済ませていた部分が見えてくるからこそアセンブラ言語に興味があるのであって・・・。 自分の場合は西田亙の「GNU DEVELOPMENT TOOLS」で一応、glibcを使わないhelloworldとかやっていたので、C言語とリンカとアセンブラの境目の予備知識があったので何とか流せました。 その辺を押さえておけば、逆にWindowsやLinux上でのアセンブラプログラミングを広く浅く取り扱っている有意義な書籍として読めると思います。 というかexploits周りのコードで #pre||> L2: call L1 .string "/bin/sh" ||< っていきなり出てきて、さらにL1の方でいきなり #pre||> L1: popl %esi ||< と何の説明もなく書かれていたのにはかなり悩みました・・・。これ、L2側がcallなので、L1に来た時にはスタックの先頭にはL2のcallの次の命令、つまり"/bin/sh"の先頭アドレスが入ってる(".string"でそのまま"/bin/sh"が展開されている)。なので、それをpopしてESIレジスタにセットしてるんだねー、ということが分かったのはGDBで色々ダンプしてからの事でした・・・。 アセンブラのコードにコメントが入ってないのがキツイ。 文句ばっかりですみません・・・。