לדלג לתוכן

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;
}

gcc -o greet greet.c
strip greet

פתחו את הבינארי בגידרה (צרו פרויקט חדש, ייבאו את הקובץ, תנו לניתוח האוטומטי לרוץ).
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;
}

gcc -o password_check password_check.c
  1. פתחו את הבינארי בגידרה
  2. השתמשו ב-Search -> For Strings כדי למצוא מחרוזות מעניינות
  3. מה הסיסמה? איך מצאתם אותה?
  4. לחצו כפול על המחרוזת "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;
}

gcc -o mystery mystery.c
strip mystery
  1. פתחו את הבינארי בגידרה
  2. מצאו את הפונקציה mystery (היא תיקרא משהו כמו FUN_XXXXX)
  3. קראו את פלט ה-Decompiler. מה הפונקציה עושה? (רמז: חשבו מה 7 כפול 5)
  4. שנו את שמות המשתנים והפונקציה לשמות משמעותיים
  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;
}

gcc -o xor_cipher xor_cipher.c
strip xor_cipher
  1. פתחו את הבינארי בגידרה בלי להסתכל על הקוד המקורי
  2. מצאו את main ואת הפונקציות שהיא קוראת
  3. נתחו את הפונקציה encode - מה היא עושה? איזו פעולה מתמטית היא מבצעת?
  4. למה encode ו-decode הן אותו דבר? (רמז: מה קורה כשעושים XOR פעמיים עם אותו מפתח?)
  5. שנו שמות לכל הפונקציות והמשתנים. הוסיפו הערות.