או: לא כל שפות התכנות דומות ל-C
כשהתחלתי את דרכי בתכנות הייתי עדיין ילד. למדתי את השפה שלימדו באותו זמן בקורס של "סיוון מחשבים" – C. אחר כך קראתי קצת על תכנות והבנתי שיש שפה יותר "חזקה" מ-C שמאפשרת שליטה מוחלטת על מה שיקרה במחשב, ושקוראים לה אסמבלי. למדתי קצת מפה וקצת משם והתעניינתי בשפות נוספות וכל הזמן דנתי עם עצמי בשאלה איזו שפת תכנות מבין השפות שאני מכיר היא הטובה ביותר.
יום אחד שאלתי את גוגל את השאלה הפשטנית הזו בכוונה כדי לראות מה יש לתבונה הגלובלית לומר בנושא. כתבתי את המילים "best programming language" ועברתי בין התוצאות לראות אם יש מישהו שעונה על השאלה בצורה רצינית. התאכזבתי אבל לא הופתעתי לראות בפורומים תשובות שמשוות בין #C ל-Java, בין C ל-++C, בדרך כלל בצורה לא מעמיקה ולא מבוססת. לעומת זאת, אחת מהתוצאות היתה שונה מכולן. אני ציפיתי לתשובה מנומקת שתסביר למה התכונות המתקדמות של #C כל כך טובות, או למה לא ניתן לוותר על השליטה והמהירות של C במקרים מסוימים. מה שודאי לא ציפיתי לו זו כתבה שבוחרת שלוש שפות כטובות ביותר, שעל שלושתן כמעט לא שמעתי, אם בכלל. זה ישר תפס לי את העין. תרמה לכך גם העובדה שהכתבה נכתבה באנגלית גבוהה, והטקסט הקרין ניסיון של שנים והיכרות נרחבת עם מדעי המחשב.
לא כל השפות נראות אותו דבר
המשך לקרוא
שלום חברים! חיג'אז, נהוונד, עג'אם, בייאת, כורד, צבא, ראסט, סיגא, אומר לכם משהו? אלה מקאמים.
מקאמים הם סולמות במוסיקה המזרחית (מזרחית מקורית, לא מה שיש ברדיו). המשמעות של מקאם היא שיש תו אבסולוטי שבו מתחילים את הסולם, וממנו מוגדרים מרווחים עד סוף האוקטבה.
בשונה ממוסיקה מערבית בה יש רק סולמות אפשריים בודדים שאני מכיר לפחות, במוסיקה המזרחית יש בערך שבעים. עוד הבדל גדול הוא שבמוסיקה מערבית המרחק המינימלי בין תווים הוא חצי טון, במוסיקה המזרחית המרחק הוא רבע טון וזו הסיבה שלחלק מהמוסיקה המזרחית יש צליל אופייני כל כך.
כל זה טוב ויפה אבל זה גורם לבעיה. מכיוון שבמוסיקה המערבית אין רבעי טונים וכלי הנגינה שנפוצים בבתים שלנו כמו גיטרה ופסנתר מכוונים לסולמות מערביים, לא ניתן לנגן בהם הרבה מהמוסיקה המזרחית ללא כיוון מחדש אם בכלל. למי שלא גדל על מוסיקה מזרחית, כמוני, קשה לתפוס את ההבדלים בין המקאמים משמיעה בלבד בלי אפשרות לנגן את התווים ולשמוע את הסולמות. לשם כך כתבתי תוכנה שמאפשר לנגן את סולמות המקאמים במקלדת. המשך לקרוא
כמו הרבה אנשים שלמדו ++C לפני כמה שנים, את הצעדים הראשונים שלי עשיתי בסביבת פיתוח בשם ++Dev-C.
בשונה מסביבות פיתוח רבות אחרות, היא מיוחדת בנקיות שלה ובקלות השימוש. הנה תמונה הלקוחה מהאתר הראשי של התוכנה. אל תתנו לפשטות להטעות אתכם, התוכנה ממש טובה.
המשך לקרוא
אחותי נמצאת עכשיו בטיול בחו"ל. היא כותבת לנו לפעמים מיילים ומשתפת אותנו בחוויות מהטיול. זה נחמד מאוד חוץ מהעובדה שקשה לקרוא את המיילים כי הם כתובים בעיבריש, כלומר, עברית באותיות לטיניות. הסיבה היא כמובן שלא מותקן במחשבים בחו"ל keyboard layout (פריסת מקשים) בעברית ולכן לא ניתן לכתוב בעברית.
ישנם הרבה אתרים שמציגים ציור של מקלדת שניתן ללחוץ עם העכבר על המקשים שלה וכך לכתוב בעברית בכל מקום. אני לא אוהב את הפיתרון הזה כי מאוד לא נוח לכתוב עם העכבר, במיוחד כשרוצים לספר על חוויות ולא לכתוב רק משפט אחד או שניים. ישבתי עם אחי כדי לספק פיתרון טוב יותר ויצא משהו נחמד.
המשך לקרוא
אני רשום לבלוג המצוין של Didier Stevens. בנוסף למחקרים שלו הוא גם בונה כל מיני כלים קטנים ושימושיים לחוקרי אבטחה, כמו Suspender.dll או LoadDLLViaAppInit ועוד רבים.
חשבתי לנסות לבנות סט כלים בסיסיים, שביחד ייצרו משהו שימושי. הרעיון הוא שכל כלי משתמש ב-X הפרמטרים הראשונים, ואל השאר הוא מתייחס כפקודה אחת ופשוט מריץ אותה.
לדוגמה, tool p1 p2 notepad.exe. מה שיקרה זה ש-tool יבצע את המטלה ויקרא ל-notepad.exe. עכשיו, בשילוב של כל הכלים יחד אפשר לבצע פעולות קצת יותר מורכבות בצורה אוטומטית. לדוגמה:
parallel notepad.exe wait 5s inject notepad.exe hacker.dll wait 2s suspend notepad.exe
הרצה של פקודה זו תריץ במקביל (לא תחכה לסיומו) את פנקס רשימות, תחכה חמש שניות, תזריק לתוכו DLL, תחכה שתי שניות ותעשה Suspend לתהליך. ואז אפשר, נניח, לפתוח את התהליך ב-OllyDbg ולבחון את מצבו.
המשך לקרוא
מאמר מתוך Digital Whisper המדגים כתיבת Rootkit ב-User-Mode
מגזין אבטחת המידע Digital Whisper שחרר את גיליון מספר 20, מזל טוב! 20 חודשים… בלי עין הרע 🙂
כתבתי מאמר לגיליון זה, בנושא Rootkit ובעיקר Rootkits ב-User-Mode. אתם מוזמנים לקרוא.
הקדמה
לפני מספר שנים כללה Sony בדיסקי מוזיקה שמכרה, תוכנת הגנה מפני העתקה שהותקנה אוטומטית במחשב של הלקוח שקנה את הדיסק. זמן לא רב לאחר מכן מארק רוזינוביץ', יוצר סט הכלים המצוין SysInternals, גילה את התוכנה ופירסם את הממצאים. התוכנה הסתירה את עצמה ואף חשפה את המחשב לבעיות אבטחה. Sony הודיעה על החזרה (recall) של הדיסקים, ובנוסף החברה שפיתחה את ההגנה שחררה כלי להסרת ההגנה. בדיעבד, התברר שכלי התיקון חשף את המחשב לבעיות אבטחה חמורות. עוד יותר באלגן.
המשך לקרוא
כתיבת קוד המזריק קוד לכל תוכנה באופן גנרי ("מדביק")
אתמול, באיחור קל, שוחרר הגיליון התשעה עשר של Digital Whisper, המגזין המצוין לאבטחת מידע. כל חודש ביומו האחרון יוצא גיליון חדש עם כתבות מכותבים מתנדבים. שווה לעקוב!
כתבתי מאמר לגיליון זה, תוכנו מובא למטה. כדאי לקרוא ב-DW, במקור 🙂 המאמר מדבר על הדבקה בינארית – 'הזרקת' קוד זדוני לתוך תוכנה לגיטימית בצורה אוטומטית. לחצו על הקישור כדי להמשיך לקרוא.
תודה לאחי שעזר בעריכה הראשונית, ולצוות DW שמקפידים להוציא את הגיליון כל חודש.
המשך לקרוא
כשהתחלתי לעבוד על פרוייקט קטן ב-C++ שכלל עריכת קבצי PE (קבצי הרצה, EXE או DLL בד"כ) נתקלתי בשיטה ממש נחמדה לעריכת קבצים תחת Windows, ובמיוחד קבצי PE. משימות מסובכות כמו שינוי מאפיינים (גרסה, חברה, וכו'), פאץ' לתוכנה, שינוי אייקון וכל מניפולציה אחרת הופכים להיות עניין של הכנסת וקריאת ערך ממשתנה. הסתכלו לדוגמה על השורות הבאות:
ntHeader->OptionalHeader.MajorImageVersion = 4;
ntHeader->OptionalHeader.AddressOfEntryPoint = 0x53a8cd;
הייתם רוצים ששינוי משתנים בצורה כזו יגרור שינוי מיידי של הקובץ? זה אפשרי, והנה הדרך לעשות זאת.
המשך לקרוא
מדריך לכתיבת דרייבר בסיסי עבור כל גרסאות Windows
לפני כשבועיים פרסם אחד מחברי פורום ההאקינג הישראלי (Ratinho) אתגר מעניין. קראק-מי פשוט שמבקש סיסמה ומחזיר Good job או Wrong password בהתאם. המטרה הייתה לפרוץ את התוכנה שתחזיר תמיד Good job, גם אם הוכנסה סיסמה לא נכונה, ומכיוון שההשוואה מתבצעת בעזרת קריאה פשוטה ל-lstrcmp בלי שום נסיון להסתיר או לסבך משהו, כל מה שצריך לעשות זה לשנות את ה-JNZ שאחריה ל-JMP.
מה שהפך את האתגר למעניין היה התנאי – הפתרון חייב להיות חיצוני, ללא שום שינוי בתוכנה. ראיתי את האתגר בדיוק אחרי שכתבתי את המאמר על הזרקת DLL בשולה המוקשים, ובעזרת אותה טכניקה פשוט לשנות את קוד התוכנה בזיכרון.
אבל אז זה היה פשוט מדי, ורציתי להיות מקורי יותר. אז מה שעשיתי היה לשכתב (Inline Hooking) את lstrcmp שבתוך Kernel32 שתחזיר תמיד 0 (המחרוזות שוות). כל תהליך טוען את המודולים למרחב הכתובות שלו (באופן תאורטי לפחות), ככה שהשינוי השפיע רק על הקראק-מי (קוד מקור, לרשימת הפתרונות).
חשבתי שהייתי מקורי, עד שראיתי את הפתרון שהציע Zerith, משתמש אחר בפורום. הוא הפתיע את כולם בסיבוך של הפתרון שלו… הוא כתב דרייבר שעושה הוקינג להנדלר של ה-Page Fault (אפשר לקרוא על זה בוויקיפדיה, אבל מה שחשוב לנו הוא שכל פעם שמערכת ההפעלה צריכה קטע שלא נמצא בזיכרון בפועל, Page Fault קורה), שברגע שקורה Page Fault, אם הוא קוד הקראק מי, במקום לטעון את הקוד מהדיסק הוא מכניס בעצמו קוד שכבר פרוץ (שינוי של ה-JMP).
התלהבתי כשראיתי את זה, והחלטתי שאני חייב ללמוד את הנושא לעומק. אז התחלתי 🙂
טכניקות לשליטה על תוכנות רצות בעזרת DLL Injection ו-Code Cave
זה הוא הפוסט האינפורמטיבי הראשון שלי בבלוג הזה. Digital Whisper גליון מספר 18 שוחרר הערב, ובו המאמר הראשון (ואני מקווה שלא האחרון) שכתבתי עבורו. המאמר מדבר על הזרקת קבצי DLL לתוך תוכנה שרצה – אחת הטכניקות הכי כיפיות שאני מכיר. היא מאפשר שליטה מוחלטת בתוכנה שאליה אנו מזריקים (שבמאמר זה שולה המוקשים הוא הקורבן). אגב, אם כל מה שאתם רוצים זה לרמות הקישו xyzzy ואח"כ Shift-Enter ו-Enter בתוך שולה המוקשים ותהנו 🙂
זה הזמן להודות לצוות Digital Whisper – אפיק קסטיאל (cp77fk4r) וכל צוות העורכים והעורכת על המגזין הזה שתורם רבות לקהילה הישראלית.
הקדמה
במאמר זה אני רוצה להציג טכניקות מעניינות בשליטה על תהליך רץ ב-Windows, או במקרה שלנו- רמאות בשולה המוקשים. התוכנה שניצור תעצור את הזמן ותגרום לשולה המוקשים לגלות לנו איפה מוחבא כל מוקש, והכל בעזרת עריכות זיכרון פשוטות. כדי לעשות את זה נשתמש בטכניקה הנקראת הזרקת DLL. אנחנו נשתמש ב-Visual C++ (וכמובן שאפשר להשתמש בכל IDE ומהדר אחר) עבור בניית מזרק ו-DLL, נשתמש ב-OllyDbg וב-LordPE כדי לאסוף מידע ולבצע קצת עריכות בקובץ. וכמובן את שולה המוקשים של Windows XP. נדרש ידע בסיסי ב-OllyDbg, רצוי ידע ב-C++ (כדי להבין את הקוד).
המשך לקרוא