[GUET-CTF2019] number_game
шаг
- Регулярная проверка, 64-битная программа, без оболочки
- Программа загрузки 64-битной ida
очень проста. Вначале давайте введем строку и сохраним ее в v5, а затем выполним операции нескольких функций sub_4006D6 (), sub_400758 (), sub_400807 (), sub_400881 () , sub_400917 (), наконец, выводится флаг. - 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 (), мы знаем, что # - это данные, которые нам нужно ввести, в порядке сверху вниз, слева направо.
- Очевидно,
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