บทนำ (Overview)
จากบทความก่อนหน้าเราเสนอวิธีการเปลี่ยนค่าในขณะ “Run-time” (How to bypass login – Debugging with GDB (iVulnerApp)) มาในบทความนี้เราจะทำเปลี่ยนค่าของคำสั่งในรูปแบบ “Static” หรือเรียกว่าการ “Patching” โปรแกรม ซึ่งจำเป็นต้อง “Dissembling” ตัว “Application” เสียก่อน แล้วค่อยๆ ตรวจสอบขั้นตอนการทำงานของโปรแกรมก่อนจะปรับเปลี่ยนค่าให้เป็นตามต้องการ
ซึ่งในบทความนี้กล่าวถึงการข้ามหน้า “Login” ไป ดังนั้นเราจะพยายามปรับเปลี่ยนการตรวจสอบ “username” และ “password” ให้สามารถเข้าถึงหน้าหลัง “Login” โดยกรอก “username” และ “password” ผิด ๆ ไปทั้งคู่นั้นเอง
ขั้นตอน (Steps)
- ติดตั้งโปรแกรม “Hopper” บนเครื่อง “Mac”
- ติดตั้งโปรแกรมที่ต้องการทดสอบบน “iOS” จากนั้นดึง “Binary” มาไว้ที่เครื่อง “Mac” โดยเข้าไปที่โฟลเดอร์ดังข้างล่างผ่านโปรแกรม “File Transfer” หรือใช้สาย “Data link” ก็ได้
- เปิดโปแกรม “Hopper”
- จากนั้นโหลด “Binary” เข้ามายัง “Hopper” โดยใช้เมนู “File – Read Executable to Disassemble…” ดังรูป
- เลือกไฟล์ “Binary” ที่เอามาจากเครื่อง “iOS”
- จากนั้นกด “Ok”
- โปรแกรมจะแสดงหน้าจอ 2 ฝั่ง ฝั่งซ้ายคือส่วนค้นหา ฝั่งขวาคือ ส่วนคำสั่ง จากรูปเราสามารค้นหาแบบ “Labels” ซึ่งก็คือชื่อ “Method” ของโปรแกรมที่กำลังตรวจสอบนั้นเอง
- ถ้าเป็น “Strings” โปรแกรม “Hopper” จะพยายามรวบรวมมา “String” มาให้ทั้งหมด
- เราสามารถไล่หา “Method” ได้โดยเปรียบเสมือนการทำ “Reverse Engineering” ดังนี้
- เราตัวอย่างเราพบว่ามี “Method” ที่ชื่อ “cmdLogin” น่าสนใจ ซึ่งก็อยู่ใน “Class” ที่ชื่อ “ViewController”
- พอเราคลิกที่ “Method” เราสนใจด้านซ้ายจะปรากฏส่วนของคำสั่งโปรแกรม (ภาษา Assembly)
- ตัวโปรแกรมสามารถแปลงคำสั่งเครื่องเป็น “Pseudo code” ให้เราสามารถตรวจสอบได้ง่ายขึ้นโดยการกดปุ่ม
- และยังสามารถสร้าง “Control Flow Graph” ได้โดยกดปุ่ม
- ที่นี้เราจากการเราทดลองใช้งานโปรแกรมจะพบว่า เราต้องใส่ “username” และ “password” แล้วกดปุ่ม “SUBMIT” ถ้าถูกต้องจะสามารถ “Login” ผ่านไปได้ และตอนนี้เรากำลังตรวจสอบ “Instruction” ในส่วนของกดปุ่ม “Login” นั้นเอง เราจะพยายามหา คำสั่งที่ชื่อ “CMP” เมื่อพบแล้วเราสามารถแก้ไขคำสั่งได้โดยไปที่ “Modify – Assemble Instruction” ทำหรับคำสั่ง “CMP” สามารถศึกษาเพิ่มเติมได้ที่ How to bypass login – Debugging with GDB (iVulnerApp) และ https://www.tutorialspoint.com/assembly_programming/assembly_conditions.htm
- จากตัวอย่างโปรแกรม มี 2 ที่เนื่องจากโปรแกรมต้องตรวจสอบให้ “username” และ “password” เป็นจริงทั้งคู่) ดังตัวอย่าง
if (username = True) and (password = True) then print "Success login" else print "Invalid username or password" end if
- จากเดิมคือค่า “r0” เป็น “#0x0” นั้นหมายความว่าถ้าเป็นจริง จะสามารถเข้าไปยังหน้าหลัง “Login” ได้ แต่ถ้าไม่ทราบว่า “username” และ “password” เป็นอะไร เราก็ไม่สามารถทำให้เป็นจริงได้ ดังนั้นเราจึงเปลี่ยนเป็น “username = ผิด” และ “password = ผิด” ถึงจะผ่านไปยังส่วนของ “True” ได้เช่นกันดังนี้
if (username = False) and (password = False) then print "Success login" else print "Invalid username or password" end if
- โดยเปลี่ยนค่า r0 เป็น #0x1 ดังนี้
cmp r0, #0x1
- เปลี่ยนค่าให้ครบ 2 จุด
32bit -Thumb
64 bit – ARM
- เมื่อเปลี่ยนแปลงเสร็จเรียบร้อยแล้วทำการ “Export” ไฟล์ทับของเก่า โดยไปที่ “File – Produce New Executable”
- Save ทับไฟล์เดิม
- จากนั้นกด Replace
- เสร็จแล้วลากไฟล์ไปทับของเก่าบน “iOS”
- ในกรณีไฟล์ใน “iOS” ลบไปแล้วลากเข้าไปใหม่ให้เปลี่ยน “Permission” สามารถมี “Execute” ได้ด้วย
- จากนั้นเปิดโปรแกรมขึ้นลองใส่ “username” และ “password” ผิด ๆ ทั้งคู่
- ก็จะสามารถเข้าไปหน้าหลัง “Login” ได้