Soru:
X86_64 linux'ta ROP istismarı
user40387
2014-02-20 14:01:52 UTC
view on stackexchange narkive permalink

Bir x86_64 Linux üzerinde geri dönüş odaklı programlama istismarı üzerinde çalışıyorum. Bununla birlikte, araştırmam 64 bit Linux makinesinde ROP istismarının imkansızlığına yol açıyor çünkü tüm kod segmentleri boş bayt önde gelen adreslerde yükleniyor. Doğru mu?

  Gdb, Bölümler: (gdb) i dosyası `/ home / ****** / Masaüstü / BOF / lib64 ', dosya türü elf64-x86-64. Giriş noktası: 0x400ffc 0x0000000000400190 - 0x00000000004001d4 .note.gnu.build-id 0x00000000004001d8 edilir - - 0x00000000004002f8 .rela.plt 0x00000000004002f8 edilir - 0x0000000000400312 0x0000000000400320 .init edilir - 0x00000000004003e0 0x00000000004003e0 Plt olduğunu - 0x0000000000494808 olan 0x00000000004001b0 .note.ABI etiketi 0x00000000004001b0 olduğunu .text 0x0000000000494810 - 0x000000000049614c 0x0000000000496150 __libc_freeres_fn olduğu - 0x00000000004961f8 0x00000000004961f8 __libc_thread_freeres_fn olduğu - 0x0000000000496201 0x0000000000496220 .fini olduğu - 0x00000000004b6224 0x00000000004b6228 .rodata olduğu - 0x00000000004b6230 __libc_atexit 0x00000000004b6230 olduğu - 0x00000000004b6288 __libc_subfreeres 0x00000000004b6288 olduğu - 0x00000000004b6290 __libc_thread_subfreeres 0x00000000004b6290 olduğu - 0x00000000004c32ac .eh_frame 0x00000000004c32ac olduğu - 0x00000000004c33b9 olup. gcc_except_table 0x00000000006c3ea0 - 0x00000000006c3ec0 is .tdata 0x00000000006c3ec0 - 0x0000000 0006c3ef8 .tbss 0x00000000006c3ec0 olduğu - 0x00000000006c3ee0 .fini_array 0x00000000006c3ee0 olduğu - - 0x00000000006c3ed0 .init_array 0x00000000006c3ed0 olan 0x00000000006c3ff0 .data.rel.ro 0x00000000006c3ff0 olduğu - - 0x00000000006c3ee8 0x00000000006c3f00 .jcr olan 0x00000000006c56f0 olduğu - 0x00000000006c4078 0x00000000006c4080 .got.plt olduğu - 0x00000000006c4000 0x00000000006c4000 .got olduğu .data 0x00000000006c5700 - 0x00000000006c8308 is .bss 0x00000000006c8308 - 0x00000000006c8338 is __libc_freeres_ptrs 0x0000000000400190 - 0x00000000004001b4 is .note.ABI-tag004001-d001d001
0x0000000000400312 0x0000000000400320 .init olduğu - - 0x00000000004001d8 - 0x00000000004002f8 .rela.plt 0x00000000004002f8 olan 0x0000000000494808 0x0000000000494810 .text olduğu - - 0x00000000004b6224 .rodata 0x00000000004b6228 olduğu - 0x0000000000496201 0x0000000000496220 .fini olduğu - 0x00000000004961f8 0x00000000004961f8 __libc_thread_freeres_fn olduğu - 0x000000000049614c 0x0000000000496150 __libc_freeres_fn olan 0x00000000004003e0 0x00000000004003e0 Plt olduğu - 0x00000000004b6230 __libc_atexit 0x00000000004b6230 olduğu - 0x00000000004b6290 __libc_thread_subfreeres 0x00000000004b6290 olduğu - - 0x00000000004c32ac .eh_frame 0x00000000004c32ac olduğu - 0x00000000004b6288 __libc_subfreeres 0x00000000004b6288 olan 0x00000000004c33b9 .gcc_except_table 0x00000000006c3ea0 olduğu - 0x00000000006c3ef8 .tbss 0x00000000006c3ec0 olduğu - - 0x00000000006c3ec0 .tdata 0x00000000006c3ec0 olan 0x00000000006c3ed0 .init_array 0x00000000006c3ed0 olduğu - 0x00000000006c3ee0 .fini_array 0x0000000000 olan 6c3ee0 - 0x00000000006c3ff0 .data.rel.ro 0x00000000006c3ff0 olduğu - - 0x00000000006c3ee8 0x00000000006c3f00 .jcr olan 0x00000000006c56f0 .Data 0x00000000006c5700 olduğu - - 0x00000000006c8308 .bss 0x00000000006c8308 olduğu - 0x00000000006c8338 __libc_freeres_ptrs  kod 0x00000000006c4078 0x00000000006c4080 .got.plt olduğu - 0x00000000006c4000 0x00000000006c4000 .got olduğu > 
İstismar ettiğiniz hataya bağlıdır. Basit strcpy / strcat / sprintf / ... hatalardan bahsediyorsunuz, değil mi?
Evet ama fark nedir? tüm hatalarda (pasta değilse) yukarıdaki gibi adreslerimiz var ... lütfen ayrıca bkz: http://v0ids3curity.blogspot.de/2013/07/some-gadget-sequence-for-x8664-rop.html (adreslerinde boş baytlar içeren ip aygıtlarını nasıl kullanabileceğimizi anlayamıyorum)
Adreslerde boş baytlarla ROP gadget'ları oluşturabilirsiniz. Evet. Aslında, bir süredir, açık yüklerimde 0x00 karakterlerini filtrelemem gerekmiyor çünkü saf bir dizgi işleme sorununu (yani, yalnızca ikili biçimler ve şeyler) istismar etmeyeli uzun zaman oldu.
Bir cevap:
jbh
2014-02-20 19:50:04 UTC
view on stackexchange narkive permalink

Bu, istismar ettiğiniz hatanın türüne bağlıdır. Yükünüz boş baytlar (savunmasız bir strcpy) içeremezse, bu bir sorun olabilir, ancak tüm hatalarda bu kısıtlama yoktur. Örneğin, bir dosya türünün nasıl ayrıştırıldığıyla ilgili, boş baytlara izin veren bir hatayı ele alın.

Ayrıca, örneğin yığın püskürtme fikri gibi bir dizi hatanın kullanılması olasılığı da vardır. Genellikle, corelancoder'ın bu yazısında olduğu gibi diğer "meşru" şeyleri yaparak yığını püskürtürsünüz. ROP zinciriniz olacak olan kabuk kodu, "yığını püskürtmek" için art arda yüklediği bit eşlem dosyalarıdır, ancak hata aslında javascript tarafından tetiklenir ve kabuk kodunu içermez.

Yalnızca ROP üzerinde çalışmak istiyor ve bayt sınırlamaları hakkında endişelenmiyorsanız, shellcode'unuzu test etmek için basit bir koşum takımı yazmanızı öneririm.

DÜZENLE Üzgünüm yanlış koşum takımı. Bu, açıkça 64-bit özeldir.

  #include <stdio.h> #, <stdlib.h>int verilerini [10000000]; void start_rop (char * rop) {__asm ​​("mov (% rax)) ,% rsp "); // ilk argümanın içeriğini yığın işaretçisine taşı} int main (int argc, char * argv) {char code [] = "AAAAAAAA"; char * malloc_code = (char *) malloc (sizeof (kod)); memcpy (malloc_code, &code, sizeof (kod)); start_rop (malloc_code); ücretsiz (malloc_code); dönüş 0;}  
Yukarıdaki kodun rop ile ilgili olmadığını düşünüyorum. Kabuk kodlarını test etmek için sadece bir C saplama fonksiyonu, ayrıca veri bölümleri artık çalıştırılabilir olmadığından yeni çekirdekler için kullanılamaz.
Tamamen haklısın, yanlış koşum takımını kopyaladım. Cevapta düzeltildi.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...