Ü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}