[GUET-CTF2019] número_juego
paso
- Inspección de rutina, programa de 64 bits, sin shell
- El
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. - sub_4006D6 ()
sub_400758 ()
sub_400807 ()
sub_400881 () asigne sub_400917 () a a1 []
, 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
unk_601060 los datos de
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="")
De acuerdo con sub_400881 (), sabemos que # son los datos que necesitamos ingresar, en el orden de arriba a abajo, de izquierda a derecha
- Obviamente,
0421421430
no 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;
}
No mire los más de 9, el resultado del recorrido de la reserva es: 0137849256, que construye un árbol binario.
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.
Referencia wp: https://www.cnblogs.com/Mayfly-nymph/p/12859103.html