この大会は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で見ていく。
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で開いて解析してみる。
最近開いたドキュメントに "last_pc_login.dat.lnk"がある。このパスのあたりを調べてみる。
/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}