RESTCON CTF Writeup

この大会は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}