Нужно найти флаг - верный серийный номер.
Solution
Гляну файл:
Info:
File name: /spbctf_rev/Nostr 7/s7.out
Size: 7444
File type: ELF32
String: ELF(386)
Extension: elf
Operation system: Linux(ABI: 2.6.32)
Architecture: 386
Mode: 32-bit
Type: EXEC
Endianness: LE
А вот и функция main:
int32_t main(int32_t argc, char** argv, char** envp)
{
void* const __return_addr_1 = __return_addr;
int32_t* var_c = &argc;
int32_t var_14 = 0xb;
printf("Enter serial number: ");
void var_1f;
scanf("%s", &var_1f);
Check(&var_1f);
return 0;
}
По scanf ясно, что var_1f - это строка. Перейду в функцию Check:
int32_t Check(char* arg1)
{
char eax = strlen(arg1);
char var_d;
if ((eax != 6 || arg1[5] != 'x'))
var_d = 0;
else
{
var_d = 1;
for (int32_t i = 1; ((int32_t)eax) > i; i += 1)
{
if (((int32_t)arg1[i]) != (i + ((int32_t)arg1[(i - 1)])))
{
var_d = 0;
break;
}
}
}
PrintOK(((uint32_t)var_d));
return PrintError(((uint32_t)(var_d ^ 1)));
}
Давайте разбираться. eax - это длина нашего ключа.
if ((eax != 6 || arg1[5] != 'x'))
var_d = 0;
Значит ключ должен состоять из 6 символов, последний из которых - x. Ладно, погнали дальше. Вот эту кракозябру:
if (((int32_t)arg1[i]) != (i + ((int32_t)arg1[(i - 1)])))
Можно привести к следующему виду:
if (arg1[i] != i + arg1[i - 1])
Ну все ясно. Каждый последующий символ должен быть на i больше, чем предыдущий. Нам известен пятый символ x. Напишем код на Python:
key = []
c = 'x'
for i in range(5, -1, -1):
key.append(c)
c = chr(ord(c) - i)
print(''.join(key[::-1]))
А вот и флаг:
ijlosx
Проверю:
