HITB-XCTF 2018 — multicheck (Mobile) Writeup

เห็น P. Morimoto (longcat) เขียนน่าสนุกเลยเขียนบ้าง ข้อนี้ก็ทำกับ longcat นั่นแหละ พึ่งเคยเขียน Writeup เป็นภาษาไทยครั้งแรกอาจจะเขียนอ่านยากหน่อยนะครับ

ข้อนี้เป็นข้อ mobile ที่ผมไม่ได้ลองรัน app เลย reverse ล้วนๆ ก็ไม่รู้เหมือนกันว่า app มันเอาไว้ทำอะไร ผมใช่ความรู้สึกในการทำซะส่วนใหญ่หลักการก็จะไม่ค่อยมีนะครับ ใครหวังจะได้ความรู้ก็อาจจะเศร้าๆ หน่อย 55+

โจทย์ชื่อว่า multicheck ในโจทย์ก็ไม่ได้บอกอะไรโยน apk มาให้เลย

เจอแบบนี้ทำไงก็ unzip สิครับรออะไร เพราะว่า apk ใช้ zip ในการ compress อยู่แล้ว จากนั้นอย่ารอช้า decompile dex file ปรกติผมจะใช้ dex2jar แต่ท่านพี่ longcat แนะนำให้ใช้ jadx ก็ใช้สิครับ ใครเขาเถียงเซเล็ปกัน

จะเห็นว่ามีการโหลด native library 1 จากบรรทัดที่ 21 โหลด libcheck.so และจะเห็นว่ามีฟังชั้นหนึ่งยาวๆ ชื่อ i ได้อ่าน file claz.dex แล้วมาเขียนใหม่ใน app root path แต่ว่าลอง decompile แล้วไม่ใช่ flag แล้วมันจะไปอยู่ไหนได้หละ ก็ต้องอยู่ที่ libcheck.so แน่นอน

จากนั้นก็ reverse libcheck.so โดยปรกติ library จะไม่มี entrypoint ผมจะใช้วิธีค้นหา string หรือ function ที่รู้แน่นอนอยู่แล้วว่า app ใช้งาน ในโจทย์ข้อนี้จะเป็น string ชื่อ file คือ claz.dex ตามไปเรื่อยๆ ก็จะเจอ function ประมาณว่านำค่าใน memory มา xor กับตัวนับที่เริ่มด้วย 233

แปลเป็น python ก็จะประมาณนี้ครับ

พอได้ file dex มาแล้วก็ใช้ท่าเดิมครับ jadx-gui decompile เบยจะได้ code ออกมาประมาณนี้ ปล. ผมแก้ error แล้วก็ reverse ให้มันอ่านง่ายขึ้นแล้วนะครับ ถ้า decompile สดๆ เลยมันจะอ่านยากหน่อยๆ แต่ถ้าคนจริง 2018 อ่านปุ๊บเข้าใจปั๊บ ก็ไม่จำเป็นต้องทำแบบผมก็ได้นะครับ

จะเห็นว่าการ encrypt แบบนี้มันสามารถ invert ได้แบบไม่ยากเลยถ้าเรารู้ตัวแปลครบ หรือจริงๆไม่ครบก็ไม่ได้ยากมาก ซึ่งเรารู้ครบอยู่แล้วจาก dex file วิธีก็คือทำย้อนกลับแบบตรงๆ เลยลองดูตามสมการนี้ละกันนะครับ

กำหนด

C คือค่า constant
a = i3
b = i4
c = i5
f(x, y) = (((x << 4) + C) ^(x + y)) ^ ((x >> 5) + C)

สมการที่ได้

c[n] = c[n-1] - C; c[0] = 0
a[n] = a[n-1] + f(b[n-1], c[n])
b[n] = b[n-1] + f(a[n], c[n])

ซึ่งเรารู้ a[n], b[n] และแน่นอน c ทุกตัว เราะจึงสามารถย้อนสมการหา a[0] กับ b[0] ได้ง่ายๆ ดังนี้

b[n-1] = b[n] - f(a[n], c[n])
a[n-1] = a[n] - f(b[n-1], c[n])

จากนั้นก็นำสมการพวกนี้มาแปลงเป็น code ถ้าใครเข้าใจมันจะง่ายมากเลยครับก็แค่ทำย้อนกลับเฉยๆ ผมเขียนสมการใน medium ไม่เป็นมันจะดูยากๆหน่อยนะครับ ที่จริงก็ข้ามไปเลยก็ได้ ดู code เลยดีกว่า 555+

รันแล้วก็ได้ flag แล้วครับ

สรุปไม่เป็น งั้นไม่สรุปละกันครับ ถ้ามีอะไรสงสัยถาม P. Morimoto ได้ครับ 555+ ตัวผมนั้นก็จะพูดไม่ค่อยจะรู้เรื่องก็ขอโทษด้วยครับ SeeYa

    Pongsakorn Sommalai

    Written by

    Husker at E-CQ