[GUET-CTF2019] número_jogo
degrau
- Inspeção de rotina, programa de 64 bits, sem shell
- O
programa de carregamento ida de 64 bits é muito simples. No início, vamos inserir uma string e armazená-la na v5 e, em seguida, por meio das operações de várias funções de sub_4006D6 (), sub_400758 (), sub_400807 (), sub_400881 () , sub_400917 (), Finalmente, o sinalizador é gerado. - sub_4006D6 ()
sub_400758 ()
sub_400807 ()
sub_400881 () atribuir sub_400917 () a a1 []
, a função de julgamento da chave, se esta condição for atendida, o sinalizador será exibido. Parece um Sudoku. Os dados em cada linha e cada coluna não pode ser o mesmo
unk_601060 os dados de
acordo com sub_400917 (), esses dados são organizados em cerca 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 acordo com sub_400881 (), sabemos que o # são os dados que precisamos inserir, na ordem de cima para baixo, da esquerda para a direita
- Obviamente
0421421430
não os resultados finais, pois os dados são transformados por sub_400758 () e sub_400807 () obtidos, olhe dinamicamente sintonizado para a operação específica dessas duas funções dos dados
I fw, este arquivo não eif I Jogando em ida por um longo vez, toda vez que eu descobrir como começar a depurar
O conteúdo a seguir se refere ao wp deste mestre
As funções sub_400807 e sub_400881 são, na verdade, a passagem de pré-ordem e a passagem de ordem intermediária de uma árvore binária, classificando os subscritos na matriz de caracteres.
Primeiro, de acordo com sub_400807 (), vamos construir uma árvore binária dos subscritos da 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;
}
Não olhe para aqueles com mais de 9, o resultado da travessia de pré-ordem é: 0137849256, que constrói uma árvore binária.
Portanto, o resultado da travessia em ordem é: 7,3,8,1,9, 4,0,5,2,6. A
função sub_400881 é, na verdade, Uma atribuição de sequência para byte_601062 na sequência de passagem de ordem do meio
significa que os subscritos dos dados que queremos inserir são re-classificados por 7,3,8,1 , 9,4,0,5,2,6 para obter 0421421430, de acordo com 0123456789 Classifique-o novamente para obter os dados 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]) + '}')
sinalizar {1134240024}
Se você puder ajustá-lo, poderá obter o valor do subscrito acima de forma mais intuitiva.
Wp de referência: https://www.cnblogs.com/Mayfly-nymph/p/12859103.html