I am Very Good - Stage3 Pwned! מאת רונן שוסטין )Antartic( ופלג הדר )P( הקדמה במאמר זה נסקור טכניקות אנטי-דיבאגינג מסויימות. כרקע אנו ממליצים לקרוא את

מסמכים קשורים
תרגול מס' 4: המתרגם שימוש במחלקות קיימות מחרוזות, קבצים, וקבלת קלט מהמשתמש

תרגול 1

PowerPoint Presentation

שאלהIgal : מערכים דו מימדיים רקורסיה:

Slide 1

מבוא לתכנות ב- JAVA תרגול 7

הטכניון מכון טכנולוגי לישראל אלגוריתמים 1 )443432( סמסטר חורף הפקולטה למדעי המחשב תרגול 9 מסלולים קלים ביותר תרגיל APSP - 1 עד כה דנו באלגור

תשע"דד אביב תוכנה 1 תרגיל מספר 4 עיבוד מחרוזות וקריאה מקבצים הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס..(

מבוא למדעי המחשב

מבוא למדעי המחשב

שאלהIgal : מערכים דו מימדיים רקורסיה:

שבוע 4 סינטקס של HACK ASSEMBLY ניתן להשתמש בשלושה אוגרים בלבד:,A,D,M כולם בעלי 16 ביטים. M אינו אוגר ישיר- הוא מסמן את האוגר של ה RAM שאנחנו מצביעים ע

מהוא לתכנות ב- JAVA מעבדה 3

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

מבוא למדעי המחשב

Data Structure Assignment no.3 תאריך הגשה: p.m. 11/09/16, 23:59 את העבודה יש להגיש בזוגות במערכת ההגשות.submission system על העבודה להיות מוגשות כקובץ

מבוא לאסמבלי

תרגיל בית מספר 1#

שעור 6

משימה תכנית המתרגמת קטעי טקסט לשפה אחרת הקלט: קובץ המכיל את קטעי הטקסט וכן את השפה אליה רוצים לתרגם תרגול מס' 4: המתרגם שימוש במחלקות קיימות תכנות מתק

תכנון אלגוריתמים עבודת בית 4: תכנון אלגוריתמים תאריך הגשה: 02: , בצהריים,תא מספר 66 בקומת כניסה של בניין 003 מתרגל אחראי: אורי 0

PRESENTATION NAME

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

Microsoft PowerPoint - Lecture1

שאלהIgal : מערכים דו מימדיים רקורסיה:

תוכן העניינים: פרק צמצומים ומימושים של פונקציות בוליאניות... 2 צמצומים של פונקציות באמצעות מפת קרנו:...2 שאלות:... 2 תשובות סופיות:... 4 צמצום

מערכות הפעלה

Microsoft Word - c_SimA_MoedB2005.doc

סדנת תכנות ב C/C++

בחן במערכות הפעלה

בחן במערכות הפעלה

הגשה תוך שבוע בשעת התרגול

תרגול מס' 1

Slide 1

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

פקולטה: מחלקה: שם הקורס: קוד הקורס: מדעי הטבע מדעי המחשב ומתמטיקה מתמטיקה בדידה תאריך בחינה: _ 07/07/2015 משך הבחינה: 3 שעות סמ' _ב' מועד

מקביליות

PowerPoint Presentation

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

Microsoft Word - tutorial Dynamic Programming _Jun_-05.doc

מבוא למדעי המחשב - חובלים

Slide 1

המדריך המהיר לכתיבה של וירוס פשוט מאת דן בומגרד Bomgard( )Dan תוכן העניינים הקדמה... 2 דרישות מהתוכנית... 3 כלים... 3 תכנון כללי( Design (High Level..

PowerPoint Presentation

Microsoft Word - Ass1Bgu2019b_java docx

מבחן סוף סמסטר מועד ב 28/10/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים (כולל דף זה) ו

פתרון 2000 א. טבלת מעקב אחר ביצוע האלגוריתם הנתון עבור הערכים : פלט num = 37, sif = 7 r האם ספרת האחדות של sif שווה ל- num num 37 sif 7 שורה (1)-(2) (

Microsoft Word B

Microsoft PowerPoint - rec3.ppt

פייתון

דף נגזרות ואינטגרלים לשאלון 608 כללים למציאת נגזרת של פונקציה: n 1. y' n x n, y הנגזרת x.1 נכפול בחזקה )נרשום אותה משמאל ל- (. x א. נחסר אחד מהחזקה. ב

תיק משימטיקה מגרף הנגזרת לגרף הפונקציה להנגשה פרטנית נא לפנות: כל הזכויות שמורות

תכנון אלגוריתמים, אביב 1021, תרגול מס' 4 תכנון דינאמי תכנון דינאמי בתרגול זה נדון בבעיית הכפלת סדרת מטריצות (16.1.(CLR ראשית נראה דוגמא: דוגמא: תהינה

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

Slide 1

regular_expression_examples

סרגל כלים ל-Outlook או לExplorer- מדריך למשתמש

מבוא למדעי המחשב - חובלים

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

Slide 1

Slide 1

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

PowerPoint Presentation

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

Disclaimer מסמך זה הינו סיכום און-ליין של השיעור ולא עבר עריכה כלל. מצאת טעות? שלח/י לי מייל ואתקן: 07/05/2009 קורס: מערכות ה

Microsoft PowerPoint - CE_Candidates_2011.ppt [Compatibility Mode]

Microsoft PowerPoint - T-10.ppt [Compatibility Mode]

PowerPoint Presentation

PowerPoint Presentation

תכנות דינמי פרק 6, סעיפים 1-6, ב- Kleinberg/Tardos סכום חלקי מרחק עריכה הרעיון: במקום להרחיב פתרון חלקי יחיד בכל צעד, נרחיב כמה פתרונות אפשריים וניקח

Python 2.7 in Hebrew

מקביליות

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

ISI

Tutorial 11

<4D F736F F D20F9E9F2E5F820F1E9EEF0E920E7ECE5F7E4>

מבוא למדעי המחשב

PowerPoint Presentation

מבוא למדעי המחשב, סמסטר א', תשס"ח תרגול מס' 2

Microsoft Word - UsingXMTenvironment.rtf

תרגול מס' 7 – חזרה על MST ואלגוריתם Dijkstra

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

מדריך למרצים ומתרגלים 1

תכנות מונחה עצמים א' – תש"ע

Microsoft Word - ExamA_Final_Solution.docx

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

מבוא לתכנות ב- JAVA תרגול 11

מצגת של PowerPoint

<4D F736F F D20F4FAF8E5EF20EEE5F2E320E020F1EEF1E8F820E120FAF9F2E3>

עבודה במתמטיקה לכיתה י' 5 יח"ל פסח תשע"ה אפריל 5105 קשה בלימודים, קל במבחנים, קל בחיים עבודה במתמטיקה לכיתה י' 5 יח"ל פסח תשע"ה יש לפתור את כל השאלות

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

Slide 1

PowerPoint Presentation

BIG DATA תיאור הקורס המונח Big Data הולך וצובר תאוצה בשנים האחרונות, הוא הופך למגמה רווחת בתעשייה. המשמעות הפרקטית של המונח Big Data הינה טכנולוגיות נ

הגשה תוך שבוע בשעת התרגול

תמליל:

מאת רונן שוסטין )Antartic( ופלג הדר )P( הקדמה במאמר זה נסקור טכניקות אנטי-דיבאגינג מסויימות. כרקע אנו ממליצים לקרוא את מאמרו המצויין של Zerithבנושא מתוך :DigitalWhisper http://www.digitalwhisper.co.il/files/zines/0x04/dw4-3-anti-anti-debugging.pdf בנוסף כדי להבין לעומק את הנושאים עליהם נדבר במאמר אנו ממליצים להיעזר במקורות אלו: Intel x86 Instruction Set: בשנת 2009, במסגרת הכנס "2009,"IL-Hack פרסם השב"כ ארבעה אתגרים בתחום ה- Reverse Engineering- מסוג.CrackMe מטרת פרסום אתגרים אלו הייתה מציאת אנשים בעלי כשרונות בתחום ה- RE. לאחר פתירת כל אתגר הופיעה על המסך הודעה המבשרת על הצלחה ואליה מצורפת כתובת דואר אלקטרוני לשליחת קו"ח. האתגרים ממוספרים מ- 0 עד 3 על פי רמות הקושי. במאמר זה נתמקד באתגר האחרון מתוך הארבעה.)stage3.exe( http://www.intel.com/content/www/us/en/processors/architectures-software-developermanuals.htm MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ff818516%28v=vs.85%29.aspx כלים נדרשים: Ollydbg: http://www.ollydbg.de אין לייחס חשיבות לכתובות הזיכרון המופיעות במאמר, הן עלולות להשתנות מהרצה להרצה עקב מנגנון ה- ASLR הגורם לשינוי כתובת הבסיס בכל הרצה.

ניתוח התוכנית נפתח את Ollydbg ונטען את התוכנית.stage3.exe נתחיל לצעוד (Step) אותו. בקוד התוכנית ולהתחיל לנתח בתחילת התוכנית ניתן להבחין בהוראה INT 3 המשמשת לרוב דיבאגרים בתור נקודת עצירה: כאשר ההוראה מתבצעת, השליטה מועברת אל ה- Handler Exception ומשם נקבעת זרימת התוכנית. מפתחים נוהגים להשתמש בהוראה זו כטכניקת אנטי-דיבאגינג, משום שהרצה של הוראה זו בסביבת דיבאגר תגרום לו לזהות כי זו אחת מנקודות העצירה שהמשתמש קבע לו, ולכן לא יעביר את השליטה אל ה- Handler.Exception 2

המפתח יוכל לנצל עובדה זאת, ובעזרת משתנה שיתנהג כדגל (flag) שישתנה אך ורק אם השליטה הועברה אל ה- Handler Exception ניתן יהיה לזהות אם דיבאגר מצורף לתוכנית ולשלוט בזרימת התוכנית בהתאם. בדיקה דומה תבוצע בכל פעם שהשליטה תעבור אל ה- Handler,Exception ונזכיר זאת עוד בהמשך. נצרף דוגמא הממחישה את הבדיקה המבוצעת: int debugger_flag = 1; /* Assume a debugger is attached. */ try { asm { int 3; /* INT3 trap for the debugger. */ } } except (EXCEPTION_EXECUTE_HANDLER) { debugger_flag = 0; /* Debugger flag set if the control was passed to the exception handler. */ } if (1 == debugger_flag) MessageBoxA(NULL, "Debugger Detected", "Debugger Detected", MB_OK); כעת, נמשיך לעקוב אחר קוד התוכנית ולנתחו: ניתן לראות בקוד הוראות מסוג,INT 1 תפקיד הוראה זו הינו לייצר חריגה שונה מזו ש- 3 INT מייצר, אך מימוש האנטי-דיבאגינג בתוכנית זו זהה לגבי שתי ההוראות. נמשיך בניתוח התוכנית: 3

ניתן לראות כי ישנו קלט לארבעה משתנים בעזרת הפונקציה.scanf הפורמט המצופה על-ידי הפונקציה הינו ארבעה ערכים הקסדצימליים. בתרגום חופשי לשפת C, הקריאה לפונקציה scanf נראית כך: scanf("%x %x %x %x", &pass0, &pass1, &pass2, &pass3); כאשר ניתן לראות את כתובות המשתנים שנדחפים בסדר הפוך למחסנית: &pass0 = 0x01245508; &pass1 = 0x01245628; &pass2 = 0x01245500; &pass3 = 0x0124550C; נקבע נקודת עצירה מסוג חומרה Breakpoint(.)Hardware כאשר תתבצע קריאה מכל אחת מכתובות המשתנים הדיבאגר יעצור, וכך נוכל לעקוב בקלות ולראות אילו פעולות התוכנית מבצעת על הקלט שהכנסנו. כאמור, הפונקציה scanf מחזירה את מספר הארגומנטים אליהם המידע נקלט בהצלחה. ואכן ניתן לוודא זאת בהמשך הקוד, כאשר ישנה השוואה עם המספר ארבע. במידה והתנאי לא התקיים, נקפוץ לפונקציה אשר תודיע לנו כי הסיסמא שגויה, ולבסוף תזמן את יציאת התהליך.)ExitProcess( אם הקלט שהוכנס תאם ל- String,Format כלומר נקלטו ארבעה ערכים הקסדצימליים, התוכנית תמשיך לפעול. מכאן ואילך, נתייחס לסדר הסיסמאות בהתאם לסדר הקליטה מן המשתמש, כפי שניתן לראות בקריאה לפונקציה.scanf בהמשך ריצת התוכנית, ניתקל בהוראה הבאה: 4

ההוראה IN הינה הוראה מיוחסת Instruction( )Privileged מסוג.I/O במעבדי ה- x86 כל הוראות ה- I/O ניתנות להרצה ב- 0.Ring כאשר ננסה להריץ הוראה מסוג זו תחת רמה מיוחסת פחות )3,)Ring פעולה זו תגרום לזריקת חריגה )Exception( מסוג General Protection או,#GP מכאן תעבור השליטה אל ה- Exception Handler ותבוצע בדיקה דומה לזו שהדגמנו בתחילת המאמר. לקריאה נוספת על הנושא, אנו ממליצים לעיין בפרק I/O Privilege Level 15.5.1 בספר.Intel Manuals כאנשים המתעסקים בתחום ה- RE, השימוש בנקודות עצירה הינו חלק בלתי נפרד מתהליך הדיבאגינג, באתגר זה נתקלנו בקושי לעשות זאת ונסביר כעת ממה נבע קושי זה. ניתן להבחין בקריאה לפונקציה CreateThread מתוך ה- API של :Windows CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) 0x010C214A, NULL, 0, NULL); הקריאה לפונקציה תיצור Thread חדש אשר יריץ את הפונקציה הנמצאת בכתובת 0x10C214A הכתובות הוירטואלי של התהליך שקרא לפונקציה process( :)Calling במרחב אם נתעמק קצת בקוד הפונקציה, נגלה ארבעה קבועים בגודל ארבעה בתים כל אחד. חיפוש קצר בגוגל יביא אותנו למסקנה כי ישנו מימוש של אלגוריתם ה- MD5 בפונקציה. בהמשך הקוד מתבצעת השוואה בין שני Hash -ים,)Checksum( במידה והם אכן שווים, התוכנית תמשיך כהלכה, אחרת, נקבל את ההודעה המפורסמת: "Debugger Detected :)" ולאחר מכן תזומן הפונקציה.ExitProcess אז מה בעצם עומד מאחורי האלגוריתם הזה ומדוע אנחנו לא יכולים להשתמש בנקודות עצירה? 5

ההשוואה מתבצעת על Checksum של הקוד המקורי )כלומר, ללא שינויים( אל מול ה- Checksum של הקוד במצבו הנוכחי )ה- Section.)Code כאשר נשתמש בנקודת עצירה על הוראה מסויימת, הבית הראשון של האופקוד יתחלף ל- 0xCC )האופקוד של ההוראה.)INT 3 בעקבות זאת, כאשר יתבצע ה- Checksum הבא, הוא יהיה שונה מה- Checksum המקורי, דבר שיוביל לזיהוי הדיבאגר. הסיסמאות קודם לכן קבענו נקודות עצירה מסוג Hardware BP על כל אחת מכתובות המשתנים אליהם התבצע קלט הסיסמאות. העצירה הראשונה התבצעה בעת ניסיון קריאה מכתובת המשתנה אליו נקלטה הסיסמא השלישית. נראה כי ישנה קריאה לפונקציה sprintf עם המשתנה אליו קלטנו את הסיסמא השלישית: sprintf(buffer, "(:!!!%s!!!:)", pass2); בהינתן סיסמא,"ABCDEFFE" המחרוזת הסופית תיראה כך: (:!!!ABCDEFFE!!!:) ניתקל בקריאה הבאה לפונקציה: הפונקצייה הבאה הינה המימוש לאלגוריתם ה- MD5 עליו דיברנו קודם, היא מקבלת את הסיסמא השלישית ה'מקודדת' על-ידי sprintf והופכת אותו ל- Hash )פונקציית גיבוב קריפטוגרפית(. עקב השימוש ב- MD5 ניתן להסיק כי ה- String Format בפונקציית ה- sprintf הינו Salt שמטרתו היא למנוע את גילוי הסיסמא על-ידי שימוש ב- Tables Rainbow ו- Attack.Dictionary קריאה לפונקציה נוספת תחזיר מחרוזת המייצגת את ה- Hash שנוצר בפורמט הקסדצימלי: 6

בהמשך הקוד ניתן למצוא תבנית קוד מוכרת, היוצרת מחרוזת המייצגת Hash בפורמט הקסדצימלי. כך נראית המחרוזת שמחזירה הפונקציה )ה- Hash (: נראה כי לאחר מכן מתבצעת השוואה בין ה- Hash מקלט הסיסמא השלישית: הנוכחי שהוחזר ע"י הפונקציה לבין ה- Hash שנוצר ניתן לראות כי מתבצעת השוואה בין תוכן הבתים של כל אחת מן המחרוזות )המייצגות את ה- Hash -ים( כדי לבדוק האם הסיסמא שהקליד המשתמש נכונה. במידה והן אינן שוות, תופיע המחרוזת " Good Not!!!!" על המסך עם Dump של הזיכרון, אחרת, התוכנית תמשיך לרוץ כמתוכנן. בכדי למצוא את הסיסמא, נצטרך להשתמש ב- Force Brute מפני שהיא מיוצגת כ- Hash. 7

מה אנחנו יודעים על הסיסמא? יש בידינו את ה- Hash של הסיסמא המקורית..0xFFFFFFFF הסיסמא היא מספר הקסדצימלי בגודל ארבעה בתים, כלומר, הערך המירבי יהיה "(:!!!x%!!!:)" השתמשו בכדי להצפין את הסיסמא הינו: בו ה- Salt נוכל לכתוב כלי שיבצע Brute Froce ולפניכם הקוד: בהתחשב בנתונים שרשמנו לעיל. אנו בחרנו ב- Python למטרה זו, """ Written by Ronen Shustin and Peleg Hadar For Digital Whisper """ import hashlib i = 0 # Loop iterator. Also the hex number used for hashing. enc = "e86fc3e9768e63dbaa472df4f829a72c" # Hashed password to BF. buf = "" # Buffer. while (0xFFFFFFFF > i) : # The password is hexadecimal number, 4 bytes sized. pass4 = hex(i).rstrip("l").lstrip("0x") # Strip the '0x' from the hex number (iterator) and the 'L' if long. buf = hashlib.md5("(:!!!" + pass4 + "!!!:)").hexdigest() # Generates the MD5 hash with the salt. if (0 == (i % 15000000)) : # Indicator - print loop iterator every 15 million iterations. print hex(i) if (enc == buf) : # Checks if the generated hash is equal to the hashed password. print pass4 break i += 1 # Loop iterator increment. כאשר הרצנו את התוכנית על מחשב עם מעבד Core i5 בעל ארבע ליבות, התוכנית פיצחה את ה- Hash תוך 02:19:21 שעות ועצרה ב- 0xABCDDCBA, וכך מצאנו את הסיסמא השלישית. 8

נמשיך לעקוב אחרי התוכנית ונראה כי הדיבאגר יעצור בעת ניסיון קריאה מכתובת המשתנה אליו נקלטה הסיסמא הרביעית: נתרגם את האלגוריתם הבא לשפת C: int pass = *(0x01a550c); //User 4 th password. int final = 0xffffffff; //Final result. pass ^= 0x6f6f6f6f; final /= pass; pass *= 0x60672fa3; final = (0xf0f7c033 - pass); במידה ומנת החילוק שווה לאפס, פעולת הכפל באלגוריתם לא תשפיע על התוצאה הסופית, והיא תהיה שווה ל- 0xf0f7c033. במידה ומנת החילוק שווה לאחד, התוצאה תוכפל ב- 0x60672fa3 ותושם ב- pass. לאחר מכן ערכו של pass יחוסר מערכו של,final כלומר: איך נוכל להגיע למנת חילוק ששווה לאחד? final = (0xf0f7c033 - pass) = 0x90909090 כפי שראינו קודם, במקרה שלנו מנת החילוק תהיה שונה רק כאשר המחלק שווה למחולק, זאת מפני ש- 0xffffffff הינו המספר הגדול ביותר בטווח הנתון לנו )מספר הקסדצימלי בגודל ארבעה בתים(, אך איך נוכל להגיע למצב בו המחלק שווה למחולק? נסתכל על ההוראה הבאה מתוך האלגוריתם: pass ^= 0x6f6f6f6f נצטרך קלט שלאחר הוראת ה- XOR שלעיל יהיה שווה ל- 0xffffffff. 9

כיוון שהשימוש ב- XOR הינו סימטרי, נוכל למצוא את הקלט הנ"ל: 0xffffffff ^ 0x6f6f6f6f = 0x90909090 בסוף האלגוריתם, נדחפת תוצאת החישוב אל המחסנית והשימוש בה נעשה בהמשך הקוד. ניתן לראות כי כתובת הזיכרון של תוצאת החישוב נדחפת למחסנית, ומיד אחריה ישנה קריאה להוראת,RETN כלומר, זוהי הכתובת אותה המעבד יריץ )EIP( לאחר שיחזור מהפונקציה. הקלט של המשתמש לתוך כתובת החזרה, מאפשרת לו לשלוט על קוד התוכנית משום שהערכים שיקלטו יתורגמו ל- Opcodes. במקרה שלנו הערך 0xf0f7c033 יתורגם ל: ערכו של האוגר EAX שווה לאפס כתוצאה מ- XOR עם עצמו. לאחר מכן מתבצעת חלוקה באפס אשר תגרום לחריגה )Exception( מסוג Divide Error או.#DE הערך 0x90909090 יתורגם כמובן ל: דבר שימשיך את פעילות התוכנית בצורה תקינה, מכאן ניתן להסיק שהסיסמא היא 90909090. בהמשך התוכנית הדיבאגר יעצור בעת ניסיון קריאה מכתובת המשתנה אליו קלטנו את הסיסמא השנייה. ניתן להבחין בהשוואה ברורה של ערך המשתנה אליו קלטנו את הסיסמא השנייה עם הערך Wrong במידה וההשוואה נכשלת, ישנה קריאה לפונקציה שבסופה תופיע ההודעה.0xDEADBEAF,"Password" אחרת התוכנית תמשיך לפעול כמתוכנן. מכאן ניתן להסיק שהסיסמא השנייה הינה.DEADBEAF 01

נמשיך לעקוב אחר קוד התוכנית, ונראה כי הדיבאגר יעצור בעת ניסיון קריאה מכתובת המשתנה אליו קלטנו את הסיסמא הראשונה. ניתן לראות כי ישנה קריאה לפונקצייה GetCurrentProcessID מתוך ה- API של התהליך הקורא לפונקצייה process( )Calling בפורמט,Windows המחזירה את ה- PID של הקסדצימלי. נבחין מיד לאחר מכן בהשוואה של ערך המשתנה אליו קלטנו את הסיסמא הראשונה עם הערך שהחזירה הפונקציה, כלומר הסיסמא הראשונה אינה קבועה ומשתנה מהרצה להרצה. בפשטות,,stage3.exe להמיר אותו למספר הקסדצימלי, וכך מצאנו את הסיסמא של עלינו לבדוק מהו ה- PID הראשונה. לאחר הרצת התוכנית והרצת הקלטים הדרושים, נקבל את התוצאה הבאה: מזל טוב! סיכום במאמר ניתחנו את האתגר הרביעי תוך כדי סקירה של שיטות ה- Anti-Debugging אשר מומשו בתוכנית. עקבנו אחר זרימת הקוד, קבענו נקודות עצירה על כתובות משתני הקלט של הסיסמאות, שהובילו אותנו לאלגוריתמים אשר ביצעו בדיקות או מניפולציות על קלט הסיסמא, חקרנו את האלגוריתמים וכך לבסוף הגענו לארבע הסיסמאות. 00

קישורים לקריאה נוספת לקוראים המעוניינים להרחיב בנושאים עליהם כתבנו במאמר, מצורפת רשימה של קישורים שימושיים: Intel x86 Instruction Set: http://www.intel.com/content/www/us/en/processors/architectures-software-developermanuals.htm MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ff818516%28v=vs.85%29.aspx המאמר של זריף Anti-Debugging" Anti מתוך :Digital-Whisper http://www.digitalwhisper.co.il/files/zines/0x04/dw4-3-anti-anti-debugging.pdf סדרת המדריכים של lena151 למעוניינים להתחיל בEngineering :Reverse http://www.tuts4you.com/download.php?list.17 http://www.thelegendofrandom.com/blog הבלוג של,R4ndom כולל המון מדריכים: http://www.crackmes.de מאגר קראקמי )Crackme( בכל מיני רמות: 02