ABA


"משהו נחמד לגבי קוד פולימורפי ו- Windows 7"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15788 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15788
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   21:04   30.03.10   
אל הפורום  
  משהו נחמד לגבי קוד פולימורפי ו- Windows 7  
 
   היי חברים
הרבה זמן לא כתבתי פה, ואין לי הרבה זמן כרגע,
אבל גיליתי משהו נחמד שרציתי לחלוק אתכם. אין לי כוח למצוא את הסיסמה
לבלוג הישן שהתחלתי לכתוב בנושאים הטכניים האלה, אז אני פשוט אכתוב כאן

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

אני לא לגמרי מסכים עם ההגדרה בויקיפדיה, כי קוד פולימורפי הוא לא בהכרח Malware. גם Google Desktop מצפינים את הקוד שלהם, והתוכנה שלהם היא בטח לא Malware
אבל הרעיון הוא, שאפשר לכתוב קוד שיראה מוצפן כאשר ינסו לבצע לו Reverse Engineering - אך הקוד יעבוד היטב מכיוון שהוא יעבור פענוח on demand
כלומר, בכל כניסה לפונקציה יהיה איזשהו prologue שיפענח את הפונקציה, ובסיומה יהיה epilogue שיצפין אותה חזרה.

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

נניח שלדוגמה יש את הקוד הפשוט הבא:


void test() {
size_t size = 0;
byte* thisFunc = encryptDecrypt(size);

printf("Test-> Now on printf, successfully printed!\n");

FUNCTION_EPILOG();
encryptDecryptEx(thisFunc, size);
}

לצורך הפשטות - FUNCTION_EPILOG הוא מאקרו שמגדיר 5 פעמים את האופקוד nop, על מנת לזהות את סוף הפונקציה לצרכי ההצפנה:


#define FUNCTION_EPILOG() { _asm nop \
_asm nop \
_asm nop \
_asm nop \
_asm nop }

פונקציות ההצפנה(אם אפשר לקרוא לזה ככה, לצורך הפשטות, xor ff):


byte* encryptDecrypt(size_t &size) {
byte* codeToEncrypt;
__asm {
push eax
mov eax, [ebp]+4
mov [codeToEncrypt], eax
pop eax
}

size = .. ; /* find size by locating the 5 nops */

encryptDecryptEx(codeToEncrypt, size);

return codeToEncrypt;
}

void encryptDecryptEx(byte* code, size_t size) {
byte* ptr = code;
DWORD old = 0;
VirtualProtect((LPVOID)ptr, size, PAGE_EXECUTE_READWRITE, &old) == 0;
/* should, of course, check the return value of VirtualProtect and stuff... */

for (size_t i = 0; i < size; ++i) {
*ptr ^= 0xFF;
ptr++;
}
}

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

עכשיו - הדבר המעניין.
אם תנסו להריץ את הקוד הנ"ל עם גודל קטן, נניח של 4 בתים(שאותם תקסרו ff מראש, באמצעות hex workshop או כל תוכנה דומה) סביר שהכל יעבוד... אבל מה יקרה אם תנסו עם גודל גדול יותר?

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

מהו ASLR?

Address space layout randomization (ASLR) is a computer security technique which involves randomly arranging the positions of key data areas, usually including the base of the executable and position of libraries, heap, and stack, in a process's address space.

ב- Windows 7 יש מנגנון שנועד בעיקרו למנוע ניצול של חולשות Buffer
Overflow, שבעת הפעלה של קובץ PE(exe, dll) מערכת ההפעלה משנה את ה
Base Address של הקובץ, ובהתאם, משנה את כתובות כל הפונקציות בתוכנית.

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

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

אותה התוכנית בדיוק תעבוד על Windows XP לדוגמה...

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

יום טוב

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  Nעניין מאוד.. תודה! Nesher  30.03.10 22:20 1
  תודה על השיתוף, באמת מעניין. (ל''ת) men123 30.03.10 22:38 2
  תודה RaiDEN 31.03.10 01:13 3
  הרחבה בנושא.. MiP 31.03.10 04:34 4
     :) ראיתי את זה לא מזמן, Sn00py  31.03.10 10:54 6
  התגעגעתי למאמרים שלך לירן :) ronen333  31.03.10 09:34 5
  נחמד מאד תודה על המאמרון :) Net_Boy  31.03.10 22:41 7
  נחמד מאוד, שווה קריאה - תודה. Deuce  02.04.10 17:20 8

       
Nesher  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 2.7.02
2 הודעות, 24 פידבק
   22:20   30.03.10   
אל הפורום  
  1. Nעניין מאוד.. תודה!  
בתגובה להודעה מספר 0
 


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
men123
חבר מתאריך 3.10.05
6269 הודעות
   22:38   30.03.10   
אל הפורום  
  2. תודה על השיתוף, באמת מעניין. (ל''ת)  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
RaiDEN

   01:13   31.03.10   
אל הפורום  
  3. תודה  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
MiP
חבר מתאריך 24.5.05
782 הודעות
   04:34   31.03.10   
אל הפורום  
  4. הרחבה בנושא..  
בתגובה להודעה מספר 0
 
   אם זה מעניין אותך אני יכול להפנות אותך למאמר קטן שמסביר על שיטות
שבהן ניתן לעקוף את מנגנוני האבטחה של חלונות 7(ASLR AMD DEP).

הכותב הוא חוקר אבטחה בשם Peter Vreugdenhil מהולנד אשר כתב
אקספלויט(במסגרת התחרות Pwn2Own) המסוגל לנצל חולשה בדפדפן IE8 תחת מערכת ההפעלה Windows7/64bit.

http://vreugdenhilresearch.nl/Pwn2Own-2010-Windows7-InternetExplorer8.pdf



                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   10:54   31.03.10   
אל הפורום  
  6. :) ראיתי את זה לא מזמן,  
בתגובה להודעה מספר 4
 
   הוא מציג שם שיטות ממש מעניינות. הוא הראשון לדעתי שעושה PoC לטכניקות האלה, שהוסברו בבלאק-האט האחרון. מעניין לחלוטין.

עם זאת, הטכניקה שהוא הסביר שם לא קשורה כל כך לבעיה ש ASLR פותח
בעבודה עם קוד פולימורפי, בגלל שהבעיה פה היא לא ההגנה, אלא הדרך שבה
ASLR מחפש פונקציות; הוא מחפש כל אופקוד של call, jmp, je, jz וכו' או
לחילופין כתובות, ועושה rebasing לכתובות. ברגע שהכתובות מוצפנות - יש בעיה.

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

תודה

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   09:34   31.03.10   
אל הפורום  
  5. התגעגעתי למאמרים שלך לירן :)  
בתגובה להודעה מספר 0
 
   מעניין מאוד... תודה רבה


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק
   22:41   31.03.10   
אל הפורום  
  7. נחמד מאד תודה על המאמרון :)  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Deuce 
חבר מתאריך 1.9.08
6225 הודעות
   17:20   02.04.10   
אל הפורום  
  8. נחמד מאוד, שווה קריאה - תודה.  
בתגובה להודעה מספר 0
 






                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net