関数呼び出しの引数の数特定

新年早々何やってるんだという気がしないでもないが...


stripされていても外部ライブラリを呼んでる都合上シンボルは残ってるので
readelf -s で特定可能。
シンボル名が判ったら objdump -d で disassemble した後call箇所を特定。
IA32なので大体こんな様な感じになってる。

 pushl arg2
 pushl arg1
 call target_symbol@plt
 addl size, %esp

callから戻った後に戻してるサイズ/4と引数の数が一致してるはず。


なんだけど、実際の引数の数より多く戻してる場合が見つかったり。
callの前で subl $0x08,%esp とかしてるのでつじつまは合ってるんだけど
何で多めに渡してるんだろう?


ともあれ、該当関数をplt経由で置き換える場合は数だけ合わせておけば
つじつまは合うだろうと思いながら、ダミー関数の引数はvoid*を並べて適当に対処。


色々付け焼き刃で知識の足り無さが身にしみるので今年はもうすこし頑張ろう。