22th Feb 2003 [SBWID-6009]
COMMAND
Perl2Exe EXEs Can Be Decompiled
SYSTEMS AFFECTED
Perl2Exe 5.x, 6.x versions
PROBLEM
Tim Abenath [[email protected]] found :
My research heavily depends on Simon Cozens work which can be found on
http://ddtm.simon-cozens.org/~simon/perl2exe
Since version 5.x is already dissected i took a look on the 6.x
Version. This has been tested on the latest release Perl2Exe V6.00 for
Linux (Feb 20, 2003). Here we go:
The 6.0 Version stores a list of the included stuff at the end of the
binary:
NAME=p2x_stub.lib;SIZE=811048;ENC=0
NAME=p2x_pre_exec_message;SIZE=0;VALUE=
NAME=p2x_trial_message;SIZE=0;VALUE=~@~@~@~@~@~@~@~@
NAME=p2x_exec_command;SIZE=0;VALUE=_main.pl
NAME=_main.pl;SIZE=6339;ENC=1
NAME=P2X-V06.TOC;SIZE=195
The _main.pl part is what we are looking for. As perl2exe still uses
BogoCrypt, (known as XOR) this is gonna be simple to attack using
'known plaintext'.
We start with generating a plaintext file with the length of _main.pl,
the content doesn't matter. Lets call that one sample.pl We compile
this one using ./perl2exe sample.pl and get the binary 'sample'. We can
XOR the plain and cyphertext to get the used key. Now it's time to
start up our dirty little code:
#!/usr/bin/perl
$known_plain = `cat sample.pl`;
$known_cipher_file = "sample";
$sizeline = `tail -c +811048 $known_cipher_file | strings | grep
NAME=_main.pl`;
@line = split /;/, $sizeline;
@size = split /\=/, $line[1];
$known_cipher = `tail -c +811048 $known_cipher_file | head -c $size[1]`;
$key = $known_cipher ^ $known_plain;
$unknown_cipher = `tail -c +811048 perl2exe | head -c $size[1]`;
$unknown_plain = $unknown_cipher ^ $key;
print $unknown_plain, "\n";
The output should be redirected to a file, because there are still some
binary bits in $unknown_plain.
SOLUTION
Check perl2exe, [http://www.indigostar.com/]