.dtors yazılabilir görünüyor, ancak segfault yazmaya çalışıyor


9

Bu Ubuntu 9.04, 2.6.28-11-sunucu, 32bit x86


$ cat test.c
main() { int *dt = (int *)0x08049f18; *dt = 1; }
$ readelf -S ./test
...
  [18] .dtors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4
...
$ ./test
Segmentation fault
$

Başlatılmayanlar için: gcc .dtors, elf yürütülebilir dosyasında, main()çıkışlardan sonra çağrılan bir yıkıcı segment oluşturur . Bu tablo uzun süredir yazılabilir ve benim durumumda olması gerektiği gibi görünüyor ( readelfçıkışa bakın ). Ancak tabloya yazmaya çalışmak bir segfault'a neden olur.

Ben son zamanlarda salt okunur .dtors, plt, var bir hareket olduğunu biliyorum, ama anlamıyorum şey readelfsegfault arasındaki uyumsuzluk olduğunu .


Asıl soru neden yazılabilir olmasını istiyorsun?
alex

1
Bir dizi savunmasız programı kırmayı içeren bir güvenlik sınıfı öğretiyorum, ancak bir alıştırma, .dtors'a shellcode yürütmek için yazmayı içeriyor. Artık çalışmıyor ve sorunu bulmaya çalışıyorum.
Fixee

Uyumsuzluk, muhtemelen bazı veri yer değiştirmelerinin olmasıdır (bunlar salt okunur olarak işaretlenmeden önce düzeltilmesi gerekir ve yine de tembel olamaz, bu nedenle sabitlendikten sonra sabit olacaktır).
ninjalj

Yanıtlar:


5

Bu bölümler GNU_RELRO (salt okunur yeniden konumlandırmalar) olarak işaretlenir, yani dinamik yükleyici sabitlenir kurulmaz (yükleme sırasında tembel yer değiştirme yoktur) tüm yer değiştirmeler, bu bölümleri salt okunur olarak işaretler. Çoğu .got.pltbaşka bir sayfada olduğunu, bu yüzden tedavi alamadım unutmayın.

Linker komut dosyasını görebilirsiniz, ld --verboseRELRO için arama yaparsanız aşağıdakine benzer bir şey bulacaksınız:

.got            : { *(.got) }
. = DATA_SEGMENT_RELRO_END (12, .);
.got.plt        : { *(.got.plt) }

bu da RELRO bölümlerinin 12 bayta bittiği anlamına gelir .got.plt(dinamik bağlayıcı işlevlerine işaretçiler zaten çözülmüştür, bu nedenle salt okunur olarak işaretlenebilir).

Sertleştirilmiş Gentoo projesinin http://www.gentoo.at/proj/en/hardened/hardened-toolchain.xml#RELRO adresindeki RELRO hakkında bazı belgeleri vardır .


5

Sistemin hangi kısmının sorumlu olduğunu bilmesem de neden başarısız olduğunu anlayabilirim. .dtorsİkilide yazılabilir olarak işaretlenmiş olsa da .ctors, GOT ve diğer birkaç şeyle birlikte bellekte ayrı, yazılamaz bir sayfaya eşleştiriliyor gibi görünüyor . Benim sistemde, .dtorsen koymak oluyor 0x8049f14:

$ readelf -S test
  [17] .ctors            PROGBITS        08049f0c 000f0c 000008 00  WA  0   0  4
  [18] .dtors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4
  [19] .jcr              PROGBITS        08049f1c 000f1c 000004 00  WA  0   0  4
  [20] .dynamic          DYNAMIC         08049f20 000f20 0000d0 08  WA  6   0  4
  [21] .got              PROGBITS        08049ff0 000ff0 000004 04  WA  0   0  4
  [22] .got.plt          PROGBITS        08049ff4 000ff4 00001c 04  WA  0   0  4
  [23] .data             PROGBITS        0804a010 001010 000008 00  WA  0   0  4
  [24] .bss              NOBITS          0804a018 001018 000008 00  WA  0   0  4

Yürütülebilir dosyayı çalıştırıp kontrol /proc/PID/mapsedersem şunu görürüm:

08048000-08049000 r-xp 00000000 08:02 163678     /tmp/test
08049000-0804a000 r--p 00000000 08:02 163678     /tmp/test
0804a000-0804b000 rw-p 00001000 08:02 163678     /tmp/test

.data/ .bsskendi sayfalarında hala yazılabilir, ancak diğer sayfalar yazılamaz 0x8049000-0x804a000. Bunun çekirdekte bir güvenlik özelliği olduğunu varsayıyorum (dediğiniz gibi, "salt okunur .dtors, plt, son zamanlarda var" doğru bir hareket oldu), ama özellikle ne dediğini bilmiyorum (OpenBSD çok benzer bir şeye sahip W ^ X ; Linux'ta PaX var , ancak çoğu çekirdeğe yerleştirilmemiş)

mprotectBir sayfanın bellek içi özelliklerini değiştirmenize olanak tanıyan bununla başa çıkabilirsiniz :

mprotect((void*)0x8049000, 4096, PROT_WRITE);

Bununla birlikte, test programım çökmez, ancak başka bir işlevin adresiyle .dtors( 0x8049f18) ' nin son sentinelinin üzerine yazmaya çalışırsam , bu işlev hala yürütülmez; o kısmı anlayamıyorum.

Umarım başka biri sayfayı salt okunur yapmaktan neyin sorumlu olduğunu ve değiştirmenin neden .dtorssistemimde hiçbir şey yapmadığını bilir.


3
PaX ile OP Linux mprotectçalıştırılabilir bir sayfayı yazılabilir yapamazsa veya bu özellik devre dışı bırakılmadığı sürece daha önce yazılabilir bir sayfa çalıştırırsa paxctl -m.
stribika

@stribika Ah, bilmek iyi
Michael Mrozek
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.