Une question intéressante. J'ai un problème similaire sous linux. Les systèmes de détection d'intrusion comme OSSEC ou tripwire peuvent générer des faux positifs si le hashsum d'un exécutable change tout d'un coup. Cela peut n'être rien de pire que le programme "prelink" de Linux Parcheando le fichier exécutable pour des démarrages plus rapides.
Afin de comparer deux binaires (dans le format Format ELF ), on peut utiliser l'exécutable "readelf" et ensuite "diff" pour comparer les sorties. Je suis sûr qu'il existe des solutions plus raffinées, mais sans plus attendre, un comparateur du pauvre en Perl :
#!/usr/bin/perl -w
$exe = $ARGV[0];
if (!$exe) {
die "Please give name of executable\n"
}
if (! -f $exe) {
die "Executable $exe not found or not a file\n";
}
if (! (`file '$exe'` =~ /\bELF\b.*?\bexecutable\b/)) {
die "file command says '$exe' is not an ELF executable\n";
}
# Identify sections in ELF
@lines = pipeIt("readelf --wide --section-headers '$exe'");
@sections = ();
for my $line (@lines) {
if ($line =~ /^\s*\[\s*(\d+)\s*\]\s+(\S+)/) {
my $secnum = $1;
my $secnam = $2;
print "Found section $1 named $2\n";
push @sections, $secnam;
}
}
# Dump file header
@lines = pipeIt("readelf --file-header --wide '$exe'");
print @lines;
# Dump all interesting section headers
@lines = pipeIt("readelf --all --wide '$exe'");
print @lines;
# Dump individual sections as hexdump
for my $section (@sections) {
@lines = pipeIt("readelf --hex-dump='$section' --wide '$exe'");
print @lines;
}
sub pipeIt {
my($cmd) = @_;
my $fh;
open ($fh,"$cmd |") or die "Could not open pipe from command '$cmd': $!\n";
my @lines = <$fh>;
close $fh or die "Could not close pipe to command '$cmd': $!\n";
return @lines;
}
Maintenant vous pouvez exécuter par exemple, sur la machine 1 :
./checkexe.pl /usr/bin/curl > curl_machine1
Et sur la machine 2 :
./checkexe.pl /usr/bin/curl > curl_machine2
Après avoir copié, transféré par SFTP ou NSF (vous n'utilisez pas FTP, n'est-ce pas ?) les fichiers dans la même arborescence, comparez-les :
diff --side-by-side --width=200 curl_machine1 curl_machine2 | less
Dans mon cas, il y a des différences dans les sections ".gnu.conflict", ".gnu.liblist", ".got.plt" et ".dynbss", ce qui pourrait être correct pour une intervention "prelink", mais dans la section code, ".text", ce qui serait un mauvais signe.