Çö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.
2) Bu soru da bizden aşağıdaki kernel fonksiyonlarının içinden listenin başına girdi eklendiği yerleri bulmamızı istiyor. Bu soruda da 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ı Pastebin’e 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
İlk 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<br />
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(Windows8 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
Be First to Comment