[BUUCTF] REVERSE —— [GUET-CTF2019] number_game

[GUET-CTF2019] number_game

приложение

шаг

  1. Регулярная проверка, 64-битная программа, без оболочки
    Вставьте описание изображения сюда
  2. Программа загрузки 64-битной ida
    Вставьте описание изображения сюда
    очень проста. Вначале давайте введем строку и сохраним ее в v5, а затем выполним операции нескольких функций sub_4006D6 (), sub_400758 (), sub_400807 (), sub_400881 () , sub_400917 (), наконец, выводится флаг.
  3. sub_4006D6 ()
    Вставьте описание изображения сюда
    sub_400758 ()
    Вставьте описание изображения сюдаsub_400807 ()
    Вставьте описание изображения сюда
    sub_400881 () назначьте sub_400917 () на a1 []
    Вставьте описание изображения сюда
    , ключевую функцию оценки, если это условие выполнено, флаг будет выведен. Это похоже на судоку. Данные в каждой строке и каждый столбец не может быть одним и тем же
    Вставьте описание изображения сюда
    unk_601060 данные в
    Вставьте описание изображения сюда
    соответствии с sub_400917 (), эти данные расположены примерно 5 * 5
str="14#2330#1#0#23##3##042##1"

for i in range(25):
    print(str[i],end=" ")
    if (i+1)%5==0:
        print('\n',end="")

Вставьте описание изображения сюда
Согласно sub_400881 (), мы знаем, что # - это данные, которые нам нужно ввести, в порядке сверху вниз, слева направо.

  1. Очевидно, 0421421430не окончательные результаты, поскольку данные преобразуются sub_400758 () и sub_400807 (), полученные динамически настраиваются, смотрят на конкретную работу этих двух функций данных.
    Я fw, этот файл без EIF. Я долго бросаю в ida. раз, каждый раз придумываю, как начать отладку

Следующий контент относится к wp этого мастера.

Функции sub_400807 и sub_400881 на самом деле являются обходом предварительного и среднего порядка двоичного дерева, сортируя индексы в массиве символов.Сначала
, согласно sub_400807 (), мы построим двоичное дерево индексов массива.

#include <iostream>

using namespace std;

void func1(int a2, int a3) {
    
    
    cout << a2 << endl;
    if (a2 >= a3)
        return;
    func1(2 * a2 + 1, a3);
    func1(2 * (a2 + 1), a3);
}

int main()
{
    
    
    func1(0, 10);
    system("PAUSE");
    return 0;
}

Вставьте описание изображения сюда
Не смотрите на те, что больше 9, результат обхода предварительного заказа: 0137849256, который строит двоичное дерево.
Вставьте описание изображения сюда
Следовательно, результат обхода по порядку: 7,3,8,1,9, 4,0,5,2,6. Функция
sub_400881 на самом деле: присвоение последовательности байту_601062 в обходной последовательности среднего порядка
означает, что индексы данных, которые мы хотим ввести, повторно сортируются на 7,3,8,1 , 9,4,0,5,2,6, чтобы получить 0421421430, согласно 0123456789 Сортировка снова, чтобы получить входные данные

# -*- coding:utf-8 -*-

model = [7, 3, 8, 1, 9, 4, 0, 5, 2, 6]
s = [48, 52, 50, 49, 52, 50, 49, 52, 51, 48]

flag = [0] * 10

for i in range(10):
    flag[model[i]] = s[i]
print ('flag{' + ''.join([chr(x) for x in flag]) + '}')

флаг {1134240024}

Если вы можете настроить его, вы можете получить указанное выше значение индекса более интуитивно.
Вставьте описание изображения сюда
Ссылка wp: https://www.cnblogs.com/Mayfly-nymph/p/12859103.html

рекомендация

отblog.csdn.net/mcmuyanga/article/details/113608556