この大会は2020/8/28 13:30(JST)~2020/8/29 3:30(JST)に開催されました。
今回もチームで参戦。結果は199点で379チーム中263位でした。
自分で解けた問題をWriteupとして書いておきます。
BASIC : 1 (BASIC 1)
逆順にすればよい。
>>> ct = '}GALF_NOCTSER{NOCTSER' >>> ct[::-1] 'RESTCON{RESTCON_FLAG}'
RESTCON{RESTCON_FLAG}
BASIC : 2 (BASIC 3)
base64デコードする。
>>> import base64 >>> ct = b'UkVTVENPTntSRVNUQ09OXzJORF9CQVNJQ19GTEFHfQ==' >>> base64.b64decode(ct) b'RESTCON{RESTCON_2ND_BASIC_FLAG}'
RESTCON{RESTCON_2ND_BASIC_FLAG}
BASIC : 3 (BASIC 3)
base85デコードする。
#!/usr/bin/env python3 import base64 with open('chal.txt', 'r') as f: ct = f.read() flag = base64.a85decode(ct) print(flag)
実行結果は以下の通り。
b'RESTCON{RESTCON_ANOTHER_BASIC_FLAG}'
RESTCON{RESTCON_ANOTHER_BASIC_FLAG}
BASIC : 4 (BASIC 7)
8の倍数の長さになるよう"="でパディングしてbase32デコードし、さらにrot47をかける。
#!/usr/bin/env python3 import base64 def rot47(s): d = '' for c in s: code = ord(c) + 47 if code > 126: code -= 94 d += chr(code) return d ct = 'EN2CIJLSPZ6UYI3UEQSXE7T5GBYH27RFO52CGMDROASHQ4RQOV5XA5SQJY' while True: if len(ct) % 8 == 0: break ct += '=' pt = base64.b32decode(ct) flag = rot47(pt) print(flag)
RESTCON{RESTCON_ANOTHER_BASIC_FLAG!}
Broken (BASIC 15)
表示できていない画像リンクのURLを見てみる。
https://ctf.resethacker.com/RESTCON%7BH1DD3N%7D
RESTCON{H1DD3N}
Garbage (BASIC 30)
$ strings garbage.txt | tail 0sqR #5u6y SQ_3; ckR$ rXf o YL,=q gvdP@ .:t]5 RESTCON{ GR3P_7HE_FL4G}
RESTCON{GR3P_7HE_FL4G}
Baby rev (REVERSE 20)
$ strings bla | grep RESTCON RESTCON{B4S1C_FL4G}
RESTCON{B4S1C_FL4G}
REVERSE 1 (REVERSE 100)
Ghidraでデコンパイルする。
undefined4 FUN_00011199(void) { int iVar1; undefined4 local_18; undefined4 local_14; undefined *local_10; local_10 = &stack0x00000004; iVar1 = FUN_00011257(); local_18 = 0x54534552; local_14 = 0x4e4f43; printf((char *)(iVar1 + 0xe58),&local_18); return 0; } undefined4 FUN_00011257(void) { undefined4 local_res0; return local_res0; }
000111b5 c7 45 f0 MOV dword ptr [EBP + local_18],0x54534552 52 45 53 54 000111bc c7 45 f4 MOV dword ptr [EBP + local_14],0x4e4f43 43 4f 4e 00 000111c3 c7 45 e3 MOV dword ptr [EBP + local_25],0x32357830 30 78 35 32 000111ca c7 45 e7 MOV dword ptr [EBP + local_21],0x33337830 30 78 33 33 000111d1 c7 45 eb MOV dword ptr [EBP + local_1d],0x36377830 30 78 37 36 000111d8 c6 45 ef 00 MOV byte ptr [EBP + local_19],0x0 000111dc c7 45 d2 MOV dword ptr [EBP + local_36],0x33337830 30 78 33 33 000111e3 c7 45 d6 MOV dword ptr [EBP + local_32],0x32377830 30 78 37 32 000111ea c7 45 da MOV dword ptr [EBP + local_2e],0x33377830 30 78 37 33 000111f1 c7 45 de MOV dword ptr [EBP + local_2a],0x33337830 30 78 33 33 000111f8 c6 45 e2 00 MOV byte ptr [EBP + local_26],0x0 000111fc c7 45 c6 MOV dword ptr [EBP + local_42],0x333a3333 33 33 3a 33 00011203 c7 45 ca MOV dword ptr [EBP + local_3e],0x33373a34 34 3a 37 33 0001120a c7 45 ce MOV dword ptr [EBP + local_3a],0x39373a 3a 37 39 00 00011211 c7 45 b7 MOV dword ptr [EBP + local_51],0x31337830 30 78 33 31 00011218 c7 45 bb MOV dword ptr [EBP + local_4d],0x3778302c 2c 30 78 37 0001121f c7 45 bf MOV dword ptr [EBP + local_49],0x78302c33 33 2c 30 78 00011226 66 c7 45 MOV word ptr [EBP + local_45],0x6635 c3 35 66 0001122c c6 45 c5 00 MOV byte ptr [EBP + local_43],0x0
順にASCIIコードをデコードする。
>>> from Crypto.Util.number import * >>> long_to_bytes(0x54534552)[::-1] 'REST' >>> long_to_bytes(0x4e4f43)[::-1] 'CON' >>> long_to_bytes(0x32357830)[::-1] '0x52' >>> long_to_bytes(0x33337830)[::-1] '0x33' >>> long_to_bytes(0x36377830)[::-1] '0x76' >>> long_to_bytes(0x33337830)[::-1] '0x33' >>> long_to_bytes(0x32377830)[::-1] '0x72' >>> long_to_bytes(0x33377830)[::-1] '0x73' >>> long_to_bytes(0x33337830)[::-1] '0x33' >>> long_to_bytes(0x333a3333)[::-1] '33:3' >>> long_to_bytes(0x33373a34)[::-1] '4:73' >>> long_to_bytes(0x39373a)[::-1] ':79' >>> long_to_bytes(0x31337830)[::-1] '0x31' >>> long_to_bytes(0x3778302c)[::-1] ',0x7' >>> long_to_bytes(0x78302c33)[::-1] '3,0x' >>> long_to_bytes(0x6635)[::-1] '5f'
さらにデコードする。
>>> chr(0x52) 'R' >>> chr(0x33) '3' >>> chr(0x76) 'v' >>> chr(0x33) '3' >>> chr(0x72) 'r' >>> chr(0x73) 's' >>> chr(0x33) '3' >>> chr(0x33) '3' >>> chr(0x34) '4' >>> chr(0x73) 's' >>> chr(0x79) 'y' >>> chr(0x31) '1' >>> chr(0x73) 's' >>> chr(0x5f) '_'
RESTCON{R3v3rs3_1s_34sy}
MAGIC : 1 (Forensic 20)
左右反転して、QRコードを読み取る。
RESTCON{29a9df89e2858e5a25c83b6a00352d19}
29a9df89e2858e5a25c83b6a00352d19をmd5クラックする。
mirr0r
RESTCON{mirr0r}
DANCE MONKEY (Forensic 20)
$ exiftool monkey.gif ExifTool Version Number : 10.80 File Name : monkey.gif Directory : . File Size : 224 kB File Modification Date/Time : 2020:08:28 23:28:26+09:00 File Access Date/Time : 2020:08:28 23:29:43+09:00 File Inode Change Date/Time : 2020:08:28 23:28:26+09:00 File Permissions : rwxrwxrwx File Type : GIF File Type Extension : gif MIME Type : image/gif GIF Version : 89a Image Width : 328 Image Height : 300 Has Color Map : Yes Color Resolution Depth : 8 Bits Per Pixel : 8 Background Color : 0 Animation Iterations : 4 Comment : KJCVGVCDJ5HHWU2NJFGDGX2MEFFTGXZUL5GTATSLGNMX2=== Frame Count : 20 Duration : 1.00 s Image Size : 328x300 Megapixels : 0.098
CommentにBase32文字列があるので、デコードする。
>>> import base64 >>> base64.b32decode('KJCVGVCDJ5HHWU2NJFGDGX2MEFFTGXZUL5GTATSLGNMX2===') 'RESTCON{SMIL3_L!K3_4_M0NK3Y}'
RESTCON{SMIL3_L!K3_4_M0NK3Y}