GRADUATION
アセンブリを、読めるようになりました。
レジスタ・呼出規約・スタックフレーム・条件分岐とループ。x86-64アセンブリを、自分でコンパイルしたコードとgdb/objdumpの実物で読み解きました。rev(リバースエンジニアリング)の核になる読解力を手にしました。
おつかれさまでした。
持ち帰るもの
- レジスタは、CPUの手元にある変数rax・rbx・rdi・rsiなど。関数の引数は、System V AMD64呼出規約でrdi・rsi・rdx…の順にレジスタへ渡されます。
- スタックフレームは、関数呼び出しの記録push rbp / mov rbp,rspで始まり、pop rbp / retで終わる。戻り先アドレスとローカル変数が、このフレームの中に積まれます。
- 分岐とループは、cmpとjの組み合わせcmpで比較し、je/jle/jmpなどの条件・無条件ジャンプで飛び先を変える。ソースのif/forは、この組み合わせに機械的に変換されます。
次にやるといいこと
- このコースで身につけた読み方は、CTFのrev(リバース)・pwn(バイナリ攻略)カテゴリでそのまま主力になります。
- sec-cのバッファオーバーフローを、今度はアセンブリのレベルで(戻り先アドレスがどこに積まれ、どう壊れるか)読み返すと、理解がもう一段深まります。