PracticU

כתובות זיכרון באסמבלר ובשפת מכונה

בלי כתוביותעם כתוביות
PracticU › קורס סייבר למתחילים - Hacking - בדיקות חוסן תשתיתי ופריצה ל-Windows 10/11 - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP › כתובות זיכרון באסמבלר ובשפת מכונה
מילון מושגים:
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
תנאי - ביטוי לוגי בקוד שתוצאתו אמת או שקר, וקובע אילו פקודות יתבצעו בהתאם לערכו.
הערה - טקסט בקוד שמסביר אותו לבני אדם ואינו מבוצע על ידי המחשב.
הקסדצימלי - שיטת ספירה בבסיס 16, המשתמשת בספרות 0-9 ובאותיות A-F, ונפוצה לייצוג ערכים בינאריים בקצרה.

כתובות זיכרון באסמבלר ובשפת מכונה

בשיעור זה אנו מגלים מדוע הוספת פקודות באסמבלר מסוכנת, מפני שהיא מזיזה את כל הכתובות בזיכרון ושוברת את הלולאות והתנאים, לומדים כיצד לתקן את הקפיצות היחסיות, ומכירים את הדרך הנכונה לעשות זאת באמצעות תוויות וקומפילציה מחדש.
נושאי הסיכום המוצגים בשיעור:
1. נושא השיעור: בהרצאות הקודמות הוספנו פקודות חדשות ברמת האסמבלר וברמת שפת המכונה, והתברר שזה מזיז את כל הכתובות בזיכרון, והיינו מאוד במזל שהכל עדיין עבד, ובשיעור זה נבין למה וכיצד להתגבר על הבעיה.
2. מעבר לכלי גרפי חי: לוקחים את קוד שפת המכונה המנוקה מהערות ומתווים מיותרים, מורידים את הקידומת של בסיס הקסדצימלי ואת הפסיקים כך שנותרים רק מספרים, ומעבירים אותם לאתר שמבצע דיסאסמבלר חי שמפרש את שפת המכונה חזרה לשפת אסמבלר.
3. יתרונות ההדמיה: הכלי מציג את הקוד עם חצים שמראים את זרימת הביצוע ואת הלולאות, ובנוסף מציע תצוגת גרף של בלוקים שהיא בט של אותו קוד מזווית אחרת.
4. הדוגמה שלנו: פקודת השוואה של הרגיסטר AL למספר 61, ואם AL קטן מ-61 מבוצעת קפיצה לכתובת 37, ואם הוא גדול ממנו מבוצעת הורדת 20 מ-AL וממשיכים הלאה, וזהו תנאי פשוט לחלוטין.
5. מה קורה כשמוסיפים פקודות: כשמוסיפים באמצע הקוד שתי פקודות נופ, פקודות שלא עושות דבר, כל הקוד שאחריהן נדחף קדימה אך הכתובת שאליה מקפצת הפקודה נשארת קבועה, וכתוצאה מכך הלוגיקה נשברת והורדת ה-20 מתבצעת תמיד במקום לפעמים בלבד.
6. תיקון הקפיצה היחסית הקדימה: הפקודה בשפת המכונה מכילה את קוד הפעולה של הקפיצה ואת מספר הבתים שיש לדלג קדימה, ומכיוון שהוספנו שני בתים של נופ, יש להגדיל את מספר הבתים לדילוג משניים לארבעה, וכך הלוגיקה חוזרת לתפקד כרגיל.
7. הבעיה הנוספת, לולאה חיצונית: גם לאחר התיקון המקומי יש חץ נוסף שמגיע מלמעלה, משום שהבלוק הזה הוא חלק מתוך לולאה כללית, וגם את הקפיצה האחורה של הלולאה צריך להתאים למיקום החדש.
8. תיקון הקפיצה האחורה: הפקודה בשפת המכונה מציינת קפיצה אחורה של כחמישים בתים, ומכיוון שהוספנו שני בתים יש להפחית שניים מהמספר הזה, ואם איננו בטוחים במשמעות הפקודה ניתן להעתיק אותה לדיסאסמבלר ולראות שהיא מפורשת כקפיצה אחורה בבתים מסוימים.
9. המורכבות של התהליך: כל פעם שמוסיפים פקודה יש לבדוק כמה חצים סביבה, כלומר בכמה תנאים ולולאות היא משתתפת, ולהתאים את כל הכתובות היחסיות, מכיוון שכל הקפיצות הן דילוגים יחסיים מהמיקום הנוכחי ולא כתובות מוחלטות, והבדיקה הסופית היא שכל חץ מגיע לאותה פקודה שאליה הגיע במקור.
10. אף אחד לא עושה את זה ידנית: התהליך הידני הזה מסובך מדי והוא הוצג רק לצורך הבנת העבודה של האסמבלר ושפת המכונה, ואף אחד במציאות אינו משנה ידנית פקודות בשפת המכונה.
11. הדרך הנכונה, עבודה באסמבלר עם תוויות: לוקחים את כל הפקודות המפורשות בשפת האסמבלר, משנים אותן בסביבת פיתוח שתומכת באסמבלר, משתמשים בתוויות במקום כתובות, למשל קפיצה לתווית מסוימת, ובזמן הקומפילציה האסמבלר מחשב לבד את הדילוגים בבתים ומייצר את שפת המכונה המתוקנת.
12. העיקרון של קומפילציה חזרה: תהליך נכון הוא לקחת את שפת המכונה, להפוך אותה לאסמבלר, לשנות את מה שרוצים ברמת האסמבלר, לקמפל חזרה לשפת מכונה ולהשתמש בפלט החדש כ-payload, כי האסמבלר מנהל אוטומטית את התוויות ואת החישובים.
13. מדוע השינויים הקודמים שלנו עבדו: הפקודה שפיצרנו בעבר לשתי פקודות, הוספת שבע והוספת שש, לא הייתה חלק מאף לולאה ומאף תנאי, ולכן לא היו חצים סביבה, וכל הלולאות סביב היו יחסיות לעצמן ולא הושפעו מהשינוי.
14. הלקח המרכזי: כאשר מוסיפים פקודות באסמבלר חובה לבדוק את כל החצים שמסביב ולהזיז את הכתובות היחסיות בהתאם, כדי שהלוגיקה של הקוד תישאר זהה לקוד המקורי, והיה לנו פשוט מזל בהרצאות הקודמות שהשינויים בוצעו מחוץ ללולאות ולתנאים.
לסיכום, בשיעור זה הבנו לעומק כיצד פועלות הכתובות היחסיות בשפת המכונה ובאסמבלר, מה קורה כשמוסיפים פקודות באמצע לולאה או תנאי, כיצד מתקנים את הקפיצות בידיעה מלאה של הבתים, ומדוע בפועל עדיף לשנות ברמת האסמבלר עם תוויות ולקמפל מחדש במקום לתפעל ידנית את שפת המכונה. SR12510HE

פרקי ההרצאה: כתובות זיכרון באסמבלר ובשפת מכונה

  1. 00:00

    סכנת הזזת כתובות בזיכרון

  2. 01:00

    ניקוי הקוד לכלי דיסאסמבלר

  3. 02:40

    דיסאסמבלר ויזואלי עם גרף

  4. 03:22

    תנאי וקפיצה לפי רגיסטר AL

  5. 05:17

    הוספת פקודות NOP בזיכרון

  6. 07:28

    תיקון כתובת הקפיצה היחסית

  7. 09:00

    כתובות יחסיות בלולאות ותנאים

תמלול ההרצאה: כתובות זיכרון באסמבלר ובשפת מכונה

הטקסט המלא של הדקות הראשונות בהרצאה «כתובות זיכרון באסמבלר ובשפת מכונה» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

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

  2. 00:18

    הוספנו פקודה חדשה לקובץ ברמת אסמבלר, זאת אומרת היה לנו פה 77 והוספנו עוד פקודה, פיצלנו אותו ל-70 ועוד 7 והוספנו עוד פקודה. מה הבעיה שזה הזיז לנו את כל הכתובות בזיכרון והאמת היה לנו מזל שכל זה עובד.

  3. 00:36

    אני אראה לכם למה זה יכול לגרום ואיך להתגבר על הבעיה הזאת. בואו נתחיל מזה שנעביר את הכל לכלי יותר גרפי שיראה לנו את כל הקוד הזה בצורה יותר גרפית.

  4. 00:49

    אז אני לוקח אותו בלי cc, בלי הפאוזה הזאת שעשיתי. את הקוד מקור עצמו, כולל השינויים שלנו. זה פחות חשוב השינויים. בואו ננקה אותו.

  5. 01:01

    למה אני צריך לנקות אותו? כי אני רוצה להעביר אותו לאתר הזה ופה הוא מפרש את הפקודות בשפת מכונה רק לפי מספרים, הוא לא צריך את כל ה-0x הזה, יבלבל אותו. אז ככה, אז אנחנו רוצים רק מספרים, אז בואו נוריד את כל ההערות שלנו, שזה לא יבלבל אותו.

  6. 01:21

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

  7. 01:47

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

  8. 02:12

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

  9. 02:29

    בואו נכניס את הזה שלנו ונגיד לו שזה הולך להיות x86 64 ביט יופי יופי בואו ניתן לו דיסאסמבלר הנה הוא הופך את זה לקוד שלנו אתם רואים פירש את האותיות את המספרים fc48 83 הוא פירש את הכל לשפת אסמבלר זאת שפת מכונה פירשנו לשפת אסמבלר ולמה אני אוהב את הכלי הזה כי הוא מראה לי פה חצים ואומר לי לדוגמה שזה קופץ מפה לשם

  10. 02:58

    בואו תראו מה שקורה פה שהפקודה הזאת, מה היא עושה? אולי נוכל לראות את זה גם בגרף. גרף זה מבט אחר על אותו קוד, פשוט כבלוקים, זה בדיוק אותו דבר.

  11. 03:11

    אנחנו יכולים לראות פה שהוא משווה את ה-AL, את הרגיסטר, את המשתנה בזיכרון, שהוא צמוד למעבד, את הרגיסטר AL למספר 61. אם AL פחות מ-61, אתם רואים? Jumpless, פחות מ-61, הוא יקפוץ לכאן.

  12. 03:29

    אם הוא יותר מ-61, הוא לא יקפוץ הוא ייקח את האדום הוא לא יקפוץ וייבצע פקודה של תוריד מ-AL 20 ואז תמשיך הלאה זאת אומרת שאם במשתנה AL ברגיסטר AL יש מספר מעל 61 הוא מוריד לו 20 ואז ממשיך אם הוא פחות מ-61 אם הוא פחות מ-61 הוא לא יוריד 20 אלא ישר

  13. 03:54

    ידלג לכאן זאת אומרת זה סתם איזשהו תנאי כזה אם זה יותר מ-61 תוריד לו 20 ואז תמשיך אם זה פחות מ-61 אל תוריד כלום. Jumpless תקפוץ אם זה פחות מ-61. קוד נורא פשוט.

  14. 04:09

    עכשיו אני הולך להוסיף לו פה פקודה. עכשיו, איפה הבעיה? הבעיה היא שהוא מקובע פה לכתובת בזיכרון, לכתובת 37. זאת אומרת, הוא משווה AA ל-61 ומדלג לכתובת 37.

  15. 04:24

    מה יקרה אם אני אכניס פה דברים? נניח אני אכניס פה איזושהי פקודה כאן בדיוק, בכתובת 35, בואו נראה את זה כאן. זה אותו דבר, אתם רואים?

  16. 04:35

    פשוט כאן הגרפיקה היא ככה עם חצים פה בצד. אתם רואים? הוא משווה AL ל-61. אם זה Jumpless קופץ לכתובת 37, ואם זה לא, פחות מ-61, אז הוא יוריד 20 ואז ימשיך כאן.

  17. 04:49

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

  18. 05:00

    כתובת 37, הכל יזוז למטה, נכון? ואז הפקודה הזאת שהייתה ב-35 היא תהפוך ל-37 כי הכל יזוז. הזיכרון לא זז, אני פשוט בתוך הזיכרון מזיז דברים ודופק את כל הג'אמפים.

  19. 05:15

    בואו נראה איך זה קורה בפועל. בואו נחפש 7C02 פה. אני אלך לכאן, אני לוחץ קונטרול F, 7C02. איפה ה-7C02? צריך רק רווח לעשות פה. הנה, 7C02.

  20. 05:31

    זו הפקודה בשפת מכונה. רגע רגע רגע זה 2C20 לא 02 הנה 2C20 ואחרי זה 41C1C90D 41C1C90D יופי אני לוקח פה ומוסיף פקודה איזה פקודה? פקודה בשפת מכונה שלא עושה כלום יש פקודה שנקראת נופ שאומרת אל תעשה כלום הנה הוספתי שני נופים אתם רואים? נופ הזה זה בשפת אסמבלר אל תעשה כלום סתם דלג הלאה הוספתי שני נופים ותראו מה קרה

  21. 06:04

    אם AL פחות מ-61, הוא משווה אותו, קומפר AL ל-61, קומפר, משווה ביניהם, עושה ג'אמפ לס, קופץ ל-37.

  22. 06:14

    הכתובת נשארה, אבל שימו לב, עכשיו הוא תמיד יבצע את הפקודה של הורדה של ה-20. הוא ידלג על הנופים, הבנתם? בואו אני אראה לכם עוד פעם.

  23. 06:23

    תראו מה היה, היה ככה, תסתכלו כאן. הוא היה לפעמים עושה את הפקודה שלו, הורדת ה-20, ולפעמים לא. לפעמים הוא היה מדלג עליה. עכשיו הוא תמיד יעשה אותה.

  24. 06:36

    ככה זה היה במקור, jumpless, קופץ לפה ולא מבצע את הפקודה הזאת כל פעם, אלא רק אם הוא מעל 61 באקסה. עכשיו תסתכלו איפה הבעיה עוד פעם.

  25. 06:49

    ברגע שאני מוסיף שני נופים שלא עושים כלום, הפקודה הזאת תזוז לכאן והיא תתבצע תמיד. למה? כי הכתובות, כי הפקודות קפיצה, שזה כל הלולאות, כל התנאים, מקובל לכתובת פיזית בזיכרון. אתם רואים? 37.

  26. 07:01

    תראו מה קרה. הופה. אתם רואים התפספו פה שני נופים זה זז למטה אבל הכתובת לא זזה עכשיו מה אני צריך לעשות כדי שההיגיון של התוכנה יישאר למרות שהוספתי שני דברים להגיד לו לקפוץ לא ל-37 אלא ל-39 להוסיף לו עוד שניים בקפיצה זאת אומרת שאם הוספתי פה פקודה חדשה באמצע עכשיו אני צריך להוסיף לכאן את הכתובת בעצם להזיז אותה מ-7C02 להזיז את הקפיצה מכאן

  27. 07:35

    שיקפוץ כבר לא ל-37 אלא ל-39. אז זה 7C02. אז הפקודה הזאת של 7C02, זאת זאת, צריך להגיד לה, תקשיבי, אל תקפצי עכשיו לכתובת 37, תקפצי ל-39.

  28. 07:52

    עכשיו, מה שקורה זה פה ש-7C זה פקודת ג'אמפ, ו-02 זה כמה בתים לקפוץ קדימה. הוא היה מדלג על שני בתים. אתם רואים, הוא היה מדלג על 2C20 על שני בתים.

  29. 08:05

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

  30. 08:12

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

  31. 08:23

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

  32. 08:48

    דלג שני בתים זה כתובות יחסיות בג'אמפ והכל זז כי פתאום שהוא מדלג על שני בתים הוא מדלג על השניים הישנים ואני הוספתי עוד שניים חדשים אז צריך לדלג על ארבע אז צריך להיות מודעים לזה עכשיו אתם חושבים שפתרנו את כל הבעיה?

  33. 09:05

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

  34. 09:23

    וגם פה בצד שמאל, אתם רואים, יש עוד דילוג. הקו הזה אומר שזה כאילו חלק מלולאה או חלק

לקורס המלא: קורס סייבר למתחילים אונליין

ההרצאה הקודמת: Metasploit Meterpreter - Reverse Https vs Defender

ההרצאה הבאה: הסבר על UAC

הרצאות קשורות מקורסים אחרים

  • תרגיל + פתרון - חישוב כתובות IP ברשת
  • סוגי זיכרון בשרת SQL
  • ניהול זיכרון במחשב - Paging
  • שליפת כל הסיסמאות של הארגון - מתוך זיכרון של DC

קורסים נוספים במסלול

  • קורס SOC - מיישם הגנת סייבר
  • קורס פריצה ומבדקי חדירה לתשתית ארגונית - בדיקות חוסן מתקדמות ל-Active Directory - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס פריצה ומבדקי חדירה לאתרי אינטרנט - בדיקות חוסן לאתרים - Web Pentesting - קורס זה נדרש למבחן ההסמכה היוקרתי OSCP
  • קורס סייבר והאקינג ל-Android - פריצה לטלפונים ואפליקציות אנדרואיד - בודק חוסן - Mobile App Pentesting