מבט על ניצול נקודות תורפה

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

לפני שתתחיל

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

זה לא הולך להיות תרחיש עולמי אמיתי

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

אנחנו יוצאים לטיול בשנות ה -80

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

יתכן שזה לא עובד על המעבד שלך

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

מה זה הצפת מאגר

כדי לענות על זה עלינו להבין תחילה את המחצית הראשונה של שילוב זה.

חוצצים

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

שטף יתר מתרחש, כשמו כן הוא, כאשר חיץ מתמלא במידע רב יותר מכפי שהוא יכול להכיל. אבל למה זה חשוב?

לערום

הידועים גם בשם ערימות, הם סוג נתונים מופשט בו אנו יכולים לַעֲרוֹם מידע, המאפיין העיקרי שלהם הוא שיש להם סדר LIFO (האחרון בהתחלה). בואו נחשוב שנייה על ערימת צלחות, שמנו אותם על גבי אחד אחד ואז נוציא אותם אחד אחד מלמעלה, זה הופך את הצלחת האחרונה ששמנו (זו שנמצאת למעלה ) היא הצלחת הראשונה שאנחנו הולכים להוציא, ברור שאם נוכל להוציא רק צלחת אחת בכל פעם ואנחנו מחליטים לעשות את זה בסדר הזה: P.

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

מצביעים

זהו מושג שמשגע מתכנתים רבים כשהם מתחילים בעולם ה- C, למעשה הכוח הגדול של תכנות C נובע בחלקו משימוש במצביעים. כדי שיהיה פשוט, מצביע מצביע על כתובת זיכרון. זה נשמע מורכב, אבל זה לא כל כך מורכב, לכולנו יש זיכרון RAM במכונות שלנו, נכון? ובכן, ניתן להגדיר זאת כ- סידור רצוף של בלוקים, מיקומים אלה מתבטאים בדרך כלל במספרים הקסדצימאליים (מ- 0 עד 9 ואז מ- A עד F, כגון 0x0, 0x1, 0x6, 0xA, 0xF, 0x10). כאן כהערה מוזרה, 0x10 לא שווה ל -10 😛 אם אנו ממירים אותו לסדר עשרוני זה יהיה כמו לומר 15. זה משהו שגם מבלבל יותר מאחד בהתחלה, אבל בואו נרד לזה.

רשומות

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

עכשיו תתאמן

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

Gdb

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

retinput.c

שֶׁלוֹ. כריסטופר דיאז ריברוס

זו תוכנית די פשוטה, אנחנו הולכים להשתמש בספריה stdio.h כדי להיות מסוגל להשיג מידע ולהציגו בטרמינל. אנו יכולים לראות פונקציה הנקראת return_input שמייצר א חיץ קרא מערך, שאורכו 30 בתים (סוג הנתונים של char הוא באחד בתים).

הפונקציה gets(array); בקש מידע לפי קונסולה ופונקציה printf() מחזיר את תוכן המערך ומציג אותו על המסך.

כל תוכנית שנכתבת ב- C מתחילה בפונקציה main(), זה יהיה אחראי רק על קריאת return_input, עכשיו אנחנו הולכים להרכיב את התוכנית.

שֶׁלוֹ. כריסטופר דיאז ריברוס

בוא ניקח קצת ממה שעשיתי זה עתה. האפשרות -ggdb אומר ל- gcc לחבר את התוכנית עם מידע ש- gdb יוכל לבצע ניפוי נכון. -fno-stack-protector זוהי אפשרות שברור שאסור לנו להשתמש בה, אלא בה אנו הולכים להשתמש כי אחרת ניתן יהיה ליצור את הצפת החיץ בערימה. בסוף בדקתי את התוצאה. ./a.out הוא פשוט מריץ את מה שרקחתי, הוא מבקש ממני מידע ומחזיר אותו. ריצה 🙂

אזהרות

הערה נוספת כאן. אתה יכול לראות את האזהרות? ברור שזה משהו שיש לקחת בחשבון כשאנחנו עובדים עם קוד או לקמפל, זה קצת מובן מאליו ויש מעט תוכניות שהיום יש להם את הפונקציה gets() בקוד. יתרון אחד של ג'נטו הוא שעל ידי הרכבת כל תוכנית אני יכול לראות מה לא בסדר, תוכנית "אידיאלית" לא צריכה להיות להם, אך תתפלאו כמה תוכניות גדולות מכילות את האזהרות הללו מכיוון שהן פשוט גדולות מאוד והיא קשה לעקוב אחר פונקציות מסוכנות כאשר יש אזהרות רבות בו זמנית. עכשיו אם נמשיך

ניפוי באגים בתכנית

שֶׁלוֹ. כריסטופר דיאז ריברוס

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

מנתק את הקוד

נתחיל בבדיקה בתכנית השפה המכונה שלנו.

שֶׁלוֹ. כריסטופר דיאז ריברוס

זהו הקוד של הפונקציה העיקרית שלנו ב- עצרת, זה מה שהמעבד שלנו מבין, השורה משמאל היא הכתובת הפיזית בזיכרון, ה- <+ n> ידוע כ לקזז, בעצם המרחק מתחילת הפונקציה (הראשי) לאמירה זו (המכונה opcode). ואז אנו רואים את סוג ההוראה (push / mov / callq ...) ורשום אחד או יותר. בסיכום אנו יכולים לומר שזו האינדיקציה ואחריה המקור / מוצא והיעד. <return_input> מתייחס לפונקציה השנייה שלנו, בואו נסתכל.

תשואה_קלט

שֶׁלוֹ. כריסטופר דיאז ריברוס

זה קצת יותר מורכב, אבל אני רק רוצה שתבדוק כמה דברים, יש תג שנקרא <gets@plt> ואופקוד אחרון שנקרא retq המציין את סוף הפונקציה. אנחנו הולכים לשים כמה נקודות עצירה, אחת בפונקציה gets ועוד אחד ב retq.

שֶׁלוֹ. כריסטופר דיאז ריברוס

הפעלה

כעת אנו מפעילים את התוכנית כדי לראות כיצד הפעולה מתחילה.

שֶׁלוֹ. כריסטופר דיאז ריברוס

אנו יכולים לראות שמופיע חץ קטן המציין את קוד הקוד בו אנו נמצאים, אני רוצה שייקחו בחשבון את הכיוון 0x000055555555469b, זו הכתובת לאחר השיחה אל return_input בתפקוד main , זה חשוב מכיוון שכאן התוכנית אמורה לחזור כשתסיים לקבל את ה- קלטבואו ניכנס לפונקציה. עכשיו אנחנו הולכים לבדוק את הזיכרון לפני שנכנס לפונקציה gets.

שֶׁלוֹ. כריסטופר דיאז ריברוס

העליתי את הפונקציה העיקרית עבורך והדגשתי את הקוד אליו התייחסתי, כפי שאתה יכול לראות, עקב אנדיאניות הופרד לשני קטעים, אני רוצה שהם יתחשבו בכיוון 0x7fffffffdbf0 (הראשון משמאל אחרי הקומנדו x/20x $rspמכיוון שזה המיקום שעלינו להשתמש בו כדי לבדוק את תוצאות ה- get, בואו נמשיך:

שוברים את התוכנית

שֶׁלוֹ. כריסטופר דיאז ריברוס

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

שינוי מסלול החזרה

עכשיו, אחרי שהצלחנו להזין את החלק הזה של הקוד שבו הוא מציין את חזרת הפונקציה, בואו נראה מה יקרה אם נשנה את הכתובת 🙂 במקום ללכת למיקום האופקוד שעוקב אחר זה שהיה לנו לפני רגע, מה אתה חושב אם נחזור return_input? אבל בשביל זה, יש צורך לכתוב את הכתובת הרצויה בבינארי, אנחנו הולכים לעשות את זה עם הפונקציה printf מ- bash 🙂

שֶׁלוֹ. כריסטופר דיאז ריברוס

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

השתקפויות

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

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


14 תגובות, השאר את שלך

השאירו את התגובה שלכם

כתובת הדוא"ל שלך לא תפורסם. שדות חובה מסומנים *

*

*

  1. אחראי לנתונים: מיגל אנחל גטון
  2. מטרת הנתונים: בקרת ספאם, ניהול תגובות.
  3. לגיטימציה: הסכמתך
  4. מסירת הנתונים: הנתונים לא יועברו לצדדים שלישיים אלא בהתחייבות חוקית.
  5. אחסון נתונים: מסד נתונים המתארח על ידי Occentus Networks (EU)
  6. זכויות: בכל עת תוכל להגביל, לשחזר ולמחוק את המידע שלך.

  1.   2p2 דיג'ו

    להיות ישיר יותר. כתוב פחות והתמקד במה שחשוב

    1.    ChrisADR דיג'ו

      היי, תודה על התגובה.

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

      לגבי

      1.    אנונימי דיג'ו

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

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

        אגב, אני אומר לך כביקורת בונה, אני אוהב את הנושאים האלה והייתי רוצה שתמשיך לכתוב מאמרים, מזל טוב!

    2.    אנונימי דיג'ו

      אני חושב אותו דבר.

      1.    ChrisADR דיג'ו

        תודה רבה לשניהם !! בהחלט קשה להבין איך להגיע לקהל היעד כאשר האמת היא שמספר האנשים עם רמת תכנות מתקדמת שקוראים מאמרים אלה הוא מועט (לפחות ניתן להסיק על סמך ההערות)

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

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

        לגבי

  2.   מריו דיג'ו

    היכן תוכל לברר פרטים נוספים על הנושא? יש ספר מומלץ?

    1.    ChrisADR דיג'ו

      הדוגמה שקיבלתי מהמדריך של Shellcoder מאת כריס אנלי, ג'ון היסמן, פליקס לינדר וג'רארו ריצ'רטה, אך על מנת לבצע את התרגום של 64 סיביות הייתי צריך ללמוד על הארכיטקטורה שלי, המדריך למפתחים אינטל, כרכים 2 ו- 3 הם מקור די אמין לכך. זה טוב גם לקרוא את תיעוד ה- GDB, שמגיע עם הפקודה 'מידע gdb', כדי ללמוד הרכבה ו- C יש הרבה ספרים טובים מאוד, למעט שספרי האסיפה הם קצת ישנים ולכן יש פער למלא עם ספר נוסף תיעוד סוג.

      ה- shellcode עצמו כבר לא יעיל בימינו מסיבות שונות, אך עדיין מעניין ללמוד טכניקות חדשות.

      מקווה שזה קצת יעזור reet ברכות

  3.   פרנץ דיג'ו

    Buen artículo, el viejo blog desdelinux ha vuelto a renacer =)
    כשאומרים פגז מרוחק לא כל כך יעיל, אתה מתכוון לאמצעי נגד שנועדו למתן התקפות, הם קוראים לזה אבטחה פוגענית.
    ברכות והמשיכו כך

    1.    ChrisADR דיג'ו

      תודה רבה לך פרנץ words מילים חביבות מאוד, למעשה התכוונתי ש- Shellcoding היום הוא הרבה יותר מורכב ממה שאנחנו רואים כאן. יש לנו את ה- ASLR (מחולל מיקום זיכרון אקראי) את מגן הערימה, את האמצעים והמצעדים השונים המגבילים את מספר האופקודים שניתן להזריק לתוכנית, וזו רק ההתחלה.

      בברכה,

  4.   תוכנה חינם דיג'ו

    שלום, האם תעשה חלק נוסף בהרחבת הנושא? זה מעניין

    1.    ChrisADR דיג'ו

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

      ברכות, ותודה על השיתוף

  5.   קקטוס דיג'ו

    טוב מאוד צ'ה! אתה תורם הודעות מעולות! שאלה אחת, אני מתחיל את אבטחת ה- IT בקריאת ספר בשם "הבטחת אבטחה באמצעות בדיקת עטים". האם ספר זה מומלץ? איך אתה מציע שאתחיל לברר בנושאים אלה?

    1.    ChrisADR דיג'ו

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

  6.   אייצן דיג'ו

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