ก่อนอื่นก็ต้องเล่าถึงรายการนี้ให้ฟังคร่าวๆก่อนเลยครับ

คงมีหลายๆคนที่อาจจะเพิ่งเคยแข่ง รายการ CTF ครั้งแรก หรือ อาจจะไม่เคยได้ยินมาก่อนเลยแล้วมาเห็นโพสต์นี้ แล้วดันกดเข้ามาอ่านบทความอันนี้จะได้ไม่งงกันเนอะ

CTF คืออะไร

CTF ย่อมากจากคำว่า Capture the Flag หรือเรียกตามตัวก็คือการแค็ปหน้าจอธงคำตอบหรือเรียกอีกอย่างว่าการแข่งขันเพื่อแก้ปัญหาเพื่อหาธงคำตอบ โดยโจทย์ปัญหาที่เราได้รับมาจะมีทั้งแบบง่าย ไป จนถึงระดับยากมากๆ(โดยขึ้นอยู่กับผู้จัดการแข่งขันว่าต้องการให้ผู้เข้าแข่งขันนั้นใช้ทักษะอะไรในการแก้ไขปัญหาในโจทย์นั้นๆ โดยพื้นฐานและหลักการการออกโจทย์จะอิงจาก วิธีการทางความปลอดภัยทางด้านความมั่นคงทางไซเบอร์ หรือว่าวิธีการทางคอมพิวเตอร์ โดยแนวทางหรือประเภทนั้นจะมีดังนี้ครับ

-Cryptography

-Steganography

-Pwnable

-Reverse Engineering

-Mobile Security

-Digital Forensic

-Web Security

-Miscellaneous

โดยบางครั้งแต่ละรายการนั้นจะออกประเภทมาแตกต่างกันบ้างแต่ก็จะมีคร่าวๆประมาณนี้ครับ

เรากลับมาเข้าเรื่องของเรากันดีกว่าครับเดี๋ยวจะยาวกันเกินไป

โดยโจทย์ข้อนี้นั้นเป็นประเภท Reverse Engineering (ซึ่งเป็นแนวโจทย์ที่ผมชอบมากที่สุดในการทำ CTF ครับ)

โจทย์ข้อนี้คือ

ฝ่าย IT Security ของบริษัทประกันแห่งหนึ่ง พบว่าคอมพิวเตอร์ของพนักงานท่านหนึ่งติด Malware เนื่องจากไปดาวน์โหลดโปรแกรมเถื่อนมาใช้งาน คุณได้รับมอบหมายจากผู้บริหารบริษัท เพื่อหาว่าใครเป็นคนสร้าง Malware ตัวนี้

โจทย์เราจะได้รับไฟล์มาหนึ่งไฟล์ครับ

https://drive.google.com/file/d/1rmGuEnfhju8IUBuWlUDCXV3ZoQpUG1hd/view?usp=sharing

เมื่อเราทำการแตกไฟล์ซิบออกมาจะได้ไฟล์นี้

เมื่อทำการเช็คว่าไฟล์นี้เป็นไฟล์ประเภทอะไรโดยใช้คำสั่ง File (คำสั่งนี้จะใช้ได้บน Linux หรือ Mac สำหรับคนใช้ Windows อาจจะต้องโหลดโปรแกรมเพิ่มโดยส่วนตัวผมจะใช้ exeinfo ครับ)

file app.exe

หลังจากเรารู้แล้วว่าไฟล์นี้เป็นประเภทอะไรก็ลองรันโปรแกรมขึ้นมาดูก่อนเป็นอันดับแรกเลยครับว่าการทำงานของโปรแกรมนั้นเป็นยังไงบ้าง

หลังจากรันแล้วจะได้ว่าโปรแกรมรอรับค่าอยู่หนึ่งค่า

เราก็ลองใส่มั่วๆไปเลยครับ

ผลที่ได้คือ ชื่อ ที่เราใส่มันผิดครับแล้วโปรแกรมก็วนลูปกลับมารับค่าใหม่

สิ่งที่ผมทำต่อไปก็คือเอาโปรแกรมไป Decompile ต่อครับ

บางคนที่อาจจะไม่เคยทำโจทย์แนวนี้อาจจะติดตรงศัพท์เทคนิคที่ว่า Decompile คืออะไร

การ Decompile คือ การแปลงโปรแกรมที่ถูกว่า Compile (เมื่อเราเขียนโปรแกรมเสร็จเราจะไม่สามารถย้อนกลับไปอ่านโค๊ดได้ตรงๆแต่เราสามารถใช้เทคนิคการ Decompile นี้ในการย้อนกลับ หรือตามชื่อประเภทโจทย์เลยครับ Reverse Engineering หรือการวิศวะกรรมย้อนกลับนั่นเองครับ)

โดยในที่นี้ผมจะใช้ โปรแกรม IDA 64 bit ในการ Decompile นะครับเพราพผมถนัดใช้โปรแกรมนี้มากที่สุด

หน้าต่างคร่าวหลังจาก Decompile ของเรานะครับ (ตอนทำโจทย์ผมรีบมากจนลืมสังเกตไปว่าไฟล์นี้ถูกเข้ารหัสไว้โดย UPX เป็นการเข้ารหัสเพื่อป้องการการ Decompile นั่นเองครับ)

แต่พอรู้ว่าเข้าด้วย UPX เราก็ใช้ UPX เนี่ยแหละครับในการถอดออกมา คล้ายๆการคลายซิปไฟล์นั่นแหละครับ

โดยไฟล์ที่เราคลายออกมาจะถูกเขียนไปทับไฟล์เก่าเลยเราก็เอาเจ้าตัวไฟล์นั้นแหละครับกลับเข้าไป Decompile ใน IDA อีกรอบนึงครับ

เราก็จะเห็นว่าฟังค์ชั่นขึ้นมาเต็มไปหมดไม่ต้องตกใจไปครับ ชื่อฟังค์ชั่นจะแปลกๆแบบนี้หล่ะครับ

แต่โดยทั่วไปแล้ว IDA จะ detect ฟังค์ชั่น main เป็นฟังชั่นแรกแล้วถ้าเราสังเกตโปรแกรมฝั่งขวาดีๆจะเห็นได้ว่า โปรแกรมนั้น มีโค๊ดอะไรไม่รู้ยาวไปหมดให้กด F5 เพื่อทำการ Decompile แล้วเราก็จะได้สิ่งที่เราต้องการครับคือ Source Code อาจจะไม่ใช่ของจริง 100% แต่ก็ทำให้เราพอเข้าใจ การทำงานของโปรแกรมได้ครับ

จะเห็นได้ว่ามีคำพูดที่ใกล้เคียงกับโปรแกรมที่เรารันขึ้นมาตอนแรกครับ

แต่ถ้ามองลงไปดีๆจะเจอว่า มีฟังค์ชั่น รับค่าแล้วทำการ strcpm คือ การทดสองค่าที่รับมาว่าตรงกับที่กำหนดไว้หรือเปล่าถ้าไม่ตรงจะขึ้นคำว่า "Wrong Name" แล้วทำการวนลูปเพื่อรับค่าใหม่

แต่ถ้าเช็คแล้วค่าที่เราใส่ไปตรงกันเป็นอันว่าจะทำการออกจากลูปจนเข้าสู่ฟังค์ชั่นถัดไป คือ showmsg()

เมื่อเราลองเอาค่าที่เราได้มาไปใส่ในโปรแกรมจากตอนแรกสิ่งที่เราตามหาก็จะปรากฏออกมาครับหรือเจ้า Flag นั่นเอง

จริงๆข้อนี้นับว่าเสียดายมากที่ผมไม่ทันได้สังเกตว่าโปรแกรมนี้ถูกเข้าด้วย UPX ทำให้ Submit Flag ช้าจนอดได้ First Blood (เพราะว่าการแข่งขันนี้จะให้คะแนนพิเศษกับทีมที่ทำโจทย์ในแต่ละข้อเป็นทีมแรก โดยให้คะแนนเพิ่ม 10% ครับ)

ผ่านไปแล้วครับสำหรับข้อแรก สำหรับใครที่เป็นมือใหม่อาจจะงงครับแต่ไม่ต้องห่วงครับผมถ้าเราฝึกบ่อยๆผ่านโจทย์บ่อยๆเราขะเก่งขึ้นแน่นอนครับ

หรือใครสงสัยตรงไหนก็สามารถทักเข้ามาถามได้ทางเพจเลยครับ