kobalt’s log

k08a1tの備忘録

WaniCTF2023 Writeup

はじめに

5月4日~5月6日に開催されたWaniCTF2023に参加しましたので、数問ではありますがWriteupを残します。

Forensics

Just_mp4 [Beginner]

✨✨✨ Enjoy wani CTF ! ✨✨✨

mp4ファイルが配布されているのでexiftoolで調べたところ、Publisherの項目にBase64エンコードされていると思われるFlagが見つかりました。

└─$ exiftool chall.mp4
ExifTool Version Number         : 12.57
File Name                       : chall.mp4
Directory                       : .
...
Video Frame Rate                : 30
Handler Type                    : Metadata
Publisher                       : flag_base64:RkxBR3tINHYxbl9mdW5fMW5uMXR9
...

これをbase64でデコードしてみたところFlagを得ることができました。

└─$ echo RkxBR3tINHYxbl9mdW5fMW5uMXR9 | base64 -d
FLAG{H4v1n_fun_1nn1t}

whats_happening [Beginner]

あなたはとあるファイルを入手しましたが、どうも壊れているようです…… You got a certain file, but it seems to be corrupted...

渡されたファイルをfileコマンドで確認すると、"ISO 9660 CD-ROM filesystem data"という形式のファイルシステムのようです。 mountコマンドでマウントして中のファイルを確認すると2つのファイルが確認できます。

└─$ sudo mount -o loop updog /mnt/ctf
mount: /mnt/ctf: WARNING: source write-protected, mounted read-only.
└─$ ls /mnt/ctf
FAKE_FLAG.txt  FLAG.png

FLAG.pngを確認するとFlag{n0th1ng_much}を得ることができました。

lowkey_messedup [Easy]

誰も見てないよね……? No one is watching me, right...?

渡されたpcapファイルをwiresharkで見てみると、USB通信のようでした。 似たような問題がないか調べたところ、こちらのサイトで同様の問題を解くScriptを発見したため、 お借りして実行したところFlagを取得することができました。

└─$ python3 solve.py chall.pcap
[+] Found : FLAG{Big_br0ther_is_watching_y0ur_keyboard<DEL><DEL><DEL><DEL>0ard}<RET>

"DEL"はbackspaceとして考えるため、FlagはFLAG{Big_br0ther_is_watching_y0ur_keyb0ard}となります。

Reversing

Just_Passw0rd [Beginner]

ELFファイルはWSLやLinux等で./just_passwordと入力することで実行できます。 この問題のELFファイルは実行するとパスワードの入力を求められますが、パスワードが分からなくても中身を覗き見る方法はありますか? ELF file can be executed by typing ./just_password in WSL or Linux. In this challenge, The ELF file requires password. Is there a way to look inside without knowing the password?

渡されたファイルをfileコマンドで調べてみるとELF形式の実行ファイルでした。 とりあえずstringsコマンドを実行してみると、Flagを見つけることができました。

└─$ file just_password
just_password: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=e990f2bb14ee6e4e795426f11da51bf989ef1152, for GNU/Linux 3.2.0, not stripped

└─$ strings just_password
...
Input password >
Incorrect
Correct!
FLAG is FLAG{1234_P@ssw0rd_admin_toor_qwerty}
:*3$"
GCC: (Ubuntu 8.4.0-3ubuntu2) 8.4.0
...

javersing [Easy]

渡されたファイルはjar形式のファイルであったため、JD-GUIを用いて逆コンパイルしてみました。

import java.util.Scanner;

public class javersing {
  public static void main(String[] paramArrayOfString) {
    String str1 = "Fcn_yDlvaGpj_Logi}eias{iaeAm_s";
    boolean bool = true;
    Scanner scanner = new Scanner(System.in);
    System.out.println("Input password: ");
    String str2 = scanner.nextLine();
    str2 = String.format("%30s", new Object[] { str2 }).replace(" ", "0");
    for (byte b = 0; b < 30; b++) {
      if (str2.charAt(b * 7 % 30) != str1.charAt(b))
        bool = false; 
    } 
    if (bool) {
      System.out.println("Correct!");
    } else {
      System.out.println("Incorrect...");
    } 
  }
}

str2[b*7%30]=str1[b]を満たすように、str1の文字列を並び替えたものを入力するとCorrect!と表示されるプログラムのようです。 str1の文字列から、Correct!と表示させるための並び替えた文字列がFlagになりそうな雰囲気があります。

#include<iostream>
using namespace std;
int main(){
    char a[31]="Fcn_yDlvaGpj_Logi}eias{iaeAm_s";
    char b[31]="";

    for(int i=0;i<30;i++){
        b[i*7%30]=a[i];
    }

    for(int i=0;i<30;i++){
        cout<<b[i];
    }
    return 0;
}

上記のソルバーを実行したところFlagを取得することができました。

└─$ ./a.out
FLAG{Decompiling_java_is_easy}

おわりに

今回は2時間ほどしか参加できず、思うように解くことができませんでしたが楽しく参加することができました! 他の方々のWriteupなどを参考に復習しつつ、全完目指して頑張っていきたいです。