buuctf/tägliche Wasserfragen/verschiedene Flaggen (ausführliche Erklärung)

Überprüfen Sie zunächst die Schale

Keine Shell, dann öffne sie mit IDA und springe zur Hauptfunktion

Nach C dekompilieren

int __cdecl __noreturn main(int argc, const char **argv, const char **envp)
{
  _BYTE v3[29]; // [esp+17h] [ebp-35h] BYREF
  int v4; // [esp+34h] [ebp-18h]
  int v5; // [esp+38h] [ebp-14h] BYREF
  int i; // [esp+3Ch] [ebp-10h]
  _BYTE v7[12]; // [esp+40h] [ebp-Ch] BYREF

  __main();
  v3[26] = 0;
  *(_WORD *)&v3[27] = 0;
  v4 = 0;
  strcpy(v3, "*11110100001010000101111#");
  while ( 1 )
  {
    puts("you can choose one action to execute");
    puts("1 up");
    puts("2 down");
    puts("3 left");
    printf("4 right\n:");
    scanf("%d", &v5);
    if ( v5 == 2 )
    {
      ++*(_DWORD *)&v3[25];
    }
    else if ( v5 > 2 )
    {
      if ( v5 == 3 )
      {
        --v4;
      }
      else
      {
        if ( v5 != 4 )
LABEL_13:
          exit(1);
        ++v4;
      }
    }
    else
    {
      if ( v5 != 1 )
        goto LABEL_13;
      --*(_DWORD *)&v3[25];
    }
    for ( i = 0; i <= 1; ++i )
    {
      if ( *(int *)&v3[4 * i + 25] < 0 || *(int *)&v3[4 * i + 25] > 4 )
        exit(1);
    }
    if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 49 )
      exit(1);
    if ( v7[5 * *(_DWORD *)&v3[25] - 41 + v4] == 35 )
    {
      puts("\nok, the order you enter is the flag!");
      exit(0);
    }
  }
}

 Öffnen Sie das Programm

Sagen Sie uns, wir sollen Zahlen eingeben und dann den Vorgang ausführen

Definieren Sie zunächst ein Array vom Typ Byte und dann v4, v5 und i vom Typ int (belegen vier Bytes) (eigentlich kann es auch als v6 bezeichnet werden).

 

Der Vorgang des Kopierens der Zeichenfolge besteht hier darin, diese 25 Zeichen (ein Byte für jedes Zeichen) an die Positionen 0 bis 24 von v3 zu kopieren

 

Dann wird das Folgende basierend auf unserer Eingabe beurteilt (V5)

Schauen Sie sich hauptsächlich die folgenden Urteilsaussagen an

Wenn die von v3[25] konvertierte Zahl, die zur Eingabe von int oder v3[29] gezwungen wird, größer als 4 oder kleiner als 0 ist, wird das Programm abnormal beendet.

Warum steht hier 4*i?

Vergessen Sie nicht, dass der Typ int vier Bytes belegt

Schauen Sie dann weiter unten und stellen Sie fest, dass die ASCII-Codes 49 und 35 1 und # entsprechen. In Kombination mit der großen Anzahl von 01-Strings und dem sogenannten „oben“ und „unten“ oben ist es meiner Meinung nach ein Labyrinth. Der Fall ist gelöst. Tatsächlich beziehen sich v3[25] und v3[29] auf die Zeile und Spalte Ihres Standorts.

Die Position der durch den Typ int (Dword, also Doppelwort, vier Bytes) dargestellten Zeile belegt die Positionen 25 bis 28 des v3-Arrays.

Warum müssen wir 41 subtrahieren?

Das hier zu subtrahierende Array ist v7. Aus der oberen Definition geht hervor, dass die erste Byte-Adresse des v7-Arrays = die erste Byte-Adresse des v3-Arrays + 29 + 4 * 3 = 41 ist. Dies muss natürlich anhand der beurteilt werden Inhalt von v3, gehst du richtig vor?

Zum Schluss zeichnen Sie einfach ein Bild, um die Flagge zu erhalten

Flagge{222441144222}

Acho que você gosta

Origin blog.csdn.net/weixin_51681694/article/details/125603538
Recomendado
Clasificación