
เปิดประตูสู่ความลับ: ถอดรหัสโปรแกรมด้วยวิศวกรรมย้อนรอย
ในโลกของการแข่งขันด้านความปลอดภัยทางไซเบอร์ ไม่ว่าจะเป็น CTF (Capture The Flag) หรือการทดสอบเจาะระบบจริง การทำความเข้าใจโปรแกรมที่อยู่เบื้องหลังเป็นทักษะที่สำคัญอย่างยิ่ง
วิศวกรรมย้อนรอย หรือ Reverse Engineering คือกระบวนการถอดรหัสและวิเคราะห์การทำงานของซอฟต์แวร์ เพื่อทำความเข้าใจโครงสร้าง ตรรกะ และฟังก์ชันภายใน โดยไม่ต้องเข้าถึงซอร์สโค้ดต้นฉบับ
บทความนี้จะพาไปสำรวจหนึ่งในความท้าทายที่น่าสนใจ ซึ่งแสดงให้เห็นถึงพลังของการวิเคราะห์พื้นฐานที่สามารถเปิดเผยความลับที่ซ่อนอยู่ในโปรแกรมได้อย่างง่ายดาย
เริ่มต้นสำรวจไฟล์ที่ต้องสงสัย
เมื่อได้รับ ไฟล์ปฏิบัติการ (executable) ที่ไม่รู้จัก สิ่งแรกที่ควรทำคือการตรวจสอบข้อมูลพื้นฐานของไฟล์นั้น
เครื่องมืออย่าง file ช่วยให้ระบุประเภทของไฟล์ เช่น เป็น ไฟล์ ELF 64-bit สำหรับระบบ Linux ซึ่งบ่งบอกถึงสภาพแวดล้อมที่โปรแกรมถูกสร้างขึ้นและทำงาน
นอกจากนี้ การใช้ ldd ยังช่วยตรวจสอบไลบรารีที่โปรแกรมต้องพึ่งพา ซึ่งมักจะเป็น libc สำหรับฟังก์ชันพื้นฐานทั่วไป
อีกขั้นตอนที่สำคัญคือการใช้ strings เพื่อค้นหาข้อความหรือสตริงที่อ่านได้ภายในไฟล์
บางครั้งข้อความเหล่านี้อาจเป็นข้อความแสดงข้อผิดพลาด ข้อความแจ้งเตือน หรือแม้กระทั่งส่วนหนึ่งของรหัสผ่านที่ซ่อนอยู่
ในกรณีนี้ แม้จะไม่พบอะไรที่น่าสนใจเป็นพิเศษในตอนแรก แต่การตรวจสอบเบื้องต้นเหล่านี้เป็นรากฐานที่มั่นคงก่อนที่จะเจาะลึกลงไป
เจาะลึกโครงสร้างด้วยเครื่องมือถอดรหัส
เมื่อการตรวจสอบเบื้องต้นสิ้นสุดลง ก็ถึงเวลาสำหรับ การวิเคราะห์แบบสถิต (static analysis) นี่คือการตรวจสอบโค้ดโปรแกรมโดยไม่ต้องรันโปรแกรมนั้นจริง ๆ
เครื่องมือยอดนิยมอย่าง Ghidra หรือ IDA Pro ถูกนำมาใช้เพื่อถอดรหัส (disassemble) ไฟล์ปฏิบัติการให้กลายเป็นโค้ดภาษาแอสเซมบลีที่มนุษย์อ่านได้
และในบางครั้ง เครื่องมือเหล่านี้ยังสามารถ “decompile” โค้ดแอสเซมบลีกลับไปเป็นโค้ดที่คล้ายภาษา C ซึ่งช่วยให้เข้าใจตรรกะการทำงานได้ง่ายขึ้นมาก
เป้าหมายหลักคือการค้นหาฟังก์ชัน main ซึ่งเป็นจุดเริ่มต้นการทำงานของโปรแกรม
เมื่อเข้าไปดูโค้ดของฟังก์ชัน main สิ่งที่พบมักจะเป็นโครงสร้างทั่วไป: โปรแกรมจะ พิมพ์ข้อความ (printf) เพื่อขอให้ผู้ใช้ป้อนบางอย่าง เช่น รหัสผ่าน จากนั้นจะ อ่านอินพุต (scanf) ที่ผู้ใช้ป้อนเข้ามา
และสิ่งที่สำคัญที่สุดคือ โปรแกรมจะนำอินพุตที่ได้ไป เปรียบเทียบ (compare) กับค่าบางอย่างที่ถูกกำหนดไว้ล่วงหน้า
ค้นพบความลับที่ซ่อนอยู่
ความน่าตื่นเต้นเริ่มต้นขึ้นเมื่อวิเคราะห์ฟังก์ชันเปรียบเทียบ
โปรแกรมนี้ใช้ฟังก์ชัน strcmp เพื่อเปรียบเทียบสตริงที่ผู้ใช้ป้อนเข้ามากับสตริงที่โปรแกรมเก็บไว้ภายใน
และนี่คือจุดพลิกผันที่น่าสนใจที่สุด: สตริงที่ใช้เปรียบเทียบนั้นถูก “ฮาร์ดโค้ด” (hardcoded) อยู่ในโค้ดของโปรแกรมโดยตรง!
หมายความว่ารหัสผ่าน หรือในกรณีของ CTF คือ “แฟล็ก” (flag) ที่กำลังตามหานั้น ไม่ได้ถูกเข้ารหัสหรือซ่อนไว้ในไฟล์อื่นใด
แต่มันถูกฝังอยู่ในตัวโปรแกรมเองอย่างชัดเจน
เมื่อเห็นการเปรียบเทียบ strcmp(user_input, "picoCTF{w4rmup_r3v3rs3_t0p1c_c45y_b4b9f298}") ก็ชัดเจนว่าสตริงที่สองคือคำตอบที่ต้องการ
การได้มาซึ่งรหัสผ่านจึงกลายเป็นเรื่องง่ายดาย เพียงแค่นำสตริงนั้นไปป้อนกลับให้กับโปรแกรม
จากนั้น โปรแกรมก็จะแสดงข้อความ “Correct!” พร้อมกับแฟล็กที่สำเร็จ
ประสบการณ์นี้แสดงให้เห็นว่าแม้ความท้าทายจะดูซับซ้อน แต่บางครั้งคำตอบก็อยู่ตรงหน้าเราเสมอ หากรู้วิธีการมองหาและเครื่องมือที่ถูกต้อง การถอดรหัสโปรแกรมจึงเป็นศิลปะที่ผสมผสานระหว่างเทคนิค การสังเกต และการคิดวิเคราะห์ได้อย่างยอดเยี่ยม