Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

README.md

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.