Skip to content

Instantly share code, notes, and snippets.

@msymt
Last active January 12, 2023 04:48
Show Gist options
  • Save msymt/4d708d079a66aa45a3e26a1f7587c172 to your computer and use it in GitHub Desktop.
Save msymt/4d708d079a66aa45a3e26a1f7587c172 to your computer and use it in GitHub Desktop.
スタックのアラインメント

x86-64モード用の呼び出し規約では、浮動小数点数の受け渡しはxMM0などのレジスタを用います. メモリとxMM0系のレジスタ間で値を転送する命令(MOVAPSMOVAPDなど)は、メモリ上の値が16バイト境界に配置されていることを要求します.
コンパイラは、関数呼び出し時のスタックポインタが16バイト整列されていることを前提に,MOVAPSMOVAPD命令を発行します. また、他の関数を呼び出すときには必ずスタックポインタが16バイト整列するように調整する責任があります.
(http://uchan.hateblo.jp/entry/2018/02/16/232029)

CTFにおいては

0x10の境界にないとき、system等がmovapsが原因で失敗する為、retで揃える事がある.

なぜ0x10

0x10の倍数のアドレスにrspがある前提で命令があり, 0x8刻みでスタックはずれていく為([1])、奇数回数のret0x10に揃ってエラーが吐かなくなる.

参考

[1]x86-64 モードのプログラミングではスタックのアライメントに気を付けよう http://uchan.hateblo.jp/entry/2018/02/16/232029

[2] https://twitter.com/Nperair/status/1215939993299869699
[3] https://twitter.com/Nperair/status/1215941227700318208

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment