[BUUCTF] REVERSE —— [GUET-CTF2019] número_jogo

[GUET-CTF2019] número_jogo

anexo

degrau

  1. Inspeção de rotina, programa de 64 bits, sem shell
    Insira a descrição da imagem aqui
  2. O
    Insira a descrição da imagem aqui
    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.
  3. sub_4006D6 ()
    Insira a descrição da imagem aqui
    sub_400758 ()
    Insira a descrição da imagem aquisub_400807 ()
    Insira a descrição da imagem aqui
    sub_400881 () atribuir sub_400917 () a a1 []
    Insira a descrição da imagem aqui
    , 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
    Insira a descrição da imagem aqui
    unk_601060 os dados de
    Insira a descrição da imagem aqui
    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="")

Insira a descrição da imagem aqui
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

  1. Obviamente 0421421430nã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;
}

Insira a descrição da imagem aqui
Não olhe para aqueles com mais de 9, o resultado da travessia de pré-ordem é: 0137849256, que constrói uma árvore binária.
Insira a descrição da imagem aqui
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.
Insira a descrição da imagem aqui
Wp de referência: https://www.cnblogs.com/Mayfly-nymph/p/12859103.html

Acho que você gosta

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