İçeriğe geç
academia.sh

Ders 22 / 22

Tersine Mühendislik Temelleri

Tersine mühendisliğin savunmadaki yerinin ölçülmesi: yirmi kurgu göstergenin toplam savunma değerinin otuz sekiz olması, ham ikiliden dizge taramasıyla on iki kalemin çıkması, simge silme ile dizge gizlemenin birlikte bu on ikisini sıfıra indirmesi, üç kalemin hiçbir kuruluşta çıkarılamayıp yalnız kurbanın kendi kaydında görülmesi ve kursun yirmi iki dersinin zincir sütunlarının tek tabloda toplanması.

İçindekiler

Önceki ders bir kalemin uç noktaya ulaşmasını saydı ama o kalemin ne olduğunu hiç sormadı. Savunmanın elinde çoğu zaman yalnız o kalem vardır: kaynağı yok, belgesi yok, yazarı bilinmiyor. Tersine mühendislik, o kalemden savunmanın kullanabileceği gösterge çıkarma işidir.

Bu ders sınıfı ölçünün diğer ucundan ele alır. Buraya kadarki sekiz derste zincir saldıranındı ve savunma onu kırıyordu. Burada zincir savunmanındır: örneği elde etmek, statik çıkarım yapmak, dinamik gözlem yapmak, göstergeleri bir kurala dönüştürmek ve kuralı filoya dağıtmak. Kıran taraf ise karşı önlemlerdir. Ölçüm boyunca gerçek bir örnek, gerçek bir araç ve gerçek bir çözümleme adımı yazılmaz; ikili bu derste kendi üretilir ve tarama gerçekten koşturulur.

Üç Tür Gösterge, Bir Tür Boşluk

Bir ikiliden çıkarılabilecek kalemler tek türden değildir. Dizge ve simge türündeki kalemler ikilinin içinde metin olarak bulunur; bir tarama onları doğrudan verir. Davranış türündeki kalemler ikilide yazılı değildir; ancak kalem çalıştırıldığında görülür. Dördüncü bir tür ise hiçbir yolla çıkarılamaz: kalem o bilgiyi taşımaz, onu kurbanın ortamından alır.

Bu dördüncü tür bu dersin asıl noktasıdır. Bir çözümleme raporu ne kadar ayrıntılı olursa olsun, kalemin hedef ağdaki adresini, türetilen bir oturum anahtarını ya da hangi kurumun hedeflendiğini söyleyemez. O kalemler yalnız kurbanın kendi kaydında görülür.

TS33: gösterge envanteri kurgudur; savunma, kalemin bir tespit kuralı için değeridir. TS34: ikili gerçekten üretilir; metin taşıyan kalemler bölgelere yazılır, geri kalan bölge üreteçten gelen baytlarla doldurulur. TS35: dizge taraması, dört ve daha uzun basılabilir bayt dizilerini toplar. TS36: savunmanın çözümleme zinciri beş adımdır ve her karşı önlem bir adımı kırar.

// tm/ikili.mjs — kurgu bir ikili kalem ve icindeki gostergeler (model). Gercek bir kotu
// amacli yazilim, gercek bir ornek ve hicbir cozumleme araci yok; ikili burada uretilir.
export const GOSTERGE = [
  { ad: "yapilandirma-anahtari", tur: "dizge", metin: "olcum.ayar.esik", savunma: 2 },
  { ad: "bilesen-etiketi", tur: "dizge", metin: "sayac-toplayici-1", savunma: 1 },
  { ad: "gonderim-araligi", tur: "dizge", metin: "gonderim-araligi=900", savunma: 2 },
  { ad: "dosya-adi-kalibi", tur: "dizge", metin: "gecici-olcum-veri", savunma: 3 },
  { ad: "yeniden-deneme", tur: "dizge", metin: "yeniden-deneme-siniri", savunma: 1 },
  { ad: "derleme-etiketi", tur: "dizge", metin: "derleme-2026-04-11", savunma: 1 },
  { ad: "surum-etiketi", tur: "dizge", metin: "ayar-imzasi-v3", savunma: 1 },
  { ad: "islev-baglantiKur", tur: "simge", metin: "baglantiKur", savunma: 2 },
  { ad: "islev-veriTopla", tur: "simge", metin: "veriTopla", savunma: 2 },
  { ad: "islev-kayitYaz", tur: "simge", metin: "kayitYaz", savunma: 1 },
  { ad: "islev-zamanlayici", tur: "simge", metin: "zamanlayiciAyarla", savunma: 2 },
  { ad: "islev-ayarOku", tur: "simge", metin: "ayarOku", savunma: 1 },
  { ad: "acilis-sirasi", tur: "davranis", savunma: 3 },
  { ad: "dosya-yazma-duzeni", tur: "davranis", savunma: 3 },
  { ad: "zamanlama-araligi", tur: "davranis", savunma: 2 },
  { ad: "yeniden-baslatma-tepkisi", tur: "davranis", savunma: 2 },
  { ad: "kaynak-kullanim-profili", tur: "davranis", savunma: 1 },
  { ad: "hedef-ag-adresi", tur: "cikarilamaz", savunma: 3 },
  { ad: "oturum-anahtari", tur: "cikarilamaz", savunma: 3 },
  { ad: "kurban-kimligi", tur: "cikarilamaz", savunma: 2 },
];

function uretec(tohum) {
  let s = tohum >>> 0;
  return () => (s = (s * 1664525 + 1013904223) >>> 0) & 255;
}

export function ikiliUret({ simgeSil = false, dizgeGizle = false, paketle = false } = {}) {
  const r = uretec(20260804);
  const bayt = [];
  const koy = (m) => { for (const c of m) bayt.push(c.charCodeAt(0)); bayt.push(0); };
  const doldur = (n) => { for (let i = 0; i < n; i++) bayt.push(r() | 128); };  // basilamaz

  doldur(24);                                              // baslik bolgesi
  for (const g of GOSTERGE.filter((x) => x.tur === "simge")) {
    if (simgeSil || paketle) doldur(g.metin.length + 1); else koy(g.metin);
  }
  doldur(32);                                              // kod bolgesi
  for (const g of GOSTERGE.filter((x) => x.tur === "dizge")) {
    if (paketle) doldur(g.metin.length + 1);
    else if (dizgeGizle) { for (const c of g.metin) bayt.push(c.charCodeAt(0) ^ 90); bayt.push(0); }
    else koy(g.metin);
  }
  doldur(24);
  return Uint8Array.from(bayt);
}

export function dizgeTara(b, enAz = 4) {
  const bulunan = [];
  let s = "";
  for (const x of b) {
    if (x >= 32 && x <= 126) s += String.fromCharCode(x);
    else { if (s.length >= enAz) bulunan.push(s); s = ""; }
  }
  if (s.length >= enAz) bulunan.push(s);
  return bulunan;
}

export const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
// tm/olcum.mjs — ikiliden kac gosterge cikiyor, karsi onlemler kacini gizliyor, hangi
// kalem hicbir kurulusta cikmiyor. Dizge taramasi gercekten kosturulur.
import { GOSTERGE, ikiliUret, dizgeTara, yaz } from "./ikili.mjs";

const TUR = ["dizge", "simge", "davranis", "cikarilamaz"];
const deger = (k) => k.reduce((t, g) => t + g.savunma, 0);

console.log(`${GOSTERGE.length} kurgu gosterge, toplam savunma degeri ${deger(GOSTERGE)}\n`);

const A = [-14, 9, 12, 22];
console.log("1. gosterge turleri");
yaz(A, "tur", "kalem", "savunma", "cikarma yolu");
const YOL = { dizge: "dizge taramasi", simge: "dizge taramasi",
  davranis: "dinamik gozlem", cikarilamaz: "yok" };
for (const t of TUR) {
  const k = GOSTERGE.filter((g) => g.tur === t);
  yaz(A, t, k.length, deger(k), YOL[t]);
}

const cikan = (secenek) => {
  const bulunan = dizgeTara(ikiliUret(secenek));
  return GOSTERGE.filter((g) => g.metin && bulunan.includes(g.metin));
};

const KURULUS = [
  ["karsi onlem yok", {}],
  ["simge silme", { simgeSil: true }],
  ["dizge gizleme", { dizgeGizle: true }],
  ["simge silme + dizge gizleme", { simgeSil: true, dizgeGizle: true }],
  ["paketleme", { paketle: true }],
];
const B = [-30, 9, 11, 11, 12];
console.log("\n2. dizge taramasinin cikardigi (gercek kosum)");
yaz(B, "kurulus", "kalem", "savunma", "gizlenen", "kalan pay");
const ham = cikan({});
for (const [ad, s] of KURULUS) {
  const c = cikan(s);
  yaz(B, ad, c.length, deger(c), ham.length - c.length,
    `%${((deger(c) / deger(GOSTERGE)) * 100).toFixed(1)}`);
}
console.log(`ikili ${ikiliUret({}).length} bayt (butun kuruluslarda ayni; degisen yalnizca ` +
  `icerik). Ham ikilide cikan ${ham.length} kalemin ` +
  `${ham.filter((g) => g.tur === "dizge").length} tanesi dizge, ` +
  `${ham.filter((g) => g.tur === "simge").length} tanesi simge.`);

const ADIM = ["ornegin-elde-edilmesi", "statik-cikarim", "dinamik-gozlem",
  "kurala-donusturme", "filoya-dagitim"];
const ONLEM = [
  { ad: "simge-silme", kirar: 2, gizler: ["simge"] },
  { ad: "dizge-gizleme", kirar: 2, gizler: ["dizge"] },
  { ad: "paketleme", kirar: 2, gizler: ["dizge", "simge"] },
  { ad: "hata-ayiklayici-tespiti", kirar: 3, gizler: ["davranis"] },
  { ad: "kosula-bagli-calisma", kirar: 3, gizler: ["davranis"] },
];
const C = [-24, 10, 20, 10, 12];
console.log("\n3. karsi onlem - adim eslemesi");
yaz(C, "karsi onlem", "kirdigi", "gizledigi tur", "kalem", "savunma");
for (const o of ONLEM) {
  const k = GOSTERGE.filter((g) => o.gizler.includes(g.tur));
  yaz(C, o.ad, `${o.kirar}. adim`, o.gizler.join("+"), k.length, deger(k));
}
console.log(`${ADIM.length} adimlik cozumleme zinciri: ${ADIM.join(" -> ")}`);

const D = [-34, 10, 12, 14];
console.log("\n4. kalan gosterge (karsi onlemler birikimli)");
yaz(D, "kurulus", "kalem", "savunma", "kalan pay");
const kalan = (turler) => GOSTERGE.filter((g) => !turler.includes(g.tur) && g.tur !== "cikarilamaz");
for (const [ad, t] of [["hicbiri", []], ["statik gizleme", ["dizge", "simge"]],
  ["dinamik gizleme", ["davranis"]], ["ikisi birden", ["dizge", "simge", "davranis"]]]) {
  const k = kalan(t);
  yaz(D, ad, k.length, deger(k), `%${((deger(k) / deger(GOSTERGE)) * 100).toFixed(1)}`);
}
const cik = GOSTERGE.filter((g) => g.tur === "cikarilamaz");
console.log(`hicbir kurulusta cikarilamayan kalem: ${cik.length}, savunma degeri ` +
  `${deger(cik)} (%${((deger(cik) / deger(GOSTERGE)) * 100).toFixed(1)}); ` +
  `bu kalemler ancak kurbanin kendi kaydinda gorulur`);
20 kurgu gosterge, toplam savunma degeri 38

1. gosterge turleri
tur               kalem     savunma          cikarma yolu
dizge                 7          11        dizge taramasi
simge                 5           8        dizge taramasi
davranis              5          11        dinamik gozlem
cikarilamaz           3           8                   yok

2. dizge taramasinin cikardigi (gercek kosum)
kurulus                           kalem    savunma   gizlenen   kalan pay
karsi onlem yok                      12         19          0       %50.0
simge silme                           7         11          5       %28.9
dizge gizleme                         5          8          7       %21.1
simge silme + dizge gizleme           0          0         12        %0.0
paketleme                             0          0         12        %0.0
ikili 266 bayt (butun kuruluslarda ayni; degisen yalnizca icerik). Ham ikilide cikan 12 kalemin 7 tanesi dizge, 5 tanesi simge.

3. karsi onlem - adim eslemesi
karsi onlem                kirdigi       gizledigi tur     kalem     savunma
simge-silme                2. adim               simge         5           8
dizge-gizleme              2. adim               dizge         7          11
paketleme                  2. adim         dizge+simge        12          19
hata-ayiklayici-tespiti    3. adim            davranis         5          11
kosula-bagli-calisma       3. adim            davranis         5          11
5 adimlik cozumleme zinciri: ornegin-elde-edilmesi -> statik-cikarim -> dinamik-gozlem -> kurala-donusturme -> filoya-dagitim

4. kalan gosterge (karsi onlemler birikimli)
kurulus                                kalem     savunma     kalan pay
hicbiri                                   17          30         %78.9
statik gizleme                             5          11         %28.9
dinamik gizleme                           12          19         %50.0
ikisi birden                               0           0          %0.0
hicbir kurulusta cikarilamayan kalem: 3, savunma degeri 8 (%21.1); bu kalemler ancak kurbanin kendi kaydinda gorulur

Taramanın Çıkardığı

İkinci çıktı gerçek bir koşumdur: üretilen 266 baytlık ikilide basılabilir bayt dizileri toplanır ve envanterle eşleştirilir. Ham ikiliden 12 kalem çıkar — 7 dizge, 5 simge — ve bunların savunma değeri 19’dur, envanterin toplam değerinin yarısı.

Karşı önlemler bu sayıyı adım adım düşürür. Simge silme 12’yi 7’ye, dizge gizleme 5’e indirir. İkisi birlikte uygulandığında ya da tek bir paketleme kullanıldığında tarama sıfır kalem verir. Sayı sıfıra indiğinde ikili hâlâ 266 bayttır ve hâlâ aynı işi yapmaktadır; değişen tek şey, statik bir taramanın ondan bir şey okuyup okuyamadığıdır.

Bu, çözümleme raporlarında en sık karşılaşılan yanılgının ölçülmüş hâlidir: bir taramanın boş dönmesi kalemin zararsız olduğunu değil, o taramanın o kalemde işe yaramadığını gösterir. Aynı ikili, aynı davranış, farklı bir sunum.

Karşı Önlem Hangi Adımı Kırar

Üçüncü çıktı beş karşı önlemi savunmanın çözümleme zincirine eşler. Üçü ikinci adımı — statik çıkarımı — kırar. İkisi üçüncü adımı — dinamik gözlemi — kırar.

Hiçbiri birinci adımı kırmaz. Örneğin elde edilmesi, karşı önlemlerin ulaşamadığı halkadır: kalem uç noktaya varmışsa savunmanın elindedir. Dördüncü ve beşinci adımlar — kurala dönüştürme ve filoya dağıtım — da karşı önlemlerin kapsamı dışındadır; onların hızı savunmanın kendi işleyişine bağlıdır.

Buradan bu kursun ölçüsüne uygun bir sonuç çıkar. Savunmanın çözümleme zincirinde kırılabilen iki halka vardır ve ikisi de ortadadır. Zincirin başı ve sonu saldıranın erişemediği halkalardır. Karşı önlem seçimi, savunmanın hangi adımda daha az yedeği olduğuna bakar: statik çıkarımın yedeği dinamik gözlemdir, dinamik gözlemin yedeği yoktur.

Çıkarılamayan Kalem

Dördüncü çıktı kalan göstergeleri sayar. Hiçbir karşı önlem yokken 17 kalem ve 30 savunma değeri çıkarılabilir durumdadır. Statik gizleme uygulandığında 5 kalem ve 11 değer kalır; dinamik gizleme uygulandığında 12 kalem ve 19 değer. İkisi birden uygulandığında ikilinin kendisinden hiçbir şey çıkmaz.

Son satır bu dersin cevabıdır. Üç kalem — hedef ağ adresi, oturum anahtarı ve kurban kimliği — hiçbir kuruluşta çıkarılamaz ve savunma değerlerinin toplamı 8’dir, envanterin %21,1’i. Bu kalemler ikilide hiç bulunmaz; kalem onları çalıştığı ortamdan alır.

Sonuç şudur: tersine mühendislik savunmaya bir gösterge kümesi verir, ama hiçbir zaman tamamını vermez ve karşı önlemler karşısında verdiği kısım sıfıra kadar inebilir. Kurbanın kendi kayıtları bu yüzden çözümlemenin alternatifi değil, tamamlayıcısıdır: son üç kalem yalnız orada vardır ve savunma değeri en yüksek üç kalemden ikisi o kümededir.

Özet

  • Bir ikiliden çıkarılabilecek kalemler dört türdür: dizge ve simge statik taramayla, davranış yalnız çalışma anında görülür, dördüncü tür hiçbir yolla çıkarılamaz.
  • 266 baytlık kurgu ikiliden dizge taraması 12 kalem çıkardı (7 dizge, 5 simge), savunma değeri 19 — envanterin toplam değerinin yarısı.
  • Simge silme çıkan kalemi 7’ye, dizge gizleme 5’e indirdi; ikisi birlikte ya da tek başına paketleme sıfıra indirdi. İkili aynı boyutta ve aynı işlevdedir; değişen yalnız okunabilirliktir.
  • Beş karşı önlemin üçü çözümleme zincirinin ikinci adımını, ikisi üçüncü adımını kırar. Birinci, dördüncü ve beşinci adımlar karşı önlemlerin ulaşamadığı halkalardır.
  • Üç kalem hiçbir kuruluşta çıkarılamaz; savunma değerleri 8, envanterin %21,1’i. Bu kalemler yalnız kurbanın kendi kaydında görülür ve çözümlemenin alternatifi değil tamamlayıcısıdır.

Kurs Kapanışı

Yirmi iki ders boyunca tek bir soru soruldu: bu zincir hangi halkada kırılabilir ve geç kırmak ne kaybettirir. Aşağıdaki tablo her dersin üç sütununu sırayla toplar; her sayı kendi dersinden okunmuştur.

Ders Zincir adımı Kırılabilen halka Geç kırmanın bedeli
Tehdit Aktörleri 8 adım 8 eşik, 1 düzey geçer 64 kalem
Gelişmiş Sürekli Tehdit 8 adım, 330 gün 5 denetimli, 2 uyarır 48 kalem
Saldırı Yaşam Döngüsü 8 adım 5 denetim, 3 boş adım 20,14 kalem
Saldırgan Davranış Sınıflandırmaları 8 adım, 10.800 zincir 72 zincir kırılamaz 1,39 kalem ortalama
Dört Köşeli İlişki Modeli 8 adım, 6 bağlantı altyapı 7. adımda 41 kalem
Bilinen ve Bilinmeyen Tehditler 8 denetim bilinende 7, bilinmeyende 5 19,69 kalem
Sosyal Mühendisliğin Temeli 6 adım 4 denetimli, en erken 3. 9 kalem
Kimlik Avı Türleri 5 adım en erken 2. adım 11 kalem
Diğer Kanallar 5 adım e-postada 4, sesli aramada 0 11 kalem
Fiziksel Teknikler 3 zincir ilk adım denetimsiz 7, 5, 7 kalem
Alan Adı Taklidi kayıt zinciri izleme varsa 1. adım 6 kalem kazanç
Su Kuyusu Saldırıları 6 adım 3 kaynakta 3., 2 sayfada 6. 12 kalem
Farkındalık Programları 5 halka bildirim 3. halkayı kırar 5 kalem
Web Uygulaması Riskleri 39 adım, 9 zincir 17 adımda denetim 480 kalem
Enjeksiyon Saldırıları 6 adım 2. adım, 9/12 yerde 480 kalem
Siteler Arası Betik Çalıştırma 5, 6 ve 4 adım 3 bileşim kırılmıyor 340 oturum
İstek Sahteciliği 5 + 5 adım tarayıcıda 3., sunucuda 1. 267 işlem, 60 iç uç
Dizin Geçişi 5 adım 2. adım, tanıtıcı eşlemesi 30 kalem, 41 duyarlılık
Arabellek Taşması 5 adım 1. adım, dil sınıfı 6 komşu alan
Parola Saldırıları 6 adım 3. adım, eşiğin ölçeği 190 hesap
Sürükle–Bırak İndirmeleri 6 koşul 3. koşul, erken sınır 73 uç nokta
Tersine Mühendislik Temelleri 5 adım, çözümleme 2. adım, karşı önlem 8 savunma değeri

Tablo tek bir kuralı adıyla anmayı gerektirir: saldırı bir an değil, önkoşulları olan bir adım dizisidir. Hiçbir satırda tek bir olay yoktur; her satırda birbirine bağlı adımlar ve her adımın tutması gereken bir koşulu vardır. Savunmanın işi de bu yüzden zinciri kırmak değildir — zincir zaten pek çok yerde kırılabilir. Savunmanın işi en erken kırılabilen halkayı bulmak, onun meşru işe bedelini yazmak ve o halkanın kaç yerde gerçekten dağıtıldığını saymaktır.

Yirmi iki satırın hepsi bunu yalnız kâğıt üzerinde gösterir. Adım dizileri modellendi, denetimler adımlara eşlendi, kapsam sayıldı ve bedel yazıldı — hepsi kendi yazdığımız veri yapıları üzerinde. Bir savunmanın gerçekten tuttuğunu ise kâğıt gösteremez; ancak yetkili biri deneyerek gösterebilir. O denemenin kuralları, kapsamının nasıl tanımlandığı, nerede durulacağı ve bulunanların hangi biçimde raporlanacağı bu kursta hiç ele alınmadı. Sonraki kurs — Güvenlik Araçları ve Sızma Testi — tam olarak bunu ölçer.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat