Skip to content

Latest commit

 

History

History

re_100_entry

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

Reverse 100 (re, 100p)

PL

ENG

Dostajemy program (elf konkretnie), który wykonuje bardzo proste sprawdzenie hasła i odpowiada czy hasło jest poprawne czy nie.

Domyślamy się że poprawne hasło jest flagą.

Cały program to coś w rodzaju:

int main() {
    printf("Enter the password: ");
    if (fgets(&password, 255, stdin)) {
        if (check_password(password)) {
          puts("Incorrect password!");
        } else {
          puts("Nice!");
        }
    }
}

Patrzymy więc w funkcję check_password (oczywiście nie nazywała się tak w binarce, nie dostaliśmy symboli):

bool check_password(char *password) {
    char* arr[3] = { "Dufhbmf", "pG`imos", "ewUglpt" };
    for (i = 0; i <= 11; ++i) {
        if (v3[8 * (i % 3)][2 * (i / 3)] - password[i] != 1) {
            return true;
        }
    }
    return false;
}

Z równania v3[8 * (i % 3)][2 * (i / 3)] - password[i] != 1 od razu wynika co trzeba zrobić (coś - hasło ma być równe 1, czyli hasło = coś + 1).

Wyliczyliśmy hasło na podstawie podanych stałych i zdobyliśmy flagę.

ENG version

We get a binary (elf to be exact), which performs a simple password check and returns if the password was correct or not.

We expect the password to be the flag.

Whole code is something like:

int main() {
    printf("Enter the password: ");
    if (fgets(&password, 255, stdin)) {
        if (check_password(password)) {
          puts("Incorrect password!");
        } else {
          puts("Nice!");
        }
    }
}

We go into the check_password function (of course it was not called like that in the binary, there was no symbol table):

bool check_password(char *password) {
    char* arr[3] = { "Dufhbmf", "pG`imos", "ewUglpt" };
    for (i = 0; i <= 11; ++i) {
        if (v3[8 * (i % 3)][2 * (i / 3)] - password[i] != 1) {
            return true;
        }
    }
    return false;
}

From the equation v3[8 * (i % 3)][2 * (i / 3)] - password[i] != 1 we can see right away what we need to do (something - password has to be equal to 1 so therefore password+something = 1)

We simply calculated the password based on the constant values and got the flag.