Malware Analysis — Static Analysis Part 2 : Strings
หลังจากที่เราได้เรียนรู้เรื่องการทำ Malware Analysis โดยการทำ Hashing เบื้องต้นไปแล้ว
บทความนี้จะเป็นในส่วนของเทคนิคการทำ Strings เพื่อวิเคราะห์ Malware
ถ้าพร้อมแล้วมาเริ่มกันเลยครับ…
Strings
Strings เป็นกลุ่มของตัวอักษร ( Character Set ) ต่างๆที่นำรวมกัน เป็น Strings ซึ่งโดยทั่วไปแล้ว Program หรือ Executable file จะมี Strings อยู่ในไฟล์ เพื่อใช้งานภายใน Program ยกตัวอย่างค่า Strings ที่พบใน Program เช่น Prints Message ต่างๆที่แสดงผลออกทางหน้าจอ, Location ที่ใช้ในการจัดการเกี่ยวกับไฟล์, IP Address / URL ต่างๆที่ใช้ในการรับส่งข้อมูลของ Program
หลักของการหา Strings ใน Program
ก่อนที่เราจะรู้หลักของการหา Strings ใน Program หรือ Executable file เราจะต้องรู้ลักษณะในการเก็บข้อมูลกันก่อน โดยปกติทั่วไปแล้วข้อมูล Character จะเก็บอยู่ในรูปแบบของ ASCII หรือ Unicode โดยแต่ละรูปแบบมีขนาดที่ใช้ในการเก็บข้อมูลดังนี้
- ในรูปแบบของ ASCII จะเก็บข้อมูลโดยใช้ 8 Bits (1 Bytes) ต่อ 1 Character
- ในรูปแบบของ Unicode จะเก็บข้อมูลโดยใช้ 16 Bits (2 Bytes) ต่อ 1 Character
โดย Strings คือข้อมูลที่ประกอบไปด้วย Character ต่างๆรวมกันและจะปิดท้ายด้วย Null terminator ที่มี Hex เป็น 00 เสมอ
ทีนี้เราลองมาดูตัวอย่างกัน…
โดยจะใช้ hexdump command ( Linux ) เพื่อดูข้อมูลของไฟล์ในรูปแบบของ Hex ( ฐาน 16 ) แสดงผลคู่กับ ASCII โดยใช้ Command
$ hexdump -C [filename]
จะได้ผลออกมาตามภาพด้านล่าง โดยแบ่งออกเป็น 3 Column หลักดังนี้
- Column ด้านซ้ายเป็นตำแหน่งของข้อมูล
- Column ตรงกลางเป็นการแสดงข้อมูลในรูปแบบ Hex
- Column ด้านขวาเป็นการแสดงข้อมูลในรูปแบบของ Character
อย่างที่กล่าวไว้ข้างต้นว่า ASCII นั้นใช้ 1 Bytes ในการเก็บข้อมูล 1 Character ดังนั้น
- 4d ( Hex ) จะมีค่าเป็น M ( Character )
- 5a ( Hex ) จะมีค่าเป็น Z ( Character )
- 50 ( Hex ) จะมีค่าเป็น P ( Character )
- 00 ( Hex ) เป็น Null terminator ที่บ่งบอกถึงจุดสิ้นสุดของ Strings ชุดนี้
ตามภาพด้านล่าง
เท่ากับว่าหากเราลองใช้คำสั่ง strings เพื่อหา Strings ในไฟล์เราจะต้องพบ MZP เป็น Strings ชุดแรก
เอาละ… เรามาลองใช้คำสั่ง strings ( linux ) เพื่อแสดงเฉพาะ Strings ของไฟล์ออกมาตามด้านล่าง
$ strings -3 [filename]
** ใช้ options -3 เนื่องจาก Default ของ Command : strings นั้นจะหา Strings โดยประกอบไปด้วย Character อย่างน้อย 4 ตัว แต่เราต้องการ Strings : MZP ที่ประกอบไปด้วย Character เพียง 3 ตัว เราจึงต้องใช้ -3 เพื่อให้แสดงออกมา
ก็จะเห็นได้ว่า Strings ชุดแรกคือ MZP ( ซึ่งถูกปิดท้ายด้วย 0x00) นั่นเอง
ประโยชน์ของ Strings ในด้าน Malware Analysis
เราสามารถทำการหา Strings ในลักษณะของ Prints Message, Directory/Location, URL, IP, Windows Functions, DLL Import เพื่อใช้คาดเดาลักษณะการทำงานของ Program ได้ ยกตัวอย่าง เช่น
- ทำ Strings แล้วพบ SetWindowsHookEx (Windows Functions) ก็อาจเดาได้ว่ามีลักษณะในการรับ Keyboard input ซึ่งอาจเป็น Malware ในลักษณะที่เป็น Keylogger
- ทำ Strings แล้วพบ IP Address/URL ก็หมายความว่า Program นี้อาจมีการติดต่อสื่อสารกับ IP Addrees/URL ดังกล่าว ซึ่งเราสามารถนำ IP Address/URL ไปเช็คบน OSINT เพิ่มเติมได้ว่ามีลักษณะเป็น C2 server หรือไม่
แนะนำ Tools ที่ใช้ในการหา Strings
โดยทั่วไปแล้วการหา Strings ในไฟล์จะมี Tools ที่แนะนำดังนี้
- Windows : PEStudio, Strings ( Microsoft )
- Linux : strings
- MacOS : strings
ขั้นตอนการใช้ Strings ในการทำ Malware Analysis
เอาละเรามาเริ่มลงมือกันเลยดีกว่า…
ในตัวอย่างนี้ใช้ illusionBot ในการหา Strings ซึ่งผมก็ไม่รู้จัก ดังนั้นเรามาลองวิเคราะห์กันเลย
https://github.com/ytisf/theZoo/blob/master/malwares/Binaries/IllusionBot_May2007/IllusionBot_May2007.zip
- เริ่มต้นด้วยการใช้ Command Strings เพื่อแสดง Strings ที่อยู่ในไฟล์ โดยจะใช้ options เพื่อแสดง Offset ของ Strings เป็น Hex (ฐาน16) ตามด้านล่าง
$ strings -t x BOTBINARY.EXE | more
2. จะพบว่ามี Strings ที่แสดงผลออกมามากมาย แต่เราจะพบ Strings ที่ไม่มีการสื่อความหมายใดๆ เช่น j+Ph ซึ่งมันไม่ใช่ Strings อาจจะเป็นข้อมูลที่เป็น CPU instructions หรือ Memory Address หรือข้อมูลอื่นๆ ซึ่งไม่เกี่ยวข้องกับข้อมูลที่เราต้องการในการวิเคราะห์ ตามภาพด้านล่าง
3. ให้ค้นหา Strings ที่เป็นลักษณะของ Prints Message, Directory/Location, URL, IP, Windows Functions, DLL Import เพื่อใช้ในการวิเคราะห์ลักษณะการทำงาน
ซึ่งหากเราสังเกตุและวิเคราะห์ดีๆจะพบว่ามี Strings ดูเหมือนจะมีประโยชน์นำมาวิเคราะห์ได้ ตามภาพด้านล่าง
มาลองวิเคราะห์ Strings ที่น่าสนใจกันเลยครับ
- MoveFileA (cd06)
เป็น Windows Functions ที่ใช้ในการย้าย File / Directory เท่ากับว่า Program ตัวนี้มีความสามารถในการย้าย File / Directory ต่างๆได้ ( สามารถดูข้อมูลของ Function ได้ที่นี่ ) - cmd.exe (d0ac)
มีการกำหนดชื่อ Executable Files ที่เป็น cmd.exe ไว้ใน Program อาจเป็นไปได้ว่า Program นี้มีการเรียกใช้ cmd.exe ด้วย - Bindport: Couldnot bind main socket (d0b4), Bindport: Couldnot create main socket (d0d8), bindport_port (d104), bindport_state (d114)
Strings ชุดนี้แสดงให้เห็นว่า Program อาจมี Connection ในการติดต่อสื่อสารเพื่อรับส่งข้อมูลกับเครื่องอื่นๆ - C:\WINDOWS\system32\drivers\ntndis.sys (d148), ntndis (d170)
เป็น Location ของไฟล์บางอย่าง นี่อาจเป็น Location ที่ Attacker ทำการ Drop file ชื่อ ntndis.sys ให้มีความคล้ายกับ ndis.sys ที่เป็น Network Driver Interface Specification (NDIS) โดยตั้งชื่อให้คล้ายกันเพื่อทำให้ดูเนียน เหมือนเป็นไฟล์ของ Windows ที่มีกันปกติ
ซึ่งผมได้ทำการนำ “ntndis.sys” ไปค้นหาข้อมูลเพิ่มเติมบน Google ก็ได้พบกับข้อมูลที่น่าสนใจทันที ตามภาพด้านล่าง
เข้าไปดูรายละเอียดก็จะพบว่ามันเป็น Trojan และมี Location ของการ Drop file ซึ่งตรงกับ Location ที่เราเจอใน Strings เลย
นอกจากนั้นยังมี Strings ที่น่าสนใจอีก ตามภาพด้านล่าง
จะเห็นได้ว่ามีทั้ง Prints Message ต่างๆที่น่าสนใจเยอะมาก มีทั้งที่เกี่ยวกับการ Connection และเกี่ยวกับการใช้ Password ในการเข้าใช้งาน รวมถึงมี User Agent ที่อาจจะใช้งานในการรับส่งข้อมูลด้วย
นอกจากนี้ยังมี Strings อื่นๆที่น่าสนใจอีกมากมาย ที่ไม่ได้ยกตัวอย่าง
ข้อควรระวังในการใช้ Strings ในการทำ Malware Analysis
ต้องตั้งเป็น Assumption ก่อน และต้องหาหลักฐานอย่างอื่นมาสนับสนุนว่าเป็นอย่างที่เราคิดจริงๆ เพื่อป้องกันไม่ให้การวิเคราะห์ผิดพลาด ยกตัวอย่าง เช่น
- พบ Strings ที่น่าสนใจคือ C:\WINDOWS\system32\drivers\ntndis.sys (d148), ntndis (d170)
- ตั้ง Assumption ว่า นี่อาจเป็น Location ที่ Attacker ทำการ Drop file ชื่อ ntndis.sys ให้มีความคล้ายกับ ndis.sys ที่เป็น Network Driver Interface Specification (NDIS) โดยตั้งชื่อให้คล้ายกันเพื่อทำให้ดูเนียน
- เราจะต้องหาหลักฐานมายืนยันจากสิ่งที่เราตั้ง Assumption ไว้ โดยทำการตรวจสอบข้อมูลเพิ่มเติมเกี่ยวกับ Location ที่พบ เหมือนกับที่ผมได้นำไป Search Google ตามด้านบน หรือต้องหา File ใน Location ดังกล่าว ในเครื่องที่ติด Malware ตัวนี้ว่ามีการ Drop ไฟล์จริงหรือไม่
และนอกจากนั้นอาจพบการ Strings ที่ Attacker จงใจใส่มาเพื่อทำให้การวิเคราะห์ผิดพลาดได้
ดังนั้นอย่าเพิ่งรีบทำการสรุปอะไรก็ตาม ที่เรายังไม่มีหลักฐานมายืนยัน เพราะอาจทำให้วิเคราะห์ผิดพลาดได้
Packed Program
สุดท้ายข่าวร้ายคือเราไม่สามารถการวิเคราะห์จาก Strings กับ Program หรือ Executable files ที่ถูกทำการ Packing หรือ Ofuscation มาได้ เนื่องจากเวลาทำการหา Strings จะแทบไม่เห็น Strings อะไรที่ดูแล้วมีประโยชน์ต่อการวิเคราะห์เลย
สุดท้าย
การทำ Malware Analysis จากการทำ Strings ช่วยให้เราได้ Hint เกี่ยวกับ Functions การทำงานต่างๆของ Malware แต่จะไม่เวิร์คกับไฟล์ที่ถูกทำ Packing
มา
ดังนั้น หากเราไม่สามารถใช้ Strings ในการวิเคราะห์ Malware ได้ เราอาจจะต้องใช้เทคนิคในการทำ Malware Analysis ในหลายๆรูปแบบที่แตกต่างกันออกไป
สำหรับบทความนี้ก็จบเพียงเท่านี้ครับ บทความต่อไปก็จะเป็นบทความในเรื่องของการวิเคราะห์ Malware แบบ Static Analysis ด้วยการวิเคราะห์จากไฟล์ Executable ที่มีการทำ Dynamic Linking กันครับ
Reference
https://www.symantec.com/security-center/writeup-print/2008-070214-1212-99
https://docs.microsoft.com/en-us/windows-hardware/drivers/network/overview-of-ndis-versions
https://github.com/ytisf/theZoo