יום שישי, 24 ביוני 2011

HTS פיתרון שלב 2 משימות תיכנות.

קודם כל קישור: http://www.hackthissite.org/missions/prog/2/
צריך להיות רשום על-מנת לבצע משימות.

במשימה: עליך לפענך סיסמא מתוך תמונה שמקבלים במשימה.
התמונה עצמה שחורה, וכל מיקום של נקודה לבנה מציינת קוד ASCII בצורה זו:
המנה המתקבלת מחיסור נקודה פחות הנקודה הקודמת, היא תו ASCII, כאשר בכל שורה, עולה המיקום של נקודה ב 100. כך שה-X של הפיקסל הראשון בשורה הראשונה הוא 0, ובשנייה הוא 100. אם זהו התוו הראשון בתמונה, אז הערך שלו הוא המיקום שלו.
לאחר שמצאנו את כל התווים (החיסורים של הנקודות הלבנות), אנו צריכים לפענך אותם, כאשר הם מוצפנים בקוד מורס שבו "." הוא התו הקצר,  "-"  הוא התו הארוך ו "/" מסמל רווח.

על-מנת לפתור את הבעיה ב 15 שניות כמובן שנזדקק לתוכנה.
אני החלטתי לבנות סקריפט בשפת התיכנות PERL.
השתמשתי במודול:Image::Magick כדי לנתח את התמונה ביתר קלות.

זהו הקוד:

#!/usr/bin/perl

use Image::Magick;


# 100 x 30 = image size

$image=Image::Magick->new;
$image->Read('filename.png');

my $x,$y;
my $ax;
my $lastx;
my @mors_code;
my $mors_chr = "";

$lastx = 0;
for($y = 0; $y<30; $y++)
{
   
    for($x = 0; $x<100; $x++)
    {
        $ax = $x + 100 * $y;
        @color = ();
        @color = $image->GetPixel(x=>$x,y=>$y);
       
        if($color[0] == 1)
        {
            $char = $ax - $lastx;
            $lastx = $ax;
                   
            if($char != 32) { # Not space
                $mors_chr .= chr($char);
            }
            else # Equals SPACE
            {
                push (@mors_code, $mors_chr);
                $mors_chr = "";
            }
        }
    }
}
$a = ".-";
$b = "-...";
$c = "-.-.";
$d = "-..";
$e = ".";
$f = "..-.";
$g = "--.";
$h = "....";
$i = "..";
$j = ".---";
$k = "-.-";
$l = ".-..";
$m = "--";
$n = "-.";
$o = "---";
$p = ".--.";
$q = "--.-";
$r = ".-.";
$s = "...";
$t = "-";
$u = "..-";
$v = "...-";
$w = ".--";
$x = "-..-";
$y = "-.--";
$z = "--..";
$one = ".----";
$two = "..---";
$three = "...--";
$four = "....-";
$five = ".....";
$six = "-....";
$seven = "--...";
$eight = "---..";
$nine = "----.";
$zero = "-----";

foreach $letter (@mors_code)
{
    if($letter eq $a)
    {
        print "a";
    }
    elsif($letter eq $b)
    {
        print "b";
    }
    elsif($letter eq $c)
    {
        print "c";
    }
    elsif($letter eq $d)
    {
        print "d";
    }
    elsif($letter eq $e)
    {
        print "e";
    }
    elsif($letter eq $f)
    {
        print "f";
    }
    elsif($letter eq $g)
    {
        print "g";
    }
    elsif($letter eq $h)
    {
        print "h";
    }
    elsif($letter eq $i)
    {
        print "i";
    }
    elsif($letter eq $j)
    {
        print "j";
    }
    elsif($letter eq $k)
    {
        print "k";
    }
    elsif($letter eq $l)
    {
        print "l";
    }
    elsif($letter eq $m)
    {
        print "m";
    }
    elsif($letter eq $n)
    {
        print "n";
    }
    elsif($letter eq $o)
    {
        print "o";
    }
    elsif($letter eq $p)
    {
        print "p";
    }
    elsif($letter eq $q)
    {
        print "q";
    }
    elsif($letter eq $r)
    {
        print "r";
    }
    elsif($letter eq $s)
    {
        print "s";
    }
    elsif($letter eq $t)
    {
        print "t";
    }
    elsif($letter eq $u)
    {
        print "u";
    }
    elsif($letter eq $v)
    {
        print "v";
    }
    elsif($letter eq $w)
    {
        print "w";
    }
    elsif($letter eq $x)
    {
        print "x";
    }
    elsif($letter eq $y)
    {
        print "y";
    }
    elsif($letter eq $z)
    {
        print "z";
    }
    elsif($letter eq $one)
    {
        print "1";
    }
    elsif($letter eq $two)
    {
        print "2";
    }
    elsif($letter eq $three)
    {
        print "3";
    }
    elsif($letter eq $four)
    {
        print "4";
    }
    elsif($letter eq $five)
    {
        print "5";
    }
    elsif($letter eq $six)
    {
        print "6";
    }
    elsif($letter eq $seven)
    {
        print "7";
    }
    elsif($letter eq $eight)
    {
        print "8";
    }
    elsif($letter eq $nine)
    {
        print "9";
    }
}
print "\n";




קודם כל ע"פ השורה הראשונה בקוד אתם כבר יכולים לראות כי אני עובד על לינוקס.
החלק הראשון בקוד טוען את התמונה, ובלולאות מבצע את פיענוך התמונה.
החלק השני בקוד מפענך את המורס.
לאחר סיום התוכנית ניתן לראות כי הסיסמא מודפסת, כל מה שנותר הוא להעתיקה לשדה הטקסט באתר.
תהנו!