7.4 כלי Ghidra תרגול
תרגול 1 - פתיחת בינארי בגידרה¶
קמפלו את התוכנית הבאה:
#include <stdio.h>
void greet(const char *name) {
printf("Hello, %s!\n", name);
}
int main() {
greet("Student");
greet("World");
return 0;
}
פתחו את הבינארי בגידרה (צרו פרויקט חדש, ייבאו את הקובץ, תנו לניתוח האוטומטי לרוץ).
1. כמה פונקציות גידרה זיהתה? (הסתכלו ב-Symbol Tree)
2. מצאו את פונקציית main (רמז: חפשו את הפונקציה שנקראת מ-__libc_start_main או מ-entry)
תרגול 2 - קריאת הDecompiler¶
בהמשך לתרגיל הקודם, לחצו על פונקציית main בגידרה.
1. קראו את פלט ה-Decompiler. מה הוא מראה?
2. שנו את שם הפונקציה FUN_XXXXX שנקראת מ-main לשם greet
3. לחצו על הפונקציה greet ושנו את שם הפרמטר מ-param_1 ל-name
4. הוסיפו הערה (Plate Comment) לפונקציה greet שמסבירה מה היא עושה
תרגול 3 - מציאת מחרוזות¶
קמפלו את התוכנית הבאה (בלי strip הפעם):
#include <stdio.h>
#include <string.h>
int check_password(const char *input) {
if (strcmp(input, "s3cretP@ss") == 0) {
return 1;
}
return 0;
}
int main() {
char buffer[64];
printf("Enter password: ");
scanf("%63s", buffer);
if (check_password(buffer)) {
printf("Access granted!\n");
} else {
printf("Access denied!\n");
}
return 0;
}
- פתחו את הבינארי בגידרה
- השתמשו ב-Search -> For Strings כדי למצוא מחרוזות מעניינות
- מה הסיסמה? איך מצאתם אותה?
- לחצו כפול על המחרוזת "Access granted!" ואז השתמשו ב-XREF כדי למצוא איזו פונקציה משתמשת בה
תרגול 4 - הבנת פונקציה¶
קמפלו את התוכנית הבאה עם strip:
#include <stdio.h>
int mystery(int a, int b) {
int result = 0;
while (b > 0) {
if (b & 1) {
result += a;
}
a <<= 1;
b >>= 1;
}
return result;
}
int main() {
int x = mystery(7, 5);
printf("Result: %d\n", x);
return 0;
}
- פתחו את הבינארי בגידרה
- מצאו את הפונקציה mystery (היא תיקרא משהו כמו
FUN_XXXXX) - קראו את פלט ה-Decompiler. מה הפונקציה עושה? (רמז: חשבו מה 7 כפול 5)
- שנו את שמות המשתנים והפונקציה לשמות משמעותיים
- שנו את שם הפונקציה ל-
multiply(או לשם אחר שמתאר את מה שהיא עושה)
תרגול 5 - ניתוח מלא¶
קמפלו את התוכנית הבאה עם strip:
#include <stdio.h>
#include <string.h>
void encode(char *str, int key) {
for (int i = 0; str[i] != '\0'; i++) {
str[i] = str[i] ^ key;
}
}
void decode(char *str, int key) {
encode(str, key);
}
int main() {
char secret[] = "Hello World";
int key = 42;
printf("Original: %s\n", secret);
encode(secret, key);
printf("Encoded: %s\n", secret);
decode(secret, key);
printf("Decoded: %s\n", secret);
return 0;
}
- פתחו את הבינארי בגידרה בלי להסתכל על הקוד המקורי
- מצאו את main ואת הפונקציות שהיא קוראת
- נתחו את הפונקציה encode - מה היא עושה? איזו פעולה מתמטית היא מבצעת?
- למה encode ו-decode הן אותו דבר? (רמז: מה קורה כשעושים XOR פעמיים עם אותו מפתח?)
- שנו שמות לכל הפונקציות והמשתנים. הוסיפו הערות.