ผมคิดว่าหลาย ๆ คนที่เคยอ่านเรื่องราวของผมมาบ้าง น่าจะพอทราบกันดีว่าปกติผมสอบใบเซอร์อย่างเดียว ไม่ได้เคยลองทำงานหรือลงแข่งในสนามจริงของ Cybersecurity มากนัก โดยเฉพาะฝั่ง Red Team ที่ผมไม่ค่อยเชี่ยวชาญเท่าไร
แต่ล่าสุดทางมหาวิทยาลัยศรีนครินทรวิโรฒ (Srinakharinwirot University)ได้จัดกิจกรรมการแข่งขัน SWU Capture the Flag Competition 2025 เป็นการแข่งขันเจาะระบบเพื่อชิงธง (Capture The Flag) ซึ่งเขาเปิดรับเฉพาะเด็กมหาวิทยาลัย และบังเอิ๊ญบังเอิญ ผมก็ยังมีสถานะเป็นนักศึกษาอยู่ รุ่นน้องที่เรียนในคณะด้วยกันก็เลยชวนผมมาสมัคร
CTF คืออะไร
อย่างที่เกริ่นไว้ Capture The Flag หรือ CFT คือกิจกรรมที่ให้เราค้นหาธง ซึ่งเขาจะมีแพทเทิร์นของธงมาให้เราไว้ใช้มองหา (คือถ้ามันไม่มีแพทเทิร์นบอก หลายคนคงสับสนแหละว่าสรุปข้อความไหนคือธง) ส่วนมากจะอยู่ในรูปแบบข้อความ และจะซ่อนอยู่ในส่วนต่าง ๆ ของเกมการแข่งขัน
กิจกรรมนี้นิยมอย่างมากในสาย Cybersecurity และโดยเฉพาะฝั่ง Pentesting เพราะเราจะได้มีการเจาะระบบต่าง ๆ ทั้งซอฟต์แวร์, มือถือ, เว็บไซต์, ระบบปฏิบัติการ, เน็ตเวิร์ก, ไฟล์ หรือการถอดรหัสต่าง ๆ ซึ่งในนั้นจะมีข้อความธงซ่อนอยู่ และสำหรับธงในการแข่งขันครั้งจะมีแพทเทิร์น swu{………….} ครับ
Write-Up
ซึ่งในบทความนี้ผมจะพาเพื่อน ๆ ไปดูแนวทางที่ผมใช้เจาะระบบในระหว่างการแข่งขัน แต่จะนำเสนอเพียง Reverse Engineering ละกัน เพราะหัวข้อนี้ทีมผมแก้โจทย์ได้ทั้งหมด
เอาล่ะเรามาเริ่มกัน
ข้อที่ 1 Lost But Not Forgotten (50 คะแนน)
จากโจทย์เขาจะให้เราหาธงจากโปรแกรม challenge.exe โดยมี Hint ว่าให้ใช้ Cat หรือ Strings ในการค้นหา
ผมใช้ Kali linux ในการแก้โจทย์ หลังจากอัปโหลดทุกอย่างไว้ใน Kali แล้ว ผมก็เริ่มแก้โจทย์ด้วยคำสั่ง Strings ก่อนเลย
strings challenge.exe (หรือจะพิมพ์ strings แล้วลากไฟล์มาใส่เลยก็ได้ครับ)
จากนั้นระบบจะทำการรันข้อมูลสตริงภายในไฟล์ .exe โชคดีที่ string ของ challenge.exe ไม่ค่อยยาว ผมเลยหาธงได้ไม่ยาก
สำหรับข้อนี้ flag = swu{fl4g_1s_H3r3}
ข้อที่ 2 You’re not a monkey… right? (100 คะแนน)
ผมขอพูดตรง ๆ ว่าสูตรลับในการที่ผมใช้เมื่อครั้งทำ Malware Analysis เพื่อสอบ PRMP (อ่านบทความย้อนหลังได้ที่นี่) ผมใช้ strings เพื่อตรวจเช็กแทบทุกครั้ง
ในที่นี้ก็เหมือนกัน ผมแทบไม่แตะตัวโปรแกรม .exe เพื่อเปิดเช็กเลย เพราะในแง่ของการทำงานมันก็ค่อนข้างเสี่ยงนะที่อยู่ ๆ เราจะรันโปรแกรมเหล่านี้ขึ้นมาทันที ถ้าใช้แนวคิดของ Malware Analysis คือ เราทำ Static Analysis ก่อน อ่านข้อมูลของตัวมันให้เข้าใจ แล้วเราค่อยทำ Dynamic Analysis เพื่อดู “Dynamic” ของโปรแกรมขณะทำงาน และเช่นเดียวกันกับไฟล์ Monkey.exe ผมก็เลือกรัน stringsก่อน
strings Monkey.exe (เวลารันคำสั่ง อย่าลืมตัวพิมพ์เล็กพิมพ์ใหญ่ต้องเป๊ะนะครับ)
แต่ถ้าสตริงเยอะมาก ตาลาย ผมมีสองแนวทางต่อไปครับ ผมจะลองใช้ strings Monkey.exe | grep -i flag เพื่อค้นหาธง หรือถ้าเรารู้แพทเทิร์นของธง เราก็อาจจะค้นหาอะไรที่มันจำเพาะขึ้น เช่น strings Monkey.exe | grep -i swu
เท่านี้เราก็ได้ธงมาแล้วโดยไม่ต้องรัน
แต่ถ้าเราอยากดูเอง ค่อย ๆ ดู ในกรณีที่ตัวโปรแกรมมันไม่โชว์ธงออกมาโดยตรง และเราไม่อยากให้มันรันสตริงรวดเดียว ให้เรารันคำสั่งนี้ได้ครับ strings Monkey.exe | less คำสั่งนี้จะช่วยให้เราค่อย ๆ scroll เมาส์ดูทีละบรรทัดได้เหมือนอ่านเอกสารทั่วไปครับ
สำหรับข้อนี้ Flag = swu{ac7a1e879533c456ec94573f409b6d51}
ข้อที่ 3 Press Start (200 คะแนน)
โจทย์ข้อนี้เดี๋ยวเราจะเริ่มทำ Dynamic Analysis กันละ แต่ทีนี้เรามาดูสตริงกันก่อน
ผมใช้ strings Press_Start.exe | grep -i flag และ strings Press_Start.exe | grep -i flag แต่ปรากฎว่าไม่ขึ้นธง และผมสังเกตเห็น Flag unlocked: %s แสดงว่าแบบนี้เราต้องดูแบบเจาะลึกกันสักหน่อย
ผมใช้ strings Press_Start.exe | less เลื่อนลงมาเรื่อย ๆ จนเจอเข้ากับชุดข้อความด้านล่าง จนไปเอ๊ะกับข้อความบรรทัดที่ 3 ที่บอกว่า Up Up Down Down …. Boom! Contra-style!
ในหัวผมคิดแล้วนะ สูตรเกม Contra ขึ้น ขึ้น ลง ลง ซ้าย ขวา ซ้าย ขวา B A Select Start ซึ่งใครที่ไม่ใช่เด็กยุค 90 หรือยุค Millenium อาจจะงงได้ เอาล่ะเดี๋ยวเรามาดูที่ตัวโปรแกรมกันหน่อย
ตอนนี้เราต้องเข้าสู่โหมด Dynamic Analysis กันแล้ว ผมลองเปิดโปรแกรมบนWindows แล้วก็ลองใส่ข้อความลงไป แต่ใส่วิธีไหนมันก็ยังผิด ผมยังไม่ยอมแพ้ เรากลับมาที่ Kali
คราวนี้ผมใช้ radare2 เพื่อดูการทำงานของโปรแกรม r2 -A Press_Start.exe
เมื่อกดรันแล้ว ก็จะขึ้นคำแนะนำในการใส่คอมมานด์ต่อ ผมก็จะใส่ afl เพื่อเรียกดูฟังก์ชันทั้งหมด
ด้วยความที่ผมทำ Malware Analysis มาบ่อย ผมรีบมองหาฟังก์ชัน main ก่อนเลย แต่เมื่อใช้ radare2 เราจะมุ่งเป้าไปที่ sym.main เพราะมันผ่านการวิเคราะห์โดย radare2 มาแล้วครับ
pdf @ sym.main อันนี้มาจาก Print Disassembly Function at sym.main หมายถึงให้แสดงค่าฟังก์ชัน sym.main ที่ผ่านการ disassemble มาแล้ว ง่าย ๆ คือ เราใช้เพื่อ “อ่าน” ว่าฟังก์ชันนั้นทำอะไร จะได้ค่าดังภาพ
เริ่มเห็นจุดสังเกตแล้วใช่ไหมครับ wwss เทียบกับคีย์บอร์ดคอม มันก็คือ ขึ้นขึ้นลงลงนั่นเอง
ผมนำไปกรอกในตัวโปรแกรมเป็น wwssadadba ก็จะได้ค่าดังภาพ
Flag = c3d1ezJhNGQxZmVhNTk1NTdiYjdjYzUyYjI4NGU2MzMwN2MwfQ==
ยังไม่จบนะครับ จับไปเข้า Cyberchef เพื่อถอดโค้ด Base64
สำหรับข้อนี้ Flag = swu{2a4d1fea59557bb7cc52b284e63307c0}
ข้อที่ 4 Missile Protocol (300 คะแนน)
แอบสปอยล์ก่อนเลยได้ไหม ผมคิดว่าข้อนี้ง่ายเท่าข้อแรกเลยนะ ง่ายยังไปดูกันเลยครับ
เช่นเดิมผมใช้คำสั่ง strings Missile_Protocol.exe | less ค่อย ๆ ไล่อ่านทีละบรรทัด จนกระทั่งเจอเข้ากับ Flag: swu{229df1019ecdd2b056b3bb67ca54b032}
เห้ย!! มันง่ายไปหรือเปล่านะ แต่พอผมลองเอาธงไปใส่ก็ปรากฏว่าใช่ครับ นี่คือธงที่ถูกต้อง เห็นไหมล่ะว่าทำไมผมถึงบอกว่ามันง่ายเหมือนข้อแรก
และข้อสุดท้าย Flag = swu{229df1019ecdd2b056b3bb67ca54b032}
ความรู้สึกของผมกับพาร์ท Reverse Engineering
ถ้าเอาแค่ความเห็นผมคนเดียวนะ ง่าย ง่ายเลย อาจจะวุ่นวายนิดหนึ่งในข้อที่ 3 แต่ข้ออื่น ๆ ง่ายมากครับ และที่สำคัญในพาร์ท Reverse Engineering นี่ผมไม่ได้กดดู Hint เลย ก็จะไม่เสียคะแนนไปแม้แต่ข้อเดียวครับ
ส่วนในพาร์ทอื่น ๆ จะมีพาร์ท Network ที่กลุ่มผมเก็บทุกข้อเหมือนกัน แต่ในข้ออื่น ๆ Cryptography, Mobile, Web App, Binary, Forensics อันนี้เหลืออย่างละ 1-2 เพราะผมไม่เชี่ยวชาญจริง ๆ โดยเฉพาะ Mobile Pentest ครับ
เดี๋ยวคงจะมีกิจกรรมน่าสนใจแบบนี้ออกมาเรื่อย ๆ นะครับ เพื่อน ๆ พี่ ๆ และน้อง ๆ คนไหนที่สนใจอยากลองเล่น จริง ๆ เขามีเว็บไซต์ให้ลองเล่นทั้งฟรีและเสียเงินครับ ไม่ว่าจะเป็น Hackthebox, Tryhackme หรือ PicoCTF ลองไปเล่นกันได้เลย
You must be logged in to post a comment.