ריברסינג מאפס למאה, או: איך למדתי לפרוש

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

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

 עם תום תקופת הלימודים התחילו לפנות אליי חברים בנוגע לתוכנית הלימודים שלי, שמחתי מאוד לשתף אותם, אבל התחלתי להרגיש שיש לסילבוס ביקוש וכדאי לפרסם אותו בצורה רחבה יותר כדי שעוד אנשים יוכלו להנות וללמוד :)‏

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

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

 

Assembly and computer architecture:
Basic (He): http://www.cyber.org.il/assembly/gvahim_assembly_book.pdf
Fill the gaps (He): http://cse.proj.ac.il/asembli/st-book-pdf.pdf
The cpu execution cycle:
https://www.computerscience.gcse.guru/theory/fetch-execute-cycle

http://theteacher.info/index.php/fundamentals-of-cs/1-hardware-and-communication/topics/2599-registers-and-the-fetch-decode-execute-cycle
About offset:
https://stackoverflow.com/questions/1669662/what-does-offset-in-16-bit-assembly-code-mean
http://stackoverflow.com/questions/17777146/what-is-the-purpose-of-cs-and-ip-registers-in-intel-8086-assembly
Understanding opcodes: (advanced, optional): http://www.swansontec.com/sintel.html
And: http://ref.x86asm.net/
https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-1-stack-based-overflows/ (I didn’t do the whole guide, just made sure I understand the concepts etc.)
Reversing:
https://www.recurse.com/blog/7-understanding-c-by-learning-assembly
Great book: https://beginners.re/ (I did only the code patterns part)

Beginners.re Challenge #53 hint: http://stackoverflow.com/questions/19342155/how-to-store-characters-into-a-char-pointer-using-the-strcpy-function
Exploitation:
Buffer overflow: https://www.youtube.com/watch?v=1S0aBV-Waeo
Check generic data sources below…
Exercises:
https://exploit-exercises.com/protostar – basic re. When asked to use existing shellcode I learned how to write a shellcode (next section, read below). Not a must, but helpful for deep understanding of how it works.
https://exploit-exercises.com/fusion – memory and execution protection
Shellcoding:
Guide: http://www.vividmachines.com/shellcode/shellcode.html
Another guide: http://www.tenouk.com/Bufferoverflowc/Bufferoverflow5.html
gcc params: https://stackoverflow.com/questions/26823678/linux-64-bit-shellcode
Check generic data sources below…
AntiDebugging:
http://www.stonedcoder.org/~kd/lib/14-61-1-PB.pdf – False Disassembly
Tools:
https://gcc.godbolt.org (untick intel button to use AT&T ASM)
EDB (like olly for linux, quite lame so you’d better not to use it): https://launchpad.net/~cybersec/+archive/ubuntu/panto-linux-4.3-tools/+build/11525283
https://packages.debian.org/wheezy/i386/nasm/download nasm for protostar vm
https://www.exploit-db.com/exploits/13357/ – non closing shellcode
http://shell-storm.org/shellcode/ – shellcodes library
Generic data sources:
https://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html – plt & got
https://www.corelan.be shellcoding exploitation blog
http://www.win.tue.nl/~aeb/linux/hh/hh-10.html shellcoding and exploitation guide + ret2libc
http://users.atw.hu/exploitation/hack_artofexpl_0015.html exploitation guide + ret2libc
http://www.digitalwhisper.co.il/files/Zines/0x0F/DW15-3-Win7DEPnASLR.pdf ret2libc, DEP, ASLR (He)
http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.pdf x86_64 instruction set (THE BIBLE – must use!)
https://blogs.oracle.com/ali/inside-elf-symbol-tables – symbols
http://wiki.osdev.org – Best Wiki ever (in terms of CPU)
Advanced:
http://www.win.tue.nl/~aeb/linux/hh/phrack/P55-08
http://dbp-consulting.com/tutorials/debugging/linuxProgramStartup.html – process init functions flow
http://www.airs.com/blog/archives/38 – linkers (20 parts article!!!) – nice to have
https://0xax.gitbooks.io/linux-insides/content/ – linux inside (very long, but very good!)
http://wiki.osdev.org/GDT_Tutorial – GDT
https://www.quora.com/Microprocessors-What-is-the-difference-between-Global-Descripto-Table-and-Local-Descriptor-Table – GDT
http://wiki.osdev.org/Interrupts – Interrupts
Notes:

  1. ldd does some guessing, and so might mislead you to wrong libc addr. Instead use: (replace perl with your command)
    { perl >/dev/null & APID=$(pgrep -P $$); pmap $APID 2>&1; kill -9 $APID; echo $APID; } 2>/dev/null
  2. A must in gdb:
    set  disassemble-next-line on
    show disassemble-next-line
  3. If you get stuck in ret2libc protostar lvl: https://www.youtube.com/watch?v=m17mV24TgwY
  4. The linux equivalent of Win32’s VirtualProtect (which changes memory protections) is mprotect: https://linux.die.net/man/2/mprotect

 

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

איך לומדים את כל החרא הזה תוך חודשיים? – טיפים ללמידה אפקטיבית

  • קודם-כל חשוב לפנות את הזמן והראש ללימודים. ככל שתהיו עסוקים בעוד דברים, יהיו לכם יותר interruptים במהלך היום ויהיה לכם יותר קשה לשמור על רמת ריכוז גבוהה.
  • תתחילו לנהל יומן. כל פעם שאתם מתאמים משהו עם חבר (ברמת “לצאת עם חברים בערב”) תבינו מתי זה בדיוק (ברמת שעה), תעשו גזירת זמנים (כמה זמן לוקח להתארגן, להגיע לאן שניקבע, כמה זמן אני רוצה להיות שם כדי להישאר אפקטיבי) ותכתבו הכל ביומן. תדאגו שהיומן יעשה לכם התראות (בטלפון/מחשב).
    • חשוב מאוד!!! לא לזרום על אירועים אם אתם לא יודעים אחד מהדברים הבאים: מיקום, איך אני מגיע לשם, כמה זמן כל האירוע לוקח לי עד שאני בחזרה בבית.
    • תהיו בטוחים שלאירוע יש משמעות ששווה את ה-interrupt הזה. כלומר למשל: לצאת עם חברים זה חשוב. אבל לצאת עם חברים כל ערב זה רעיון רע מאוד ללימודים.
  • תבינו את הגוף שלכם ותראו מתי אתם הכי אפקטיביים. ואני אסביר: אני יודע על עצמי שאני הרבה יותר אפקטיבי וערני בערב. לכן הייתי ישן בבוקר ומתחיל ללמוד באיזור 10 (בבוקר, אל תגזימו), ומסיים ללמוד לפנות בוקר (איזור 2-3 בבוקר). הייתי ישן באיזור 7:30 – 8:30 שעות בלילה. כל יום באיזור שעה 15:30 הייתה לי נפילת מתח והאפקטיביות שלי ירדה מאוד, ואת זה הייתי פותר עם powernap.
  • powernap – מצאתי שהדרך האפקטיבית ביותר ל-powernap אצלי היא כזאת: כשאני מרגיש שאני מתקרב לשיא העייפות אני מכין לעצמי כוס אספרסו (יתרון משמעותי – לא צריך לחכות הרבה להרתחת המים ולבישול של הקפה). שותה אותו, שם שעון מעורר לעוד 20 דקות (5 דקות שלבי הירדמות + 15 דקות שינה) ונזרק על הספה. אחרי 20 דקות הייתי מרגיש כמו חדש (!!!) לפעמים אפילו הייתי מתעורר לפני השעון המעורר. זה מה שעבד אצלי, אבל תבחנו מה עובד אצלכם. + הסיבה לקפה לפני השינה ולא אחרי, היא שלקפה לוקח כרבע שעה להשפיע.
  • מחברת – למדתי על עצמי שדברים שאני כותב נכנסים הרבה יותר טוב לזיכרון שלי. לכן דברים שהיו לי מורכבים או שראיתי שאני כל פעם שוכח, הייתי כותב במחברת. זה גם היה עוזר לזכור באופן מיידי, וגם רפרנס שקל מאוד לחזור אליו (לעומת העשרת אלפים לשוניות שפתוחות לי).
  • למידה מתוך סקרנות – כמו שכתבתי בהתחלה, תוכנית הלימודים השתנתה תוך כדי למידה. למה? כי יש דברים שעניינו אותי יותר ויש דברים שפחות. כלל האצבע שלי היה שאני לומד טוב כל עוד זה מעניין אותי, ובאמת ככל שהנושא היה יותר מעניין אפקטיביות הלמידה שלי הייתה גבוהה יותר. אם נושא פחות מעניין אתכם תראו שאתם מבינים אותו באופן כללי ותמשיכו הלאה. אם נושא מאוד מעניין אתכם תתעכבו עליו ותבינו לפרטי פרטים איך הנושא עובד, כל תנצלו את הסקרנות הטבעית שלכם ככלי ללימודים אפקטיביים.
  • צ’אלנג’ים – אתם לומדים מול עצמכם. איך תדעו אם הבנתם את החומר כמו שצריך? כאן הצ’אלנג’ים נכנסים לתמונה. זה בעצם סוג של מבחן מעשי (כיפי במיוחד) שעוזר לנו לוודא מול עצמנו שאנחנו מבינים את החומר כמו שצריך. חשוב לציין שאת הצ’אלנג’ים מומלץ לעשות בסוף תהליך הלימודים התאורתיים, כי הם דורשים הרבה זמן.

טיפים ליוצאי יחידות טכנולוגיות

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

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

  1. תבין מה אתה רוצה לעשות באזרחות ולאן אתה רוצה להגיע. זה יעשה את החיים שלך להרבה יותר קלים.
  2. יכול להיות שבצבא אתה סופרמן, אבל באזרחות אנשים נמדדים על ידי הפגנת יכולות. לפני שאתה ניגש לראיונות תשב ותלמד הרבה. תהיה חד על כל הפרטים הקטנים.
  3. עולם הראיונות הוא סקיל בפני עצמו שצריך להבין מה קורה בו וזה לוקח זמן וניסיון (כמו כל דבר בחיים). לך ל-2-3 ראיונות אל חברות שאתה *בודאות* לא רוצה להגיע אליהם בכלל.
  4. אבל אל תלך ליותר מדי ראיונות. זה סתם מתיש מאוד. אחרי שאתה מרגיש שאתה יודע לאן אתה רוצה להגיע תשב ותלמד ורק אז תלך לראיונות.
  5. אם יש משהו אחד באמת טוב בשירות ביחידה טכנולוגית, זה כמו הקשרים שנוצרים לך בתעשייה. תנצל את זה כדי לגלות איזה חברות מעניינות יש בחוץ.
  6. לך לכנסים ואירועים חברתיים שאתה עשוי להיתקל בחבר’ה מהצבא שהשתחררו כבר ונמצאים בתעשייה. האימפקט שיש לשיחות הקצרות האלה הוא מטורף ומלמד מאוד.
  7. אל תוסיף אנשי HR ל-LinkedIn, תשלח קורות חיים רק לחברים שעובדים בחברות שאתה רוצה להגיע אליהם. תפנו אל HR רק כמוצא אחרון (שוב, כי אתם *כנראה* לא צריכים את הכלי הזה).

 

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

–  דור

טיפ למשחק World of Goo

שלום לכולם,

אתמול פרסמתי כאן משחק נהדר בשם The World of Goo.
רק רציתי להוסיף טיפ נחמד:

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

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

תהנו!
דור.