Rating:

## Reverse 200 (re, 200p)

### PL
[ENG](#eng-version)

Dostajemy [program](./r200) (elf konkretnie), który, podobnie jak poprzedni, wykonuje 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. W bardzo dużym uproszczeniu (tak naprawde nie było tu żadnych funkcji wywoływanych, wszystko inlinowane:

bool check_password(char *password) {
int buf[6];
int reqired[6] = { 5, 2, 7, 2, 5, 6 };
for (int i = 0; i <= 5; i++) {
buf[i] = get_from_assoc(list, password[i]);
}
for (int i = 0; i <= 5; i++) {
if (buf[i] != required[i]) {
return true;
}
}
return false;
}

Gdzie list to globalna zmienna - lista asocjacyjna, wyglądająca mniej więcej tak (w nie-C składni):

{
'm': 0,
'n': 1,
'o': 2,
'p': 3,
'q': 4,
'r': 5,
's': 6,
't': 7,
'u': 8,
'v': 9,
'w': 10,
'x': 11,
'y': 12,
'z': 13
}

Z tego odczytaliśmy wymagane hasło - "rotors".

### ENG version

We get a [binary](./r200) (elf to be exact), which, as previously, performs a password check and returns if the password was correct or not,

We expect the password to be the flag.

The 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 look at the check_password function. Simplified version (there were no function calls, all inlined):

bool check_password(char *password) {
int buf[6];
int reqired[6] = { 5, 2, 7, 2, 5, 6 };
for (int i = 0; i <= 5; i++) {
buf[i] = get_from_assoc(list, password[i]);
}
for (int i = 0; i <= 5; i++) {
if (buf[i] != required[i]) {
return true;
}
}
return false;
}

Where list is a global variable - associative container containing:

{
'm': 0,
'n': 1,
'o': 2,
'p': 3,
'q': 4,
'r': 5,
's': 6,
't': 7,
'u': 8,
'v': 9,
'w': 10,
'x': 11,
'y': 12,
'z': 13
}

We used it to read the password - "rotors".

Original writeup (https://github.com/p4-team/ctf/tree/master/2015-10-02-dctf/re_200_link#eng-version).