Practical Reverse Engineering Solution(Page 123-124)

Posted by Umut on

Çözümlere geçmeden önce ben Windows10 x64 üzerinde kernel debugging yaptığımı belirteyim, siz farklı bir işletim sistemi kullanıyorsanız değişik sonuçlar alabilirsiniz.

Eğer kernel fonksiyonlarını nasıl disassemble edileceğini bilmiyorsanız, nasıl yapılacağını anlattığım bir önceki yazıma buradan ulaşabilirsiniz.

Şimdi çözümlere geçelim.

1)İlk soruda bizden aşağıda verilen kernel fonksiyonlarında InitalizeListHead i bulmamızı istiyor. List kullanabilmek için ilk önce bu list in başlangıcının yapılması gerekiyor(daha iyi anlatamadığımdan dolayı özür dilerim). Bizden, verilen bu kernel fonksiyonlarından list başlangıcını bulmamız isteniyor. Hepsini yapmak çok uzun süreceğinden ben sadece CcAllocateInitializeMbcb fonksiyonunu göstereceğim.

Biz kodlarda aşağıdaki gibi bir düzen arıyoruz.

lea r11, [rbx+48h]
mov [r11+8], r11
mov [r11], r11

Assembly kodlarına göz gezdirdiğimde hemen burası gözüme ilişti.

fffff800`ab16f1bf 488d4310      lea     rax,[rbx+10h]
fffff800`ab16f1c3 48894008      mov     qword ptr [rax+8],rax
fffff800`ab16f1c7 488900        mov     qword ptr [rax],rax

Rbx registerındaki değer ne diye baktığımda ise ExAllocatePoolWithTag fonksiyonunun dönüş değerini tuttuğunu gördüm. Dahada derine inip o fonksiyonun ne olduğuna bakabiliriz fakat amacımız bu olmadığı için yapmıyorum.

2)Bu soruda bizden aşağıdaki kernel fonksiyonlarının içinden listenin başına girdi eklendiği yerleri bulmamızı istiyor. Bu sorudada sadece CcSetVacbInFreeList fonksiyonunu yapacağım.

Kod yapısı aşağıdaki gibi bir şey arayacağız.
mov rcx, [rdi]
mov [rax+8], rax
mov [rax], rcx
mov [rcx+8], rax
mov [rdi], rax

Kodlara baktığımda tam olarak böyle bir yapı göremedim. Güvenlik ya da performans sebebiyle değiştirildiğini tahmin ediyorum. Buradan yazınca çok biçimsiz durduğu için bulduğum kodları pastebine attım, buradan ulaşabilirsiniz.

Kodlara baktığımızda listenin 3 adet elamanını görüyoruz ve bu elemanların rcx,rdx,rax register larında tutulduğunu görüyoruz.

3) Bizden fonksiyonların içinden listenin sonuna girdi eklendiği yerleri bulmamız isteniyor. Ben bu soru için AlpcpCreateView fonksiyonunu inceleyeceğim.

Kod yapısı aşağıdaki gibi bir şey arayacağız.

mov rcx, [rdi+8]
mov [rax], rdi
mov [rax+8], rcx
mov [rcx], rax
mov [rdi+8], rax

Direk ilk bakışta göremedim fakat kodlarda neler olup neler bittiğine bakarken buna benzer bir düzen yakaladım.

fffff803`b652cd27 488d4f38        lea     rcx,[rdi+38h]
fffff803`b652cd2b 488b4108        mov     rax,qword ptr [rcx+8]
fffff803`b652cd2f 488bd3          mov     rdx,rbx
fffff803`b652cd32 48890b          mov     qword ptr [rbx],rcx
fffff803`b652cd35 48894308        mov     qword ptr [rbx+8],rax
fffff803`b652cd39 488b4108        mov     rax,qword ptr [rcx+8]
fffff803`b652cd3d 488918          mov     qword ptr [rax],rbx
fffff803`b652cd40 48895908        mov     qword ptr [rcx+8],rbx

Rcx registerı ListHead‘i , rbx registerının ise Entry‘i tuttuğunu görüyoruz.

4)  Bu soruda ise bizden verilen fonksiyonların içinden RemoveHeadList rutinini bulmamız isteniyor. Ben bu soru için verilen fonksiyonlar arasından CcDeleteMbcb fonksiyonunu seçtim.

Başlamadan önce nasıl bir düzen aradığımızı belirteyim.

mov rax, [rbx]
mov rcx, [rax]
mov [rbx], rcx
mov [rcx+8], rbx

Bu fonksiyonun çıktısı büyük olduğu için kodlar arasında kaybolmak mümkün. Bu yüzden olabildiğince derine inmeden belirtilen düzeni aramaya başlıyoruz.

fffff800`650588aa 4c8d7f10        lea     r15,[rdi+10h]
nt!CcDeleteMbcb+0x76:
fffff800`650588ae 4d393f          cmp     qword ptr [r15],r15
fffff800`650588b1 746c            je      nt!CcDeleteMbcb+0xe7 (fffff800`6505891f)
nt!CcDeleteMbcb+0x7b:
fffff800`650588b3 498b1f          mov     rbx,qword ptr [r15]
fffff800`650588b6 488b0b          mov     rcx,qword ptr [rbx]
fffff800`650588b9 488b4308        mov     rax,qword ptr [rbx+8]
fffff800`650588bd 48395908        cmp     qword ptr [rcx+8],rbx
fffff800`650588c1 0f8542401200    jne     nt! ?? ::FNODOBFM::`string'+0x16649 (fffff800`6517c909)
nt!CcDeleteMbcb+0x8f:
fffff800`650588c7 483918          cmp     qword ptr [rax],rbx
fffff800`650588ca 0f8539401200    jne     nt! ?? ::FNODOBFM::`string'+0x16649 (fffff800`6517c909)
nt!CcDeleteMbcb+0x98:
fffff800`650588d0 488908          mov     qword ptr [rax],rcx
fffff800`650588d3 48894108        mov     qword ptr [rcx+8],rax

Evet, aradığımız şeyi bulduk.

Reversing yaparken çok rahatlıkla kaybolabiliyoruz. Bunun için ilk önce göz gezdirerek aradığımız düzeni bulmaya çalışmamız gerekiyor. Eğer bu şekilde bulunamaz ise o zaman derinlenemesine inmek gerekiyor.

5) Bu sefer bizden RemoveHeadList değilde RemoveTailList rutinini bulmamız isteniyor. Bu egzersiz için CmpCallCallBacks fonksiyonunu seçtim.

Aradığımız düzen şu şekilde:

mov rsi, [rdi+8]
mov rax, [rsi+8]
mov [rdi+8], rax
mov [rax], rdi

Bu fonksiyon da uzun olduğundan kaybolmamaya dikkat etmek gerekiyor.

nt!CmpCallCallBacks+0x315:
d9d61955  mov     rbx,qword ptr [rsi+8]
d9d61959  mov     qword ptr [rsp+40h],rbx
d9d6195e  mov     rax,qword ptr [rbx+8]
d9d61962  cmp     qword ptr [rbx],rsi
d9d61965  jne     nt! ?? ::NNGAKEGL::`string'+0x5770 (fffff803`d9e55efd)

nt!CmpCallCallBacks+0x32b:
d9d6196b  cmp     qword ptr [rax],rbx
d9d6196e  jne     nt! ?? ::NNGAKEGL::`string'+0x5770 (fffff803`d9e55efd)

nt!CmpCallCallBacks+0x334:
d9d61974  mov     qword ptr [rsi+8],rax
d9d61978  mov     qword ptr [rax],rsi

6) Egzersizde bizden RemoveEntryList rutinini bulmamız isteniyor. Bu egzersiz için AlpcSectionDeleteProcedure fonksiyonunu seçtim.

Aradığımız kod düzeni şu şekilde:

mov rdx, [rcx]
mov rax, [rcx+8]
mov [rax], rdx
mov [rdx], rax

Fonksiyonu disassemble ederken bende çok kısa bir şey çıktı o yüzden bu fonksiyonun kodlarını başka bir yerden buldum(Windows 8 64bit için).

220d974a  mov     rax,qword ptr [rdi]
220d974d  cmp     rax,rdi
220d9750  jne     nt!AlpcSectionDeleteProcedure+0x113 (fffff803`220d97ef)

...

nt!AlpcSectionDeleteProcedure+0x113:
220d97ef  mov     rcx,qword ptr [rdi+8]
220d97f3  cmp     qword ptr [rax+8],rdi
220d97f7  jne     nt!AlpcSectionDeleteProcedure+0x135 (fffff803`220d9811)

nt!AlpcSectionDeleteProcedure+0x11d:
220d97f9  cmp     qword ptr [rcx],rdi
220d97fc  jne     nt!AlpcSectionDeleteProcedure+0x135 (fffff803`220d9811)

nt!AlpcSectionDeleteProcedure+0x122:
220d97fe  mov     qword ptr [rcx],rax
220d9801  mov     qword ptr [rax+8],rcx

Umut

http://www.umuttosun.com

Siber güvenlik alanında çalışan ve araştırmayı seven bir vatandaş ;)