Malware Analiz Çalışmalarında Temel Seviye Debugger Kullanımı

Amaç: Temel seviyede dinamik analiz yöntemleri kullanarak zararlı yazılımı analiz etmek.



Lab senaryosu: Çalışmadan önce dosya adını kontorl eden, bağlantı kuracağı adresi çalışma anında dinamik olarak oluşturan bir zararlı debugger kullanılarak analiz edilir.



Kullanılan Araçlar:
  • OllyDbg 2
  • Lab09-02.exe (Practical Malware Analysis)



Adımlar:
OllyDbg kullanarak zararlıyı çalışma anında analiz etmeniz mümkündür. Dikkat edilmesi gereken nokta, statik analizin aksine zararlının gerçekten çalıştırılacak olmasıdır. Bu yüzden analizin uygun lab ortamında yapılması tavsiye edilir.


1. Adım:
Analiz edilecek zararlı(Lab09-02.exe) OllyDbg ile açılır. Yoğunlaşılması gereken kod blokları hakkında bir önbilgi yoksa incelemeye main fonksiyonundan başlanabilir. Main fonksiyonunun üzerine(örnekte call 00401128) tıklanıp F2 tuşuna basılarak breakpoint(software) konulur ve F9 ile zararlı çalıştırılır. Bu sayede breakpointe ulaşıldığında kontrol tekrar debuggera geçer, böylece kalınan noktatan detaylı analize devam edilebilir.



CPU Disasm
Address   Hex dump       Command                               Comments
00401619  |.  50         PUSH EAX                              ; /Arg3 = ASCII “p
A”
0040161A  |.  FF35 DC524000 PUSH DWORD PTR DS:[4052DC]            ; |Arg2 = 410B30
00401620  |.  FF35 D8524000 PUSH DWORD PTR DS:[4052D8]            ; |Arg1 = 1
00401626  |.  E8 FDFAFFFF   CALL 00401128                         ; Lab09-02.00401128
0040162B  |.  83C4 0C    ADD ESP,0C
0040162E  |.  8945 E4    MOV DWORD PTR SS:[EBP-1C],EAX
00401631  |.  50         PUSH EAX



2. Adım:
Programı satır satır çalıştırmak için F7 ve F8 kısayolları kullanılabilir. F7 ile F8’in farkı ilki call komutlarının içine girerken ikincisi tamamını çalıştırıp devam etmektedir. Main fonksiyonuna F7 ile girilir. Fonksiyon stackte 0x304 byte(OllyDbg’da gösterilen sayısal değerler 16’lık sistemdedir.) yer ayırıyor ve bu alana sabit değerleri yerleştiriyor. Bu tarz yöntemler basit statik analiz yöntemleriyle programda kullanılan stringlerin görülmesini engellemek için zararlı yazılımlar tarafından sıklıkla kullanılır.



CPU Disasm
Address   Hex dump       Command                               Comments
0040112B  |.  81EC 04030000 SUB ESP,304
00401131  |.  56         PUSH ESI
00401132  |.  57         PUSH EDI
00401133  |.  C685 50FEFFFF MOV BYTE PTR SS:[LOCAL.108],31
0040113A  |.  C685 51FEFFFF MOV BYTE PTR SS:[LOCAL.108+1],71
……
004011BF  |.  C685 67FEFFFF MOV BYTE PTR SS:[LOCAL.103+3],0
004011C6  |.  B9 08000000   MOV ECX,8



Sabitleri belleğe yazma işlemi sonuna kadar çalıştırılıp veya F8 ile adım adım ilerlenip OllyDbg ekranın sağ alt tarafındaki Stack penceresinden ilgili adrese yazılan değer ASCII haliyle de görülebilir. Debugger kullanmanın disassembler’a göre avantajlı olduğu durumlardan birisi budur.



Stacke yazılan değerin “1qaz2wsx3edc” olduğu görülmektedir. Klavyede bu tuşların dizilişi dikkate alındığında bir yere not etmekte fayda var.



3. Adım:
Main fonksiyonunun devamında GetModuleFileName winapi fonksiyonu çağırılmaktadır. MSDN’den incelendiğinde bu fonksiyon örnekte olduğu gibi hModule parametresi NULL olarak çağırıldığında sürecin kendi dizin yolunu yine parametre ile geçirilen buffera yazmaktadır.



CPU Disasm
Address   Hex dump       Command                               Comments
004011FA  |.  68 0E010000   PUSH 10E                              ; /Count = 270.
004011FF  |.  8D85 00FDFFFF LEA EAX,[LOCAL.192]                   ; |
00401205  |.  50         PUSH EAX                              ; |Buffer => OFFSET LOCAL.192
00401206  |.  6A 00      PUSH 0                                ; |hModule = NULL
00401208  |.  FF15 0C404000 CALL DWORD PTR DS:[<&KERNEL32.GetModuleF ; KERNEL32.GetModuleFileNameA



Fonksiyon çağırıldıktan hemen sonra bufferın adresi OllyDbg’ın stack veya memory bölümünde incelendiğinde Lab09-02.exe’nin tam yolu görülebilir. Bir call’da yine aynı değeri paremetre olarak alan bir fonkisyon çağırılmaktadır. Fonksiyon incelendiğinde dizin yolundan geriye sadece dosya adını bırakıp geri döndürdüğü görülür. Devamında çağırılan 0x004014C0 adresindeki fonksiyon ise çalışan dosyanın adının “ocl.exe” ile karşılaştırıp eğer öyleyse 0 yoksa farklı bir değer döndüren, büyük ihtimalle strcmp veya türevi bir fonksiyondur.



CPU Disasm
Address   Hex dump       Command                               Comments
0040122B  |.  8B45 FC    MOV EAX,DWORD PTR SS:[LOCAL.1]        ; ASCII “Lab09-02.exe”
0040122E  |.  50         PUSH EAX                              ; /Arg2 => [LOCAL.1]
0040122F  |.  8D8D 60FEFFFF LEA ECX,[LOCAL.104]                   ; |
00401235  |.  51         PUSH ECX                              ; |Arg1 => OFFSET LOCAL.104
00401236  |.  E8 85020000   CALL 004014C0                         ; Lab09-02.004014C0
0040123B  |.  83C4 08    ADD ESP,8



Bu fonksiyonun hemen devamında dönen değer 0 mi (yani dosya adı ocl.exe mi) diye kontrol edilip süreç sonlanıyor veya ağ aktiviteleri olan (WS2_ fonksiyonları) kod bloğundan devam ediyor.



CPU Disasm
Address   Hex dump       Command                               Comments
0040123B  |.  83C4 08    ADD ESP,8
0040123E  |.  85C0       TEST EAX,EAX Dönen değer 0 mı?
00401240  |.  74 0A      JZ SHORT 0040124C 0 ise dallanma yap
00401242  |.  B8 01000000   MOV EAX,1
00401247  |.  E9 8A010000   JMP 004013D6 main’in sonuna dallan
0040124C  |>  BA 01000000   /MOV EDX,1



4. Adım:
Bu aşamada dosya adını ocl.exe olarak değiştirmek gibi bir seçenek olsa da debugger kullanmanın avantajlarından yararlanıp 0x00401240 adresindeki JZ dallanma komutunu çalıştırmadan OllyDbg’ın sağ üst taraftaki Registers bölümünden Zero flag’ına çift tıklayarak değeri 1 yapılır. Bu bir önceki işlemin(test eax,eax) sonucunun 0 olduğu anlamına gelir, böylece JZ (jump if zero) dallanmayı seçecektir.



Bağlantı için soket oluşturma gibi hazırlık işlemlerinin ardından analizin başında karşılaşılan “1qaz2wsx3edc” değerini parametre olarak alan bir fonksiyon çağırılmaktadır.



CPU Disasm
Address   Hex dump       Command                               Comments
004012B5  |.  51         |PUSH ECX                             ; /Arg2 = 20
004012B6  |.  8D95 50FEFFFF |LEA EDX,[LOCAL.108]                  ; |
004012BC  |.  52         |PUSH EDX                             ; |Arg1 => OFFSET LOCAL.108
004012BD  |.  E8 C7FDFFFF   |CALL 00401089                        ; Lab09-02.00401089
004012C2  |.  83C4 08    |ADD ESP,8
004012C5  |.  8945 F8    |MOV DWORD PTR SS:[LOCAL.2],EAX
004012C8  |.  8B45 F8    |MOV EAX,DWORD PTR SS:[LOCAL.2]
004012CB  |.  50         |PUSH EAX                             ; /Arg1 => [LOCAL.2]
004012CC  |.  FF15 A4404000 |CALL DWORD PTR DS:[<&WS2_32.#52>]    ; WS2_32.gethostbyname
004012D2  |.  8985 44FEFFFF |MOV DWORD PTR SS:[LOCAL.111],EAX
004012D8  |.  83BD 44FEFFFF |CMP DWORD PTR SS:[LOCAL.111],0

Fonksiyon detaylı incelenmeden çalıştırıldığında EAX ile dönen adresteki değere bakıldığında bağlantı kuracağı adresi(www.practicalmalwareanalysis.com) dinamik olarak oluşturduğu görülür. Hemen sonra bu değeri gethostbyname winapi fonksiyonunda kullanarak IP çözümlemesi yaptığı anaşılmaktadır. Amaç host ve network tabanlı imzaları çıkarmak ise analiz bu noktada kesilebilir ya da analize devam edilip zararlının ağ aktiviteleri detaylıca incelenebilir.

Onur ALANBEL onur.alanbel@bga.com.tr