kanyewest CTF

勉強したことをメモしています。

NITIC CTF: Write up

web

82

flag.txtが渡されます。

先頭に

data:image/jpeg;base64

と書かれていることから画像データがbase64エンコードされていると推測できるのでデコードします。

% cat data.txt | base64 -d > flag.jpg

f:id:tekashi:20200719155153j:plain

PPC

prime_factorization

そこらへんにあるサイトで因数分解をしてもらうだけです。

CRYPTO

shift_only

暗号化された文字列と暗号化につかわれたプログラムが渡されます。

from os import environ
flag = environ["FLAG"]
format = environ["FORMAT"]

shift_table = "abcdefghijklmnopqrstuvwxyz0123456789{}_"

def encrypt(text: str, shift: int) -> str:
    assert  0 <= shift <= 9
    res = ""
    for c in text:
        res += shift_table[(shift_table.index(c)+shift)%len(shift_table)]
    return str(shift) + res
for shift in format:
    flag = encrypt(flag, int(shift))

with open("encrypted.flag", "w") as f:
    f.write(flag)

encrypt関数は引数のshift文だけtextをずらして、ずらした数とずらした文章をくっつけて返す関数のようです。

つまり、文字列の先頭にいくつずらしたかが書いてあるのでdecryptするような関数を用意すれば復号化できそうです。ただしformatの内容がみえないので何回暗号化を繰り返したかはわからないので適当にループさせます。

def decrypt(text,shift):
    res = ''
    for c in text:
        res += shift_table[(shift_table.index(c)+shift)%len(shift_table)]
    return str(shift) + res

enc = "6}bceijnob9h9303h6yg896h0g896h0g896h01b40g896hz"

while True:
    shift = int(tmp[0])
    ans = decrypt(enc,shift)
    print(ans)
    tmp = ans
    if 'ctf' in tmp:
        break
$ python3 encrypt_flag.py 
6_ehikoptuhcnc969n_4mbc_n6mbc_n6mbc_n67h{6mbc_n5
6_fknoquvz0nitic_ctf{shift_shift_shift_and_shift}

MISC

cha1n

$ ./c.sh | ./h.sh | ./a.sh | ./1.sh | ./n.sh 
nitic_ctf{cha1n_cha1n_cha1n_cha1n_cha1n_5combo}

Reversing

Fortran

適当にstringsつかったらありました。

$ strings problem.exe | grep nitic
nitic_ctf{No_FORTRAN_Yes_Fortran}

Forensic

anim

flagという名前のファイルが渡されます。

$ file flag 
flag: Microsoft PowerPoint 2007+
 foremost flag 
Processing: flag
|foundat=_rels/.rels �(�
foundat=ppt/presentation.xml���n� ��'�,n'��߉�TM�L�2)j�`6i�b�
*|

出力されたoutputディレクトリの中身をみてみるとflagがありました。

f:id:tekashi:20200719160631p:plain

Recon

Dangerous Twitter

Twitterをみる。