Return-Oriented Programming (ROP)
NX/DEP'yi aşmak ve kabuk kodu içermeyen istismarlar oluşturmak için ROP parçacıklarını zincirleyin.
Return-Oriented Programming (ROP), CoddyKit'te ücretsiz bir Cyber Security Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Cyber Security Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Cyber Security Academy kursu toplamda 4 dersten oluşur.
ROP Neden Vardır
NX/DEP etkin olduğunda enjekte edilen kabuk kodu çalıştırılamaz. Dönüş Odaklı Programlama (ROP), ret yönergeleriyle biten mevcut küçük kod dizilerini (kod parçacıklarını) zincirleyerek bunu aşar. Yeni bir kod enjekte edilmez — yalnızca yığın ve mevcut kod kullanılır.
ROP Kod Parçası Nedir?
Bir kod parçacığı, ret ile biten ve ikili dosyada veya yüklenmiş kitaplıklarda bulunan kısa bir yönerge dizisidir. Örnekler: pop rdi; ret, pop rsi; ret, mov eax, 0; ret. Kod parçacıkları ROP zincirlerinin yapı taşlarıdır.
Kod Parçacıklarını Bulma
İkili dosyalardaki ROP kod parçacıklarını bulma araçları:
# ROPgadget:
ROPgadget --binary ./vuln --rop
# ropper:
ropper -f ./vuln --search "pop rdi"
# pwntools:
from pwn import *
elf = ELF("./vuln")
rop = ROP(elf)
rop.find_gadget(["pop rdi", "ret"])ROP Zinciri Oluşturma
Bir ROP zinciri, yığındaki dönüş adresleri dizisidir. Üzerine yazılan dönüş adresine ulaşıldığında, yararlı bir işlem yapan ve ardından dönen 1. kod parçasına atlanır; bu kod parçası bir sonraki adresi alıp 2. kod parçasına atlar ve bu şekilde devam eder.
ret2plt ve GOT Üzerine Yazma
ret2plt, işlevleri PLT (Yordam Bağlama Tablosu) üzerinden çağırır — libc adreslerini sızdırmak için puts() çağırmada, ardından bu adresleri system() çağırmak için kullanmada yararlıdır. Ana ikili dosyanın PLT/GOT yapıları, PIE olmadan ASLR etkin olsa bile öngörülebilirdir.
ROP ile ASLR'yi Aşma
ROP, puts(GOT_entry) çağıran bir kod parçası kullanarak GOT'tan bir libc işlevinin adresini sızdırabilir. Sızdırılan adres libc tabanını ortaya çıkarır. system() uzaklığını hesaplayın: system_addr = leak - libc.symbols["puts"] + libc.symbols["system"].
SROP: Sinyal Dönüşü Odaklı Programlama
SROP, sahte bir sigcontext çerçevesi yüklemek için sigreturn sistem çağrısını kullanır ve tek bir kod parçasında tüm yazmaçları saldırganın denetimindeki değerlere ayarlar. Az sayıda kod parçası bulunduğunda kullanışlıdır.
JOP ve COP Varyantları
ROP'un ötesi:
- JOP (Atlama Odaklı Programlama) —
retyerinejmpile biten kod parçalarını zincirler - COP (Çağrı Odaklı Programlama) —
callile biten kod parçalarını zincirler
CFI (Denetim Akışı Bütünlüğü) gibi savunmalar bunların tümünü önlemeyi amaçlar.
Denetim Akışı Bütünlüğü (CFI)
CFI, dolaylı dallanmaların (çağrılar, dönüşler) yalnızca geçerli hedeflere atlamasını zorunlu kılar. Dönüş hedefini gölge yığına veya izin verilenler listesine göre doğrulayarak ROP'u bozar. Intel CET (Denetim Akışı Zorlama Teknolojisi), donanım düzeyinde CFI uygular.
Uygulamalı ROP Örneği
ROP üzerinden 64 bitlik bir ret2libc:
# pwntools ROP chain example:
from pwn import *
p = process("./vuln")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf = ELF("./vuln")
rop = ROP(elf)
# Leak puts GOT to get libc base
rop.puts(elf.got["puts"])
rop.main()Azaltım Önlemlerinin Özeti
ROP'a karşı koruma önlemleri:
- CFI — dal hedeflerini doğrular
- Gölge yığın (CET) — donanım tarafından korunan dönüş adresi kopyası
- RELRO (tam) — GOT'u salt okunur yapar, üzerine yazmaları önler
- PIE — ikili dosyanın tabanını rastgeleleştirir, kod parçacıklarını bulmak için sızıntı gerektirir
Hızlı Kontrol: ROP
ROP kod parçası nedir?
Ders Özeti
ROP, mevcut kod dizilerini (ret ile biten kod parçacıklarını) zincirleyerek NX/DEP'yi aşar; kabuk kodu enjekte etmek gerekmez. Kod parçacığı bulma araçları: ROPgadget, ropper. ret2plt, ASLR'yi etkisiz kılmak için libc adreslerini sızdırır. Savunmalar: CFI, gölge yığınlar (Intel CET), PIE ve tam RELRO. ROP, modern ikili dosya istismarının temelidir.
Sıkça Sorulan Sorular
“Return-Oriented Programming (ROP)” dersi ücretsiz mi?
Evet — “Return-Oriented Programming (ROP)” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Cyber Security Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Cyber Security Academy kursu toplamda 4 dersten oluşur.
“Return-Oriented Programming (ROP)” dersinde ne öğreneceğim?
NX/DEP'yi aşmak ve kabuk kodu içermeyen istismarlar oluşturmak için ROP parçacıklarını zincirleyin. Cyber Security Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Cyber Security Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Cyber Security Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Return-Oriented Programming (ROP)” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Cyber Security Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Cyber Security Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Yığın Tamponu Taşmaları
- Return-Oriented Programming (ROP)
- Biçim Dizesi Güvenlik Açıkları
- Heap İstismarı: Use-After-Free ve Heap Spraying