DOSでやると分かりやすそうだったんで、VMで昔のWindowsを立ち上げてちょこっとやってみました。DS:0000=CD簡単に補足すると、DOS窓を立ち上げてDEBUGと打つと16BITモードとなり、アセンブリが入力できるようになるらしい。COMは0100オクテットかららしいので、まずはA0100を入れてます。すると任意のアドレスが表示されて、入力モード?となります。左側の2C98は番地で右側がオクテットです。0103でそのアドレス間を実行しなさいという事になるようです。画面の下を注目してみると、これはレジスタたちが表示されてるよと。どのレジストに何が入っているのか分かるので、こうしてみると非常に分かりやすそうです。見たときにこの表示があったので、まずはDOSでやることを選択しました。名前ってのはそれほど重要ではないと思うけど、重要だとも思うので、各レジスタの説明についても書いてかな。(だいたいWikipediaから引用)レジスタは大きく分けて、汎用レジスタ、セグメントレジスタ、フラグ、命令ポインタという4個に分類される。1行目は汎用レジスタになっとるのよ。:アキュムレータレジスタ。算術演算操作の結果が格納される。セグメントモードでのDS(後述)に格納されたデータを指し示すために使用される。シフトローテート命令とループ命令に使用される。算術演算操作とI/O操作に使用される。:スタックポインターレジスタ。スタックのトップを指し示すポインタ。:スタックベースポインタレジスタ。ストリーム操作でのソースへのポインタとして使用される。:デスティネーションレジスタ。ストリーム操作でのデスティネーションへのポインタとして使用される。排他的なんやらとかは問題ない。原理は分かってる(はず)だし。DOS窓だと、レジスタの状態が分かりやすいのでなかなかいいね。ボトルネックは割り込みだ。システムコールとレジスタシステムコールの話になります。マニュアルをちゃんと見てなかったたけけんが悪いんだけど、レジスタの解釈を間違えてました。$0x80という事らしいね。入門サイトを読んでても(ちゃんと読んでなかったのかもしれないが・・)割り込みする時は汎用レジスタに大きな役割が出来るってことが書いてないのでWriteが4、Exitが1とかはレジスタの事は考えないで全部コールしてるだけと思い込んでた。この思い込みが混乱の元凶だったようだ。↑のソースだと、eaxが4なので、Writeをコール。あとのebx、ecx、edxは引数だったらしい。1行目でなぜExitしてるのか疑問に思わなかったのも相当痛いのだが。15少なくとも参考サイトにはさらっと書いてあったので、ちゃんと読んでなかったみたいだが、読んでなかったというよりも、やっぱりExitをコールしてると思い込んでたのがいけなかった。たけけんはこの事をフォントを大にして言いたいのでMAXで書いた。これで疑問に思ってたことは90%は解決したので、次回はPUSHとPOP、スタックとかをやろうと思います。難問シェルコードに再挑戦リターンアドレスから関数を実行してみるたらこ鱈の子、この子どこの子TCPEchoサーバーから超簡易TCPwebサーバーを作ってみた。Takekenインターネット利用者のITリテラシーを向上しようという目的で生まれた、2次元キャラのたけけんです。サーバー弄りからプログラミングまで幅広く書いています。難問このサイトはさくらのクラウドで動いています。8にインストールしました。Comments【Ubuntu】UbuntuServerをコンソールからデスクトップ画面で操作する。さくらの新スタンダードプランのサーバーにRailsを入れて、Redmineをインストールした。