Runstenshemlis

Kategori

Rev

Beskrivning

Harriet och Ted Trubadur har uppfunnit en mojäng som förvandlar deras runskrifter till rena rappakaljan. På så vis kan de skicka hemlisar till varandra när Ted är iväg på viktingatåg. Nu har Harriet fått ett hemligt meddelande men inser att de tyvärr har glömt implementera någon funktion i mojängen som återställer texten! Kan du hjälpa Harriet att lista ut vad meddelandet innehåller?

Lösning

För denna utmaning får vi en fil, secret.txt, och programmet som har använts för att skydda informationen i denna fil, runstenshemlis.exe.

Analys av runstenshemlis.exe visar att det är en UPX-packad fil. För att packa upp filen kan vi använda verktyget upx. Kör vi kommandot upx -d runstenshemlis.exe får vi den uppackade versionen av programmet och vi kan fortsätta vår analys.

Dekompilerar vi programmet med IDA så hittar vi krypteringsalgoritmen som används för att kryptera secret.txt.

void __fastcall sub_140001530(const char *a1, char *a2, size_t a3)
{
  FILE *v5; // rbx
  unsigned int v6; // eax
  char v7; // r10
  char *v8; // rax
  char v9; // cl
  char v10; // dl
  int Buffer[7]; // [rsp+2Ch] [rbp-1Ch] BYREF

  v5 = fopen(a1, "wb");
  if ( v5 )
  {
    v6 = _time64(0i64);
    srand(v6);
    Buffer[0] = rand() % 255;
    fwrite(Buffer, 1ui64, 1ui64, v5);
    v7 = *a2;
    if ( *a2 )
    {
      v8 = a2;
      v9 = LOBYTE(Buffer[0]) - (_BYTE)a2;
      do
      {
        v10 = v9 + (_BYTE)v8++;
        *(v8 - 1) = v7 ^ v10;
        v7 = *v8;
      }
      while ( *v8 );
    }
    fwrite(a2, 1ui64, a3, v5);
    fclose(v5);
  }
  else
  {
    perror("Error opening file");
  }
}

Här ser vi att det genereras en slumpmässig byte, vilken är den första byten i output-filen. Sedan loopas varje byte i input-filen och XOR:as med den slumpmässiga byten plus positionen i input-filen. Slutligen skrivs den krypterade datan till output-filen.

För att dekryptera secret.txt behöver vi bara göra samma operation. Följande Python-script kan användas för att dekryptera filen:

def decrypt(randomInt, data):
    data = bytearray(data)
    for i in range(len(data)):
        data[i] ^= (randomInt + i) & 0xFF

    print(data.decode())


with open("secret.txt", "rb") as f:
    data = f.read()

decrypt(data[0], data[1:])

Kör vi scriptet får vi följande meddelande:

Jag har tänkt lite gran på vad som kunde hända mig idag
Om jag levde i en annan tid där det var så mycket vildare tag

Skulle jag va' dräng eller biskop eller smed till Sleipners åtta skor
Som jag hade smitt med en hammare som jag fått av gamle Tor.

Jag har jämt gillat spänning och att leva lite vind för våg
Så jag följde säkert med en båt när vi drog ut på ett vikinga tåg
undut{V1k1nG4sånG}
För om jag va stark som en viking när vi gick i land i Aberdeen
Fick jag plocka hem några Skottska får och några tunnor hembränt vin.

Om jag var en viking
Levde jag som Röde Orm

-Ted

Flagga: undut{V1k1nG4sånG}

n00bz

Home of the n00bz CTF team.


By n00bz, 2024-03-23