Zum Lösen dieser Challenge (X95) muss der Aufgabenstellung nach ein Passwort angegriffen und anschließend offensichtlich auf dem Zielsystem unter Port 3002 eingegeben werden. Zusätzlich erhalten wir den Quellcode des Dienstes, der auf dem System lauscht.
Bevor wir uns überhaupt mit dem Server verbinden, sehen wir uns das mitgelieferte Perl-Script an. Folgende Funktionsweise ist darin implementiert:
#!/usr/bin/perl use IO::Socket; my $welcome_msg = <<"EOT"; +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ _ _ 95 _________ ______ ______ _ _ _____ ______ ______ \\ \\ / / | | | | | \\ | | | | | | | | | | | | | | \\ \\ | | >|--|< | | | | | | | |__| | | | | |--| | | | | | | | | |---- /_/ \\_\\ |_| |_| |_| |_| |_| |_|____ |_| |_| _|_|_ |_| |_| |_|____ +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ EOT $|=1; $lis = IO::Socket::INET->new ( LocalPort =gt; 3002, Type =gt; SOCK_STREAM, Reuse=> 1, Listen => 1000 ) or die "Error #1 $@\n";
Das Skript definiert zunächst eine Willkommens-Nachricht und öffnet einen Socket, der auf Port 3002 lauscht.
while( $c = $lis->accept() ) { if ($pid=fork) { next; } else { unless (defined $pid) { die "Threads problem $! \n"; } $flag=""; print $c $welcome_msg."\n\n"; [... siehe nächster Auszug ...] } exit; } close $lis;
Anschließend wird die eigentliche Hauptschleife erreicht, die für jede Verbindung einen neuen Thread erstellt, die Variable $flag defininiert – die hier, anders auf dem Zielsystem laufenden Dienst, leer ist – und die Willkommensnachricht ausgibt. Was passiert nun genau, wenn ein Client sich zum Server verbindet?
Continue reading