19.3.2011

hackthissite.org - Application Challenge 1,2,3,4,5,6 (easy)

מסתבר שיש די הרבה כניסות לבלוג שלי דרך קישורים הקשורים לאתר hackthissite (שמתם לב לצירוף הצמוד? XD )
חח קיצור אחרי אופורייה מטורפת של פיטרון שלב 5 ועל אותו הגל פיטרון של שלב 6 אני מפרסם את כל הדרכים לפטרון החלק הקל של אתגר משימות התוכנה - משימות 1 עד 6 :)  יאללה D: או כמו שאני תמיד אומר....
Last Go YoYo!!


שלב ראשון!

כמו כל משימה ראשונה - חרטה דבר - פותחים את הקוד אסקי של הקובץ על כתבן ולאחר סריקה של שניות עם העניים מוצאים את הסיראלים שאיתם ניתן לקבל את הקוד :)


שלב שני!

כתוב במפורש שאנו חייבים להתחבר לאינטרנט! זאת אומרת שתוכנה מאמתת את הסיסמה שלנו עם סיסמה ששמורה איפה שהוא באינרנט , אישית כשאני ניכנסתי לזה בפעם הראשונה ישר פתחתי Wireshark (הוא כבר היה פתוח חח)  מצאתי את המיקום של הקובץ באינטרנט. גם חיפוש של המחרוזת "http" בקוד אסקי של הקובץ יניב את אותה התוצאה :)


שלב שלישי!

 שוב אנו חייבים להיות מחוברים לאינטרנט , לאחר שימוש בתוכנה Wireshark (שוב חיפוש של המילה HTTP תמצא אותו הדבר) נימצא הקישור הבאה:
/missions/application/app3/auth.php?key=
כמובן שהכתובת המלאה היא:
http://www.hackthissite.org/missions/application/app3/auth.php?key=XXX
עבור כל סיסמה שאנו כותבים במקום ה-XXX הקוד PHP מחזיר האם זו הסיסמה או לא - הקובץ EXE שלנו בודק מה האתר מחזיר ועל פי זה הוא מציג או לא מציג לנו את הסיסמה - כלומר... אם הסיסמה שגויה האתר מחזיר FALSE התוכנה רואה שהוא מחזיר זאת ואז היא כותבת שהסיסמה שגויה :) נישאלת השאלה - אם נערוך את התוכנה כך שהיא תציג את הסיסמה במידה והאתר החזיר פולס? במילים אחרות - מה יקרה אם אני משנה את המילה טרו לפולס בתני :
if ($wordfromsite == "True") reutrn ThePassword
אז לא בעיה :) אני עורך את הקובץ עם התוכנה hex idetor אבל אפשר עם כל תוכנה , פשוט חפשו את המילה False ותשנו אותה ל true :) עד שזה יעבוד חח 


שלב רביעי!

חחח כמה שברתי ת'ראש עם יותר מי 5 תוכנות בניסיון לפטור את זה XD בכל מיקרה בסופו של דבר עזבתי את הדרך הקונבנציונלית להלכתי בדרך שלא ניראת כל כך יפה בכללי (בדיאבד אין דבר כזה דרך לא קובנציונלית!) אז פרשתי לגוגל בחיפוש אחר decompiler של VB , המטרה: לראות את קוד המקור של התוכנה וכך למצאו את הסיסמה :) חיפושי בגוגל הביאוני אל התוכנה  VB Decompiler Lite - חמודה מאוד - הדבר שהיא צריכה לעשות הוא להציג את הקוד סורס של קובץ VB , (אישית לא הצלחתי לעשות את זה - התוכנה קורסת :\ ) אך במקום לעבור על השורות סורס עשיתי משהו אחר, הקטע הוא שהתוכנה מספקת דבר נוסף =>
אז למי שלא מבין VB :
VB היא שפת איבנטים - כלמור - כל פעולה מסויימת מריצה קטע קוד שכתוב לאותה פעולה
דוגמה: אם תחת האיבנט command1_click כתבתי msgbox("jf48jds") X מה שקורה שברגע שהפעולה CLICK (לחיצה) הופעלה על האבג'קט command1 (שמו של הכפתור) אז קטע הקוד ירוץ.
התוכנה מראה לנו את כל האיבנטים שמופיעים בתוכנה - יש 7 איבנטים -
הראשון איבנט שרץ כאשר התוכנה ניפתחת
השני השלישי והרביעי איבנטים שקשורים ללחצן הראשון
חמישי שישי שביעי איבנטים שקשורים ללחצן השני
הדבר הנוסף שהתוכנה מציגה לנו (מסומן בירוק) הוא השורה בזיכרון בה מתחיל אותו קטע קוד שקשור לאותו איבנט
כלומר - בשורה 402AD0 מתחיל הקטע קוד של שניכתב לאותו אינבט \ במיקרה של השורה הזו זה האיבנט Command1_click
נישאל את השאלה - מה יקרה אם יתחיל לרוץ במקום האיבנט של הMuseMove האיבנט של ה- CLICK ? כאילו יש לי את השורות ואני יכול לשנות אותם אז כאילו למה לא? :)
מי שעד לא הבין מה לעשות פשוט לכו לתוכנה ODBG תגיעו לשורה של ה MuseMove ותשנו את הקטע קוד שכתוב שם (posh משהו) ל jmp XXX כאשר XXX זו השורה של האיבנט Click לאחר מיכן תזיזו את האחבר על הלחצנים ותיראו מה קורה :)




לפני השלבים הבאים טיפה רקע על התוכנה שנישתמש בה -
ODBG - גיליתי את התוכנה הזו לפני כמה שבועות , משהו עצני :)
הורדה וזה: http://www.ollydbg.de
טיפה רקע על התוכנה:
קובץ EXE שמתפיס על חלון ה- CMD (השחור שניפתח ברגע שאנחנו לוחצים על הקובץ) את המילים HELLO WORLD כתוב בכניראה ב C/C++/C# וכו' אך איך לעזאזל המחשב יודע לפרש את פקודות ה C ? איאפשר לדבר עם המעבד ולומר לו על פעם שאתה רואה X תעשה Y זה לא עובד ככה, אבל מה שכן עובד זה מספר פקודות ששמורות לו והוא יודע לבצעה אותם כמו תוקי , למשל אם אני יגיד למעבד תכניס את המספר 1 למשנה בשם AX , את זה הוא יודע לעשות יפה מאוד :) איך מהכנסה של הערך 1 לעוגר (משתנה) AX אני יוצר את המנועה הגרפי של קריסיס 2 זה סיפור שלם בפני עצמו - תורה שלמה וגדולה מאוד בשם אסמבלר - אך לעיינינו שלנו נבין בסך הכל של מה שהתוכנה אומרת למחשב לעשות אנו יכולים לראות , לשנות , להוסיף, ולימחוק :) ועכשיו מתחיל הכייף D:
מה ש-ODBG עושה היא נותנת לנו את האפשרות לראות , לשנות , להוסיף, ולימחוק בצורה קלה יפה ופשוטה מאוד במקום לעשות זאת ידנית (אפשרי לגמרי).

עד אתר נורא יעיל - http://home2.paulschou.net/tools/xlate
המרה ישירה מי בסיס 2 10 16 64 אסקי והצפנות MD5/4/2 

 שלב חמישי!
החשיבה מאוד פשוטה - אני מכניס סיסמה - התוכנה משווה אותה עם הסיסמה שהיא יודעת שהיא הנכונה - במידה שהן אותו הדבר מחזיר נכון - במידה ולא - שגויה , הגיוני לא? עכשיו נבודד פה משהו חשוב - משווה את הסיסמה לאותה סיסמה שלי - אם אני ימצא את הסיסמה שהתוכנה משווה לסיסמה שלי.... יפה לא? הקטע שהסיסמה לא שמורה ככה סתם כמו במשימה הראשונה הוא יוצר את הסיסמה בעצמו ככה שאיאפשר למצאו אותו בסורס.
אז כמה טיפים לפריצה מהסוג הזה :
1-תלמדו אסמבלי
2- תמיד תתחילו מהסוף! תחפשו את השורת ה ASCII שאומרת שהסיסמה שהוכנסה לא נכונה , מאותה שורה תעלו למעלה ותחפשו איזה קפיצה מביעה לאותה שורה je jb וכו' , לפני אותה קפיצה צריכה להיות הפקודה CMP שמשווה בין שני ערכים.
אחד הערכים הוא הסיסמה שלכם - והשני זה הסיסמה הנכונה -

אז אחרי חיפושים הגעתי לדרך הזו -
הכניסו את התוכנה ל ODBG תחלצו ctrl + G תגיעו לאדררס 004010C3
השורת קוד צריכה להיות כדיל כמאן :
CMP EAX,DWORD PTR SS:[EDX*4+EBP-18]
השורה הבאה:
JE SHORT 004010DA

אז ככה , השורה הראשונה משווה בין הערך שנימצא בעוגר EAX לערך שנימצא בזיכרון במקום:
SS:[EDX*4+EBP-18]
התוכנה ODBG מראה את הערכים הנימצאים בכל אחד מהמקומות האילו ברגע שהיא נימצאת על השורה 
אז מה שנעשה נלחץ דאבל קליק על הקוד אסקי של הפקודה (עמודה שנייה) מה שגורם למספר השורה להיות באדום (עמודה ראשונה) מה שעשינו הוא לומר לתוכנה לעצור את הרצת התוכנה ברגע שהיא תגיע לשורה הזו
אחרי כל זה נילחץ על לחצן ההרצה (משולש פונה ימינה כמו תמיד) בחלון התוכנה שניפתח נכניס את הסיסמה 123456 ואנטר - ברגע התוכנה נימצאת על השורה 004010C3 ניתן ליראות למטה מיתחת לחלון הראשי חלון יותר קטן שם כתוב את הערכים שנימצים ב EAX / SS:[EDX*4+EBP-18] X - הערך כמובן מוצג ב Hex
אז פשוט נשתמש באתר http://home2.paulschou.net/tools/xlate על מנת לתרגם את האקסה לתווים.
עכשיו מה שנעשה זה נילחץ F8 פעם אחת, מה שעשינו היה לומר לתוכנה ODBG לבצע את השורה שהיא סימנה:
CMP EAX,DWORD PTR SS:[EDX*4+EBP-18]
ולעבור לשורה באה - >
JE SHORT 004010DA
מה שהשורה שנייה עושה נורא פשוט - היא קופצת לאדררס 004010AD רק במידה והדגל ZE דולק (1 ולא 0) 
הדגל ZE מושפע מהפעולה CMP (שורה ראשונה)  במידה והערכים שהשוונו באמת שווים אז הדגל הופך ל 1 אם הם לא אז הדגל הופך ל 0 , מין הסתם הערכים לא היו שווים כי הסיסמה שכתבנו 123456 היא לא הסיסמה הנכונה לכן לפני שנידרוש מהמחשב לבצע את הפדוה הזו (F8) נשנה ידנית את הדגל ZE ל 1 - אפשר לעשות את זה דרך החלון בצד ימין . נילחץ F8 התוכנה תקפוץ מספר שורות למעלה ואז נמשיך ללחוץ F8 עד שנגיעה שוב לשורה הראשונה וככה ונחזור על הפעולות - כל פעם נפענח עד חלק של הסיסמה עד שבסופו של דבר הקוד יסתיים. וזהו :)
שימו לב שהקוד אסקי של הסיסמאות הפוך! כלומר הוא לא משווה 1234 עם ASDF הוא משווה 4321 עם FDSA.

תמונה שסימנתי שם את כל מה שדיברתי עליו במשימה הזו:


שלב שישי!
שלב שישי בדיוק אותו הדבר כמו שלב 5! רק עם טריק קטן , אין לי מוסג איך או למה אבל כאשר מריצים את הקוד בתוכנה ODBG חלק מהפקודות (החלק שאנחנו רוצים) לא מופיעה בצורה טובה - אנחנו לא רואים שם דבר שאפשר לעבוד איתו (מי שיבדוק יבין על מה אני מדבר)  בישביל לפטור את זה צריכים לבצעה כמה פעולות , דבר ראשון הולכים לראש קטע הקוד שמשם הפקודות לא ניראות טוב (אצלי זה מישורה 004010D5) . זה מתחיל ישר אחרי הפקודה:
JMP SHORT 00401116
מה שעושים מסמנים הכל (קליק רצוף) משם עד סוף הבלוק הזה של הפקודת (אצלי זה שורה 004011C4
קליק ימיני על אחת השורות:
Edit => Binry Edit
מעתיקים את כל הקוד HEX שיש שם , לאחר מיכן חוזרים לשורה הראשונה (אצלי זו שורה 004010D5) לחצים רק עליה ולאחרי שרק היא מסומנת לחצים עליה קליק ימיני ושוב
Edit => Binry Edit
ובמקום השני מספרי HEX שיש שם מדביקים את כל מה שהעתקתם. עושים אישור וזה צריך לפתור את הבעיה
חוזרים על איכרון הפריצה של שלב 5 וסיימנו :) 

בהצלחה לכולם ! מקווה לתגובות לשם שינוי :) 
כל הזכיות שמורות ל Vendetta -  The Last Dimension

11.3.2011

מטריצות :)

כידוע לכם אני כותב לרוב במירק סקריפט ולמי שיצא לעבד עם התוכנה כניראה הבין שאין שם כלום XD אז אחרי דיונים כאילו ואחרים כתבתי את הפונקציה matrix על מנת לתת קלי נוסף למתכנתים וכו'
אני רוצה לציין שהפוסט הזה הוא הפוסט הראשון בסידרה די גדולה (אני מקווה) של פוסטים שיעשקו באחד מהמטרות שלי בחיים והיא לצור בינה אנושית מלחותית , תצחקו :) זה בראי . עכשיו נתחיל -

MLS:
//Matrix new name x y z
//Matrix close name
//Matrix move name x y z text
//echo -a $matrix(name).info
//echo -a $matrix(name,x,y,z)

alias Matrix {
  if ($prop == info) return $hget(Matrix,$1)
  var %checkid = 0
  if ($isid == $false) %checkid = 1
  if (%checkid == 1) {
    if ($1 == new) {
      tokenize 32 $2-
      if (!$3) { echo $color(info) -sa * Too few parameters: Matrix | goto error }
      else {
        if ($26) { echo $color(info) -sa * Too many parameters: Matrix | goto error }
        else {
          if ($window($+(@,$1))) {
            hdel -w Matrix $1
            window -c $+(@,$1)
          }
          var %x = 2 , %sum = 1 , %all
          while ([ $ [ $+ [ %x ] ] ]) {
            %all = %all $v1
            %sum = $calc(%sum * $v1) 
            if ($v1 !isnum) { echo $color(info) -sa * Index mast be a number: Matrix | goto error }
            inc %x
          }
          window -h $+(@,$1)
          %x = 1
          while (%x <= %sum) { echo $+(@,$1) 0 | inc %x }
          hadd -m Matrix $1 %all
        }
      }
    }
    if ($1 == close) {
      hdel -w Matrix $1
      window -c $+(@,$1)
    }
    if ($1 == move) %checkid = 2
  }
  if (%checkid == 2) || (%checkid == 0) {
    if (%checkid == 2) tokenize 32 $2-
    else tokenize 32 $1-
    var %x = $0 , %n , %text , %info , %i = 1
    %info = $hget(Matrix,$1)
    while ($gettok(%info,%i,32)) {
      if ([ $ [ $+ [ $calc(%i + 1) ] ] ] > $v1) { echo $color(info) -sa * Deviation from the limit: Matrix | goto error }
      inc %i
    }
    %text = [ $ [ $+ [ %x ] ] ]
    dec %x
    if (%checkid == 2) dec %x
    if (%x !== $numtok(%info,32)) { echo $color(info) -sa * Discrepancy between the number of indexes in the matrix and what is introduced: Matrix | goto error }
    else {
      var %i = 1 , %Function = $replace($MatrixFunction(%x),0,$2) , %v1
      while (%i < %x) {
        %v1 = [ $ [ $+ [ $calc(%i + 2) ] ] ]
        ;%v1 = [ $ [ $+ [ $0 ] ] ]
        %Function = $replace(%Function,$chr($calc(%i + 64)),$gettok(%info,%i,32),$chr($calc(%i + 161)),%v1)
        inc %i
      }
      if (%checkid == 2) rline $+(@,$1) $calc(%Function) %text
      else return $line($+(@,$1),$calc(%Function))
    }
  }
}
alias MatrixFunction {
  if ($1 > 1) {
    var %x 1 , %all , %save
    while (%x < $1) {
      %all = %all $chr($calc(%x + 64)) %save * ( $chr($calc(%x + 161)) - 1 ) +
      %save = %save * $chr($calc(%x + 64))
      inc %x
    }
  }
  return %all 0
}
קוד נורא יפה לטעמי למבד החלק של האלייס השני - עשיתי את זה בנסיון לפשט את הקוד כדי שיהיה יותר קל לקרוא ממינו אך לצערי רק סיבחתי :\ 
אז יש לנו מימוש של מטריצות , יש עד כמה דברים שהייתי רוצה לפרסם בנושא:
כפל בין שני מטריצות וחזרה של מטריצת ההכפלה.
MLS: 
mcasd <name1> <name2> <name3>
alias mcasd {
  Matrix new $3 $gettok($Matrix($2).info,1,32) $gettok($Matrix($1).info,2,32)
  var %x = 1 , %y = 1 , %z = 1 , %i = 1 , %sum = 0
  %x = 1
  while (%x <= $gettok($Matrix($1).info,2,32)) {
    %z = 1
    while (%z <= $gettok($Matrix($2).info,1,32)) {
      %y = 1
      while (%y <= $gettok($Matrix($1).info,1,32)) {
        %sum = $calc(%sum + ( $Matrix($1,%y,%x) * $Matrix($2,%z,%y) ))
        inc %y
      }
      Matrix move $3 %z %x %sum
      %sum = 0
      inc %z
    }
    inc %x
  }
}
מציג מטריצות בצורת טבלה
MLS:
alias showmatrix {
  var %x = 1 , %y , %text
  while (%x <= $gettok($matrix($1).info,2,32)) {
    %y = 1
    %text = $null
    while (%y <= $gettok($matrix($1).info,1,32)) {
      %text = %text $matrix($1,%y,%x)
      inc %y
    }
    echo -a @ %text
    inc %x
  }
}

אלי בהמשך יהיה מאמר על כפל מטריצות לכו תדעו :)
כל הזכיות שמורות ל Vendetta -  The Last Dimension

6.3.2011

hackthissite.org - Basic missions - 1,2,3,4,5,6,7,8,9,10

http://www.hackthissite.org/missions/basic/1/
חפשו את הסיסמה בקוד HTML של האתר , יותר מזה אין מה לעשות.
http://www.hackthissite.org/missions/basic/2/
שוב משעמם , ניצבת טענה שהקוד משווה את הסיסמה עם סיסמה שנימצאת בקובץ טקסט אחר אבל הקובץ לא העלה , אזי בזמן הקראה הוא יקבל ערך ריק - NULL כלומר צריך בסך הכל לשלוח (או לא לישלח) כלום וכך עוברים שלב.
http://www.hackthissite.org/missions/basic/3/
לאחר קראה של פעולת שליחת הנתונים מסתבר שבשליחה נימצא INPUT מוסתר שמכיל את הערך password.php... מעניין מה יש שם -_-".
http://www.hackthissite.org/missions/basic/4/
מוצגת לפניינו הנחה שהמתכנת מסוגל לשלוח לאימייל שלו את הסיסמה - אחרי קראה של מקור הדף ניתר ליראות שצויין האימייל שאליו תשלח הסיסמה ומידה והמתכנת ירצה בזה - מה יקרה עם נשנה לאימייל של משהו אחר? אישית אני משתמש ב firebug בישביל העריכה הזו אבל אפשר לפתוח דף HTML חדש וכו'.
http://www.hackthissite.org/missions/basic/5/
לדברי המשימה כניראה פתיחה של דף HTML משלנו לא תעשה את העבודה כניראה הוסתר שם משהו וכו' . שימוש בתוכנה firebug עם חזרה על מעלך הפריצה של המשימה הקודמת תעביר אותך שלב.
http://www.hackthissite.org/missions/basic/6/
כמו שהבנתי צריך למצאו את הפונקציה שמקמפלת להבין מה היא עושה שם בדיוק ולחזור על הפעולות עם הקוד הנתון. אישית אני פשוט הבנתי את חוקיות של האצפנה וכך פרצתי , אני מצרף קוד שמחזיר את הסיסימה הדורשה לשלב הבא
MLS:
  var %x = 1 , %sad
  while ($mid(69;de>87,%x,1))
  {
    %sad = %sad $+ $chr($calc($asc($v1) + 1 - %x))
    inc %x
  }
  echo -a @ %sad

http://www.hackthissite.org/missions/basic/7/
שלב חמוד האמת , מצויין לנו שלפניינו אפשרות להשתמש בפקודה cal של UNIX , במילים אחרות יש לנו פה אפשרות לריץ פקודות UNIX :) חמוד לא? אז צויין שאנחנו צריכים למצאו את הקובץ והפקודה שמציגע לנו את כל הקבצים בסביבה היא לא אחרת מאשר LS
 כמובן שסתם ככה זה לא יעבוד  - נעלץ לעזריק את הפקודה הנ"ל למערכת , נעשה זאת בעזרת הוספת התיו ; שמציין פקודה חדשה במרית השפות 
; ls

http://www.hackthissite.org/missions/basic/8/
האמת שזה שבר לי ת'ראש חח , אז ככה מסתבר שבPHP אפשר לזריק פקודות לשרת שליו הוא רץ, התחביר 
<!--#exec cmd="CMD"-->
אנו שוב צריכים שם של קובץ שנימצא שם אז אותו חרטה כמו במשימה הקודמת ויאללה למשימה הבאה
<!--#exec cmd="ls ../"-->
http://www.hackthissite.org/missions/basic/9/
מריכים את הסוף הא?  אז כל החפירה שנימאת שם אומרת בפשטות שהבאג שהיה במשימה הקודת נחסם אבל אולי יש משהו בדברים שכבר עשינו שיוכל לעזור לנו לפרוץ את המשימה החדשה? אז אולי באמת יש משהו כזה - בחזרה למשימה הקודמת! וכאן הדיין יש את הבאג , הפעם נזריק פקודה אחרת , חדשה - תנחשו לבד איך היא תראה :)
<!--#exec cmd="ls ../../9"-->
 http://www.hackthissite.org/missions/basic/10/
אישית לא הייתי מציב את המשימה הזו כאחרונה אבל פסדר בקטנה - הכל בגוף השאלה , אני צריך להכניס סיסמה על מנת לקבל גישה לדף הבאה.. מעניין...חירבוש של סיסמה מחזירה הודעה על כך שאין אני מורשה לצפות בדף זה - הרשאה.... נחמד....קוקיז אולי? אישית אני משתמש בקוקיז אדיטור - מין תוסף לפייפוקס אבל אתם יכולים לעשות את זה איך שבא לכם 
חפשו את הקוקיז תערכו אותו כמו שצריך ליש לך את המשימה האחרונה בכיס D: 
בהצלחה :) 
כל הזכיות שמורות ל Vendetta -  The Last Dimension