All Articles

ESCAPE CTF 2023 Writeup

8/5 に開催されていた ESCAPE CTF に 0nePadding で参加しました。

コンテスト開催期間の大半で問題ページにアクセスできないヤバめの CTF でしたが、とりあえず解いた問題だけ雑に Writeup 書いておきます。

解けなかった問題は Writeup が 1 つも見つからないので一旦スキップします。

もくじ

ransom system(Rev)

The enemy has spread ransomware on important systems of the country. Please analyze the ransomware and recover the files!

問題バイナリとして与えられた EXE を Ghidra でデコンパイルしてみると以下の処理を行っていることがわかりました。

int __cdecl _main(int _Argc,char **_Argv,char **_Env)

{
  char data;
  FILE *_File;
  FILE *_File_00;
  int iVar1;
  
  __main();
  _File = _file_open("flag.exe","rb");
  _File_00 = _file_open("flag.exe.enc","wb");
  while( true ) {
    iVar1 = _feof(_File);
    if (iVar1 != 0) break;
    data = _read_data(_File);
    data = _encrypt(data);
    _write_data(_File_00,data);
  }
  _fclose(_File);
  _fclose(_File_00);
  return 0;
}

どうやら、flag.exe というファイルを 1 バイトずつ読み出して、_encrypt 関数で暗号化したものを flag.exe.enc に書き出しているようです。

_encrypt 関数のデコンパイル結果は以下の通りでした。

char __cdecl _encrypt(char param_1)
{
  byte bVar1;
  
  bVar1 = param_1 + 5U ^ 6;
  return bVar1 + (char)((int)(char)bVar1 / 0xff);
}

単純な処理でしたので、問題バイナリとして与えられた暗号ファイルを以下のスクリプトで復号します。

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

with open("flag.exe", "wb") as f:
    for d in data:
        b = (((d^6)-5) & 0xff).to_bytes(1, byteorder="big")
        f.write(b)

# ESCAPE{ransomeware_decrypt_key_get!}

復号された flag.exe を実行すると Flag を取得できました。

Hidden(Forensic)

Find the flag hidden in the picture

問題バイナリとして与えられた JPG ファイルは、実は pcap ファイルでした。

そのため、拡張子を変更して Wireshark で解析します。

pcap ファイルでは画像ファイルがやり取りされていることがわかるので、この画像をエクスポートしてステガノグラフィ解析を行うことで Flag を取得できました。

image-20230805163104222

まとめ

以上。