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 な環境で動作可能です。

● 参考文献

  1. http://www.x86-64.org/documentation/abi-0.99.2.pdf