memologue - 最近のglibcではatexit関数やjmp_bufを狙った攻撃は効かない (PTR_MANGLE)
生のポインタを保存しない、保存されてるポインタを生のまま利用しないというのは、リターンアドレスの書き換えを困難にするため、バッファオーバーフローなどを本質的に防ぐことができるわけではありませんが、攻撃の成功を難しくできますね。
というか、Windows でそのための関数が用意されているとは知りませんでした。
- EncodePointer(PVOID) function [Base]
- DecodePointer(PVOID) function [Base]
- EncodeSystemPointer(PVOID) function [Base]
- DecodeSystemPointer(PVOID) function [Base]
ところで、Windows だと atexit に限らず、コールバック関数を登録するようなAPIがたくさんあるけど、あれの内部実装はどうなっているんだろう…。