2016-09-29 26 views
7

Kitabın okunması "Hacking - The Exploitation of Art"; Çalışanı, yığının taşması ve bir işlevin dönüş adresini değiştirerek yürütme akışını değiştirdiği için takip ediyorum. (Özellikle, sayfa 135-136) O bir komut satırı argümanı olarak 10 kez dönüş adresini girerek, bir Perl komut ile bunu başarır: 0x080484bf iade adresi olanBir Perl betiği ile 0x00 ile başlayan bir adrese yazma

$ ./auth_overflow2 $(perl -e 'print "\xbf\x84\x04\x08"x10') 

.

Aynısını yapmaya çalışıyorum, ancak dönüş adresim 0x00 ile başlıyor. \ X08 \ x00 ile değiştirilmesi, boş karakter atlanır, bu yüzden girmek istediğim adres bellek haritasında bir bayt tarafından kaydırılır. Bu konuda nasıl çalışabilirim?

+1

Bunun mantıklı olduğunu düşünmüyorum. bash, dizeleri null'larla işleyemez, ancak olsa bile, böyle bir dizeyi işlemin argümanı olarak geçiremezsiniz çünkü 'exec' boş sonlandırılmış dizeleri bekler ve bu nedenle boş karakterden sonra tüm karakterleri yoksayır. – redneb

+0

@redneb Görüyorum ... hafızaları dwords ile hizalanmış adreslerle doldurmanın alternatif yollarını düşünebilir misiniz? (0x00 ile başlayan adresler dahil) –

+1

Örneğini kabul etmek için 'auth_overflow2' değerini değiştirmeniz gerekir. adresin altıgen gösterimi. – redneb

cevap

7

Komut satırı argümanları NUL sonlandırılmış dizelerdir. Bu nedenle, NUL içeren bir dizeyi geçiremezsiniz. İpin sonu olarak alınacaktı.

$ perl -e'system("echo", "abc\x00def", "ghi\x00jkl");' 
abc ghi 

Bunu bildiğinizde, kabuk bağımsız değişken oluşturulurken NUL'leri sıyırıyor.

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$(perl -e'print "\xbf\x84\x04\x08" x 5')" 
BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08.BF.84.04.08 

$ perl -e'printf "%v02X\n", $_ for @ARGV' "$(perl -e'print "\xbf\x84\x04\x00" x 5')" 
BF.84.04.BF.84.04.BF.84.04.BF.84.04.BF.84.04 

auth_overflow2 adresi, örneğin, bir kaçan şeklinde modifiye edilmelidir adres heks.

İlgili konular