יום שבת, 26 במרץ 2011

Reverse Engineering With IDA

נושא ה Reverse Engineering או בעברית "הנדסה לאחור" הוא נושא מרתק ,מורכב ומאתגר , ראינו בעבר כבר דוגמה אחת ל Reverse Engineering בעזרת התוכנה Reflector שמראה לנו את הספריות של .Net וחושפת לנו את הפונקציות והמשתנים שבתוכנה שאנחנו רוצים לנתח, קיימים המון כלים בנושא והרשימה אינה נפסקת, זה תחום ענק שכל חברה רוצה שתהיה לה את האפשרות לנתח את המוצרים של המתחרים שלה על מנת שתוכל לבדוק ולגנוב ממנה רעיונות ופטנטים אבל לא רק חברות מעוניינות באפשרות הזאת, ראו את עולם משחקי המחשב הפיראטים שכל משחק חדש שיוצא מיד יוצאת לו גרסה פרוצה שמאפשרת לשחק את המשחק בחינם והכל בעזרת Reverse Engineering שנעשה על מערכות האבטחה של המשחק.


אז איך בדיוק עושים את זה?

Disassembler - זאת תוכנה שמאפשרת לנו להמיר שפת מכונה לשפת Assembler , ובעצם בצורה זאת נחשף לנו תרשים הזרימה של התוכנית , ניתן לראות את הפונקציות והמשתנים שהתוכנית מריצה וכך ניתן לראות את נקודות הבדיקה עבור סיסמאות או מספרים סיראלים ולהזריק לתוכה את המשתנים שלנו שיגרמו לתוכנית להתבלבל.

אז מה זה IDA?

Interactive Disassmbler - תוכנה שמאפשרת לנו לעשות Reverse Engineering , היא תומכת בהמון פלטפורמות וניתן לעשות איתה Debug לתוכנית ולעבור צעד צעד ולראות מה היא עושה וכיצד היא רצה.

נעבור על התוכנית שאותה נפרוץ , היא מדמה מערכת Login פשוטה שרשום בתוכה את הסיסמא שנדרש להכניס המשתמש.
#include stdio.h
#include conio.h
#include strings.h

int main()
{
   char line[100];
   printf("Welcome To CrackMe - Example For Authentication Application \n");
   printf("Enter Password for Login: \n");
   fgets(line,sizeof(line),stdin);

   int f;
   f = strcmp("crackmeifyoucan\n",line);

   if(f != -1 )
  {
     printf("Authentication Complete \n");
  }
  else
  {
     printf("Authentication Faild \n");
   }
     return 0;
}

כפי שניתן להבין מהתוכנית הסיסמא לכניסה היא crackmeifyoucan , ובעזרת פונקציית strcmp אנחנו בודקים את הקלט שהמשתמש מכניס,לאחר שהבנו את התוכנית שלנו נתחיל עם פיצוח ,תחילה יש להוריד את IDA מהאתר http://www.hex-rays.com/idapro/ אח"כ יש לפתוח את קובץ ה Exe של התוכנית שלנו.



לאחר טעינת הקובץ היפתח לנו טופס שאמור להראות כך:

IDA מכיל בתוכו המון אפשריות במאמר הזה אני יסביר באופן כללי על החלונות שאיתם נעבוד, החלון Name מכיל בתוכו את כל השמות - פונקציות , פרמטרים וממשקים.

החלון Strings מכיל את כל המחרוזות בתוכנית.


זה הוא ה Bar של התוכנית מרגע טעינת התוכנית בתוכנה  - כולל בתוכו גם את הקוד של הספריות הנלוות עבור הרצת התוכנית וגם את הקוד שלנו, הוא יראה לנו את כל הקוד שחלקו לא רלונטי כי הוא שייך לספריות החיצוניות שנטענות לפני פונקציית ה Main שלנו, נסייר בעזרת החץ עד שנמצא את הפונקציה.


sub_4013C0 הפונקציה Main של התוכנית כפי שניתן לראות בתמונה.



כפי שניתן לראות בתרשים התוכנה את סדר הפעולות שלה, הודעת פתיחה, הכנסת הסיסמא ובעצם ה IF שאומר לאן התוכנה אמורה להמשיך, כבר בשלב הזה ניתן לראות מה הסיסמא שהתוכנית מצפה לה.



כפתור ימני על שורת Strcmp יאפשר לנו הוספת BreakPoint ששם נעצור את התוכנית ונבצע Debug.


לאחר שקבענו BreakPoint ניתן להריץ את התוכנית.


נריץ את התוכנית , נכניס כל ערך לשדה הסיסמא ונחכה עד שהתוכנית תעצור ב BreakPoint שלנו.
נתקדם בתוכנית שלנו בעזרת הכפתורים הבאים (בדומה לשאר ה Debuggers , אפשרות להיכנס לפונקציה או לעבור לשורה הבאה).

נקפוץ עד השורה הבאה:

ונראה אם ה Zero Flag השתנה ב General Registers

אם הוא לא אפס אז הסיסמא שהכנסנו שגויה , ניתן לו ערך חדש:


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


בהצלחה...

2 comments:

  1. האם קיימים קורסים בהנדסה הפוכה במסגרת תואר ראשון ו/או בבתי ספר פרטיים? התחום נשמע לי מעניין מאוד בהשוואה לפיתוח נטו.

    השבמחק
  2. האמת היא שאין לי תשובה יותר מידי טובה לתת לך, בכל תחום ה Reverse Engineering צריך ידע עמוק במיוחד בפיתוח , צריך להכיר מספר שפות ,מערכות הפעלה וכמובן המון אסמבלי, בקיצור העסק הזה לא פשוט ודורש המון מחקר, לכן מומלץ להתחיל לאט לאט, וכמו תמיד יש המון חומר באינטרנט...

    בהצלחה...

    השבמחק