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

[GUET-CTF2019] número_juego

anexo

paso

  1. Inspección de rutina, programa de 64 bits, sin shell
    Inserte la descripción de la imagen aquí
  2. El
    Inserte la descripción de la imagen aquí
    programa de carga ida de 64 bits es muy simple. Al principio, ingresemos una cadena y la almacenamos en v5, y luego a través de las operaciones de varias funciones de sub_4006D6 (), sub_400758 (), sub_400807 (), sub_400881 () , sub_400917 (), Finalmente, se emite la bandera.
  3. sub_4006D6 ()
    Inserte la descripción de la imagen aquí
    sub_400758 ()
    Inserte la descripción de la imagen aquísub_400807 ()
    Inserte la descripción de la imagen aquí
    sub_400881 () asigne sub_400917 () a a1 []
    Inserte la descripción de la imagen aquí
    , la función de juicio clave, si se cumple esta condición, se emitirá la bandera. Parece un Sudoku. Los datos en cada fila y cada columna no puede ser la misma
    Inserte la descripción de la imagen aquí
    unk_601060 los datos de
    Inserte la descripción de la imagen aquí
    acuerdo con sub_400917 (), estos datos están ordenados alrededor de 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="")

Inserte la descripción de la imagen aquí
De acuerdo con sub_400881 (), sabemos que # son los datos que necesitamos ingresar, en el orden de arriba a abajo, de izquierda a derecha

  1. Obviamente, 0421421430no los resultados finales, porque los datos son transformados por sub_400758 () y sub_400807 () obtenidos, sintonizados dinámicamente, mire el funcionamiento específico de estas dos funciones de los datos
    . vez, cada vez que averiguo cómo empezar a depurar

El siguiente contenido se refiere al wp de este maestro

Las funciones sub_400807 y sub_400881 son en realidad el recorrido de preorden y el recorrido de orden medio de un árbol binario, ordenando los subíndices en la matriz de caracteres.
Primero, de acuerdo con sub_400807 (), construiremos un árbol binario de los subíndices de la matriz.

#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;
}

Inserte la descripción de la imagen aquí
No mire los más de 9, el resultado del recorrido de la reserva es: 0137849256, que construye un árbol binario.
Inserte la descripción de la imagen aquí
Por lo tanto, el resultado del recorrido en orden es: 7,3,8,1,9, 4,0,5,2,6. La
función sub_400881 es en realidad, Una asignación de secuencia al byte_601062 en la secuencia transversal de orden medio
significa que los subíndices de los datos que queremos ingresar se reordenan por 7,3,8,1 , 9,4,0,5,2,6 para obtener 0421421430, de acuerdo con 0123456789 Ordene nuevamente para obtener los datos de entrada

# -*- 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]) + '}')

bandera {1134240024}

Si puede ajustarlo, puede obtener el valor del subíndice anterior de manera más intuitiva.
Inserte la descripción de la imagen aquí
Referencia wp: https://www.cnblogs.com/Mayfly-nymph/p/12859103.html

Supongo que te gusta

Origin blog.csdn.net/mcmuyanga/article/details/113608556
Recomendado
Clasificación