Newbie CTF(N-CTF) 2019 Writeup

この大会は2019/11/2 0:00(JST)~2019/11/3 0:00(JST)に開催されました。
今回もチームで参戦。結果は12854点で566チーム中9位でした。
自分で解けた問題をWriteupとして書いておきます。

Discord (Misc)

Discordに入ると、#rulesチャネルにフラグが書いてあった。

KorNewbie{W31C0m3_t0_0ffiC14l_D1$C05d}

NC_MIC (Misc)

$ nc prob.vulnerable.kr 20000

特に何も表示されない。-vを指定してみる。

$ nc -v prob.vulnerable.kr 20000
Connection to prob.vulnerable.kr 20000 port [tcp/*] succeeded!
KorNewbie{W3lC0m3_T0_K0RN3wB13_W4RG4M3!!!!!}
KorNewbie{W3lC0m3_T0_K0RN3wB13_W4RG4M3!!!!!}

Catch Me (Misc)

アニメーションGIFになっていて、縦4~12、横1~9の表で、各フレームでどこか1箇所に黒丸がある。
縦と横の数字を結合して、順に並べてみる。

119, 48, 119, 95, 101, 52, 103, 49, 101, 95, 51, 121, 51

ASCIIコードとして文字にしてみる。

codes = [119, 48, 119, 95, 101, 52, 103, 49, 101, 95, 51, 121, 51]

flag = ''
for code in codes:
    flag += chr(code)
print flag

実行結果は以下の通り。

w0w_e4g1e_3y3
KorNewbie{w0w_e4g1e_3y3}

BiMilCode (Misc)

$ nc prob.vulnerable.kr 20034
==================================================
This is BiMilCode
I'll give you a chance to type 3 times.
Good Luck
# if you got it how to solve this problem type 0 .
==================================================
You can encode me? :  cc 7d 74 6b b9 61 4e 72 
Input : 11111111
8b 50 52 3f 6e 5d 3e 6b 
you have 2 chance left.
Input : 22222222
8c 51 53 40 6f 5e 3f 6c 
you have 1 chance left.
Input : 00000000
8a 4f 51 3e 6d 5c 3d 6a 
you have 0 chance left.
Think more about it.

入力した文字列とエンコード結果の差が一定になっている。一回何か文字列を8バイト入力すれば、その差がわかるので、逆算して文字列を算出して答える。

import socket

def recvuntil(s, tail):
    data = ''
    while True:
        if tail in data:
            return data
        data += s.recv(1)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('prob.vulnerable.kr', 20034))

data = recvuntil(s, 'Input : ')
send_data = '1' * 8
print data + send_data

code_str = data.split('\n')[6].split(':  ')[1]
codes = code_str.split(' ')

s.sendall(send_data + '\n')
data = recvuntil(s, 'Input : ')
print data + '0'

code_str2 = data.split('\n')[0]
codes2 = code_str2.split(' ')[:-1]

key = []
for i in range(8):
    k = int(codes2[i], 16) - ord('1')
    key.append(k)

pt = ''
for i in range(8):
    code = int(codes[i], 16) - key[i]
    pt += chr(code)

s.sendall('0\n')
data = recvuntil(s, ': ')
print data + pt
s.sendall(pt + '\n')

data = recvuntil(s, '\n').rstrip()
print data
data = recvuntil(s, '\n').rstrip()
print data

実行結果は以下の通り。

==================================================
This is BiMilCode
I'll give you a chance to type 3 times.
Good Luck
# if you got it how to solve this problem type 0 .
==================================================
You can encode me? :  4c 81 c8 8a 8a b7 70 cc
Input : 11111111
55 6b 85 78 8d 6d 36 8d
you have 2 chance left.
Input : 0
Oh really? come on ! : (GtC.{kp
You did it!
KorNewbie{Nace_I_believed_it}
KorNewbie{Nace_I_believed_it}

Top Secret (Forensic)

$ strings Windows\ 7\ Enterprise\ K-b94208dd.vmem | grep KorNewbie
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Fore
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}
KorNewbie{OH..You_Know_B4sic_0F_M3mory_Forensics!}

Contact point (Forensic)

abファイルが添付されている。Android Backup Extractorでjarを取り出す。

>java -jar abe.jar unpack backup.ab backup.jar

jarを展開し、ファイルを見ていく。いくつかdbファイルが入っている。
apps\com.android.browser\db\browser2.dbの中をDB Browser for SQLiteで見ていく。
f:id:satou-y:20191104210113p:plain
Jeju_international_airportについて調べていることがわかる。

KorNewbie{Jeju_international_airport}

REC (Forensic)

exeのヘッダが欠落しているので補完する。
実行しようとすると、次のエラーメッセージが表示される。

libgcc_s_dw2-1.dll が見つからないため、コードの実行を続行できません。プログラムを再インストールすると、この問題が解決する可能性があります。 

libgcc_s_dw2-1.dllをダウンロードしてexeと同じパスに置き、実行すると、フラグが表示された。

KorNewbie{Recover_Signature}

Chat (Forensic)

9GB近くあるzipを解凍すると、vmのファイル構成が展開される。NewbieCTF2019_KakaoTalk.vmdkをさらに解凍する。その中にBasic data partition.imgがあるので、Autopsyで開いて解析してみる。
f:id:satou-y:20191104211111p:plain
最近開いたドキュメントに "last_pc_login.dat.lnk"がある。このパスのあたりを調べてみる。
f:id:satou-y:20191104211209p:plain
/Users/NewbieCTF2019/AppData/Local/Kakao/KakaoTalk/users/login_list.datを見ると、メールアドレスが書いてある。

renek@it-simple.net
KorNewbie{renek@it-simple.net}

really vulnerable rsa (Crypto)

$ nc prob.vulnerable.kr 20020
I got public keys
N = 3512807632561
e = 65537
but... I don't know Ciphertext
Input your key to Decrypt >>> 11
failed to decrypt... here is results
51107770278
2127466376600
474970932836
3174514850353
1890649196132
1976463879009
2034826053429
2522129914975

Nと同じ値を入力してみる。

$ nc prob.vulnerable.kr 20020
I got public keys
N = 4125955954907
e = 65537
but... I don't know Ciphertext
Input your key to Decrypt >>> 4125955954907
failed to decrypt... here is results
0
0
0
0
0
0
0
0
$ nc prob.vulnerable.kr 20020
I got public keys
N = 2497289593217
e = 65537
but... I don't know Ciphertext
Input your key to Decrypt >>> 4994579186434
failed to decrypt... here is results
0
0
0
0
0
0
0
0

何回実行してもNと同じ値を入力すると、0になる。秘密鍵を求める問題ではないと言っていることから、これは平文である可能性が高い。以上のことから以下のような計算をし、m*[input]が複数行並んでいると推測する。

pow(m*[input], e, N) = C

例えばinputに11を指定すれば、結果の表示にinverse(11, N)を掛け算すればフラグになるはず。

import socket
from Crypto.Util.number import *

def recvuntil(s, tail):
    data = ''
    while True:
        if tail in data:
            return data
        data += s.recv(1)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('prob.vulnerable.kr', 20020))

coeff = 11
data = recvuntil(s, '>>> ')
print data + str(coeff)
N = int(data.split('\n')[1].split('= ')[1])
s.sendall(str(coeff) + '\n')

data = recvuntil(s, '\n').rstrip()
print data
pt_nums = []
for i in range(8):
    data = recvuntil(s, '\n').rstrip()
    print data
    pt_nums.append(int(data))

flag = ''
for pt_num in pt_nums:
    m = (pt_num * inverse(coeff, N)) % N
    flag += long_to_bytes(m)

print flag

実行結果は以下の通り。

I got public keys
N = 3491294480189
e = 65537
but... I don't know Ciphertext
Input your key to Decrypt >>> 11
failed to decrypt... here is results
72620922650
2148979528972
496484085208
3174514850353
1912162348504
1997977031381
2056339205801
2522129914975
KorNewbie{Th1s_C1ph3r_1s_t00_vuln3r5ble}
KorNewbie{Th1s_C1ph3r_1s_t00_vuln3r5ble}