เจาะลึกรหัสลับ: เผยความลับในโปรแกรมด้วย Ghidra

เจาะลึกรหัสลับ: เผยความลับในโปรแกรมด้วย Ghidra

การทำความเข้าใจว่าโปรแกรมทำงานอย่างไรโดยที่เราไม่มีซอร์สโค้ด อาจฟังดูเป็นเรื่องซับซ้อน แต่ในโลกของความมั่นคงปลอดภัยไซเบอร์ นี่คือศิลปะที่เรียกว่า Reverse Engineering หรือการวิศวกรรมย้อนกลับ เป็นกระบวนการที่น่าตื่นเต้นในการถอดรหัสและเปิดเผยกลไกภายในของซอฟต์แวร์

เราจะมาสำรวจวิธีที่ผู้เชี่ยวชาญใช้เครื่องมืออย่าง Ghidra เพื่อเจาะลึกเข้าไปในโปรแกรม ค้นหาข้อมูลที่ซ่อนอยู่ และเข้าใจการทำงานของมัน การทำความเข้าใจพื้นฐานเหล่านี้ จะช่วยให้มองเห็นภาพรวมของการตามล่าหา “ธง” หรือข้อมูลลับที่ซ่อนอยู่ในไบนารีไฟล์

เริ่มต้นการสำรวจด้วย Ghidra

เมื่อได้รับไบนารีไฟล์มา สิ่งแรกคือการนำไฟล์นั้นเข้าสู่ Ghidra ซึ่งเป็นเครื่องมือ Reverse Engineering ที่ทรงพลังของ NSA มันช่วยในการแปลงโค้ดเครื่อง (Machine Code) ที่อ่านไม่รู้เรื่อง ให้กลายเป็นภาษา Assembly และที่สำคัญยิ่งกว่านั้นคือการ Decompile กลับมาเป็นโค้ดภาษา C ซึ่งช่วยให้เราเข้าใจตรรกะของโปรแกรมได้ง่ายขึ้นมาก

หลังจาก Ghidra วิเคราะห์ไฟล์เรียบร้อยแล้ว เราจะเห็นโครงสร้างของโปรแกรม ฟังก์ชันต่างๆ และข้อมูลที่ฝังอยู่ การเริ่มต้นที่ดีคือการมองหาฟังก์ชันหลักอย่าง main เพราะส่วนใหญ่มันคือจุดเริ่มต้นการทำงานของโปรแกรม

ตามหาสัญญาณของ “ธง”

ภายในฟังก์ชัน main มีหลายสิ่งที่เราต้องสังเกต บางครั้งอาจมี “ตัวหลอก” หรือ Red Herrings เช่น ฟังก์ชันที่เรียกใช้ rand() หรือ sprintf() ที่ดูเหมือนจะสร้างข้อมูลบางอย่าง แต่เมื่อวิเคราะห์อย่างละเอียด จะพบว่ามันไม่ได้ถูกนำไปใช้ในส่วนที่สำคัญต่อการหาคำตอบ

สิ่งที่ต้องมองหาจริงๆ คือฟังก์ชันที่เกี่ยวข้องกับการ เปรียบเทียบข้อมูล เช่น memcmp หรือ strcmp ฟังก์ชันเหล่านี้มักจะเป็นตัวบ่งชี้ว่าโปรแกรมกำลังตรวจสอบว่า “อินพุต” ที่รับเข้ามา ตรงกับ “ข้อมูลลับ” ที่ซ่อนอยู่ภายในหรือไม่ การเจอ memcmp ที่เปรียบเทียบอินพุตของผู้ใช้กับสตริงที่ฮาร์ดโค้ดไว้ในโปรแกรม ถือเป็นสัญญาณที่ชัดเจนว่าเรากำลังเข้าใกล้ “ธง” แล้ว

ถอดรหัสลับด้วย XOR

เมื่อพบฟังก์ชัน memcmp ที่น่าสนใจ ขั้นตอนต่อไปคือการวิเคราะห์ว่า สตริงฮาร์ดโค้ด ที่ใช้ในการเปรียบเทียบนั้นคืออะไร และมีการเปลี่ยนแปลงใดๆ ก่อนที่จะถูกนำไปเปรียบเทียบหรือไม่ ในกรณีนี้ พบว่าสตริงที่ถูกเก็บอยู่ที่ตำแหน่งหน่วยความจำหนึ่ง (dat_00104040) จะถูก แก้ไข ก่อนที่จะถึงขั้นตอน memcmp

โปรแกรมมีการวนลูป แต่มีเงื่อนไขสำคัญคือ การเปลี่ยนแปลงข้อมูลด้วยการดำเนินการทางตรรกะแบบ XOR (Exclusive OR) จะเกิดขึ้นกับ ไบต์แรกเท่านั้น ของสตริงนั้น โดยใช้ค่าคีย์ที่ได้จากการคำนวณอีกทอดหนึ่ง (0x36 XOR 0x07 ซึ่งให้ผลลัพธ์คือ 0x31) ดังนั้น ไบต์แรกของสตริงลับจะถูก XOR ด้วย 0x31 ในขณะที่ไบต์ที่เหลือยังคงเดิม

การประกอบชิ้นส่วนเพื่อค้นหาคำตอบ

เมื่อเข้าใจกลไกการเปลี่ยนแปลงข้อมูลแล้ว การค้นหา “ธง” ก็เป็นเรื่องของการ ย้อนรอย โปรแกรมต้องการให้อินพุตของผู้ใช้ ตรงกับ สตริงที่ถูกแก้ไขแล้วนั่นเอง

ดังนั้น ธงที่แท้จริงคือการนำไบต์แรกของสตริงฮาร์ดโค้ดเดิม (FL4G...) มา XOR กับ 0x31 และนำผลลัพธ์ที่ได้ มาต่อกับไบต์ที่เหลือของสตริงฮาร์ดโค้ดที่ไม่ได้ถูกเปลี่ยนแปลง การทำเช่นนี้ จะได้ผลลัพธ์ที่เป็นสตริงที่โปรแกรมคาดหวังจากผู้ใช้ เพื่อให้ memcmp คืนค่าเป็นจริง

การถอดรหัสลับในโปรแกรมด้วย Ghidra เป็นกระบวนการที่ต้องใช้ความอดทน การสังเกตอย่างละเอียด และความเข้าใจในตรรกะของคอมพิวเตอร์ การเรียนรู้ที่จะอ่านโค้ด Assembly และ C ที่ Ghidra Decompile ให้ จะช่วยให้เห็นภาพรวมของโปรแกรม และสามารถไขปริศนาที่ซ่อนอยู่ภายในได้อย่างน่าทึ่ง นี่คือโลกของการค้นพบที่รออยู่สำหรับผู้ที่พร้อมจะดำดิ่งลงไปสำรวจ