• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

  • Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Помогите пожалуйста решить CTF задание

RetTr0 3113

New member
13.03.2020
4
0
BIT
0


Здравствуйте форумчане. Я плохо знаю C и C++. Помогите пожалуйста с реверсом, я получил такой ключ MTQKCQ-RTQZMJ-KGXJOS. Но на сколько я понял, в программе используется алгоритм, который изменяет части ключа и сравнивает их с исходными. Мне не нужно говорить полностью флаг, но так как я не знаю C на достаточном уровне, я бы не отказался от пояснений к коду. Вот функция прямиком из гидры:

Код:
bool check_chunk(long param_1, ulong param_2)
{
    int local_14;
    ulong local_10;
  
    local_10 = 0;
    local_14 = 0;
    while (local_14 < 6) {
        local_10 = (local_10 + (long)(local_14 + *(char *)(param_1 + local_14))) * 0x100;
        local_14 = local_14 + 1;
    }
    return param_2 == local_10 >> 8;
}

А вот функция main:

Код:
undefined8 main(int param_1,undefined8 *param_2)
{
  char *__s;
  bool bVar1;
  int iVar2;
  undefined8 uVar3;
  size_t sVar4;
  
  if (param_1 < 2) {
    printf("Usage: %s <serial_number>\n",*param_2);
    uVar3 = 0xffffffff;
  }
  else {
    __s = (char *)param_2[1];
    sVar4 = strlen(__s);
    if (sVar4 == 0x14) {
      if ((__s[6] != '-') || (__s[0xd] != '-')) {
        puts("Invalid serial!");
      }
      bVar1 = false;
      iVar2 = check_chunk(__s,_secret_first,_secret_first);
      if (iVar2 == 0) {
        exit_m("First check failed!");
      }
      else {
        iVar2 = check_chunk(__s + 7,_secret_second,__s + 7);
        if (iVar2 == 0) {
          exit_m("Second check failed!");
        }
        else {
          iVar2 = check_chunk(__s + 0xe,_secret_third,__s + 0xe);
          if (iVar2 == 0) {
            exit_m("Third check failed!");
          }
          else {
            bVar1 = true;
          }
        }
      }
      if (bVar1) {
        puts("Access granted! Welcome!");
        printf("Your flag is kks{%s}\n",__s);
      }
      uVar3 = 0;
    }
    else {
      puts("Incorrect serial number!");
      uVar3 = 0xfffffffe;
    }
  }
  return uVar3;
}

Мне нужно сделать так, чтобы этот ключ проходил проверку. Можно ли каким-то образом воспользоваться angr для решения этого задания?
Спасибо всем заранее.


 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!