正確には読み終わってないんだけど、途中で放棄した(爆。
Amazonのレビューでも指摘されているが、誤植が多い上に索引が無い。
WindowsやLinuxでNASM/gas/gdbを使ったアセンブラプログラミングを始める良いきっかけ/手引きになる事は確かだが、少なくともC言語のポインタを理解していないと説明を追うのはキツイと思う。
放棄したのは、Linux上でのアセンブラの後半、バッファオーバーフローのexploits辺りでどうしてもshellcodeへの組み込みASMでのJMPでSegmentation faultが発生してしまい、今の自分では先に進めなくなった為。さらに後半にはWindows上でのアセンブラプログラミングの話も出てくるのだけれど、正直お腹一杯で食べきれなくなった。
他気になった点:
と言う感じです。
他にも、いきなり
.globl main main: ...
と出てきて、gccでコンパイルしてどうのこうのという進め方ですが・・・これ、絶対「え、".globl main"って何なの?なんでそれで、main以降が実行されるの?」って疑問に思いません?この辺りも、".globl main"はリンカから見えるシンボルで、こうする事でリンカがCの標準ライブラリが要求しているmain関数の呼び出しを解決できる、という予備知識がないとキツイと思います。まあ「おまじない」って言ってしまえばそうなんでしょうが、そもそも「おまじない」で済ませていた部分が見えてくるからこそアセンブラ言語に興味があるのであって・・・。
自分の場合は西田亙の「GNU DEVELOPMENT TOOLS」で一応、glibcを使わないhelloworldとかやっていたので、C言語とリンカとアセンブラの境目の予備知識があったので何とか流せました。
その辺を押さえておけば、逆にWindowsやLinux上でのアセンブラプログラミングを広く浅く取り扱っている有意義な書籍として読めると思います。
というかexploits周りのコードで
L2: call L1 .string "/bin/sh"
っていきなり出てきて、さらにL1の方でいきなり
L1: popl %esi
と何の説明もなく書かれていたのにはかなり悩みました・・・。これ、L2側がcallなので、L1に来た時にはスタックの先頭にはL2のcallの次の命令、つまり"/bin/sh"の先頭アドレスが入ってる(".string"でそのまま"/bin/sh"が展開されている)。なので、それをpopしてESIレジスタにセットしてるんだねー、ということが分かったのはGDBで色々ダンプしてからの事でした・・・。
アセンブラのコードにコメントが入ってないのがキツイ。
文句ばっかりですみません・・・。