Perl で動的 x86_64 プログラミング
相対ジャンプのcall命令を動的に生成できるようにしておくとx86実行コード中に任意の文字列を埋め込めるので大変便利です。
● Linux/x86_64 で /usr/bin/perl -e 'print "Hello, world!\n"' を実行するサンプル
#!/usr/bin/perl -w sub P{"\xe8".pack('L',1+length$_[0]).$_[0]."\x00"}; use DynaLoader;DynaLoader::dl_install_xsub('X',unpack'L',pack'P', $_=P($^X)."_h-e\x00\x00H\x89\xe1".P('print "Hello, world!\n"') ."[1\xd2RSQWH\x89\xe6j;X\x0f\x05j\x01_j<\x0f\x05");&X
CentOS 4.4/x86_64 + AMD Opteron 240 EE + Perl 5.8.5 で動作確認
Hello, world!
上記プログラムは AMD64 ABI(*1) を利用した syscall で Linux のシステムコールを呼び出しているため、i386 環境では動作しません。uname -i が x86_64 な環境で動作可能です。
● 参考文献