CEN429 Güvenli Programlama · Hafta 4

Kod Sağlamlaştırma: C/C++

CEN429 Güvenli Programlama — Hafta 4

Dr. Öğr. Üyesi Uğur CORUH · 09.10.2026

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bugünün planı (3 saat)

Saat Bölüm Konu
1 1 Sağlamlaştırma (hardening) katmanları · SEI CERT · girdi doğrulama ilkeleri · CERT çiftleri
2 2–4 Biçim dizesi (format string) Demo 1 · UAF Demo 2 · tamsayı/UB Demo 3 · hata işleme/sinyaller · statik analiz · sanitizer · fuzzing Demo 4
3 5–7 Derleyici/OS korumaları Demo 5 · güvenli derleme hattı (CI) · kod gizleme Demo 6–7 · uçtan uca · proje

Öğrenme çıktısı: ÖÇ.3 (binary uygulama korumaları)

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kısa tarihçe — bellek hataları ve savunmaların yarışı

  • 1988 — Morris Worm tampon taşmasını dünyaya duyurur
  • 1996 — Smashing the Stack for Fun and Profit sömürüyü herkese öğretir
  • 1998 → 2004 — kanarya (StackGuard) · ASLR (PaX) · DEP/NX · FORTIFY
  • 2012–13 — AddressSanitizer ve fuzzing (AFL) hataları otomatik yakalar

Ders bu yarışı izler: hatayı yaz → araç yakalasın → derleyici/OS korusun.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Önceki haftalardan gelenler

  • Süreç belleği: yığın ve öbek — yığın (stack) fonksiyon çağrılarının yerel değişkenlerini otomatik yönetir, öbek (heap) malloc/free ile elle yönetilir (Hafta 1)
  • Arabellek taşması — bir diziye ayrılan boyuttan fazla veri yazmak; taşan baytlar komşu belleğe yazılır (Hafta 1)
  • Yığın çerçevesi ve dönüş adresi — bir fonksiyon çağrısının yerel değişkenlerini ve dönüş adresini tuttuğu bölüm (Hafta 1)
  • Beyaz kutu saldırgan modeli — cihazın sahibi aynı zamanda olası saldırgandır; belleği okuyabilir, hata ayıklayıcı bağlayabilir (Hafta 1)
  • CWE — yazılım zayıflıklarının numaralı kataloğu (Hafta 2)

Bu hafta: 1–3. haftanın ilke/tehdit modeli/kripto temeli üzerine SEI CERT kuralları, sanitizer'lar ve derleyici/OS korumalarını kuruyoruz.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bu haftanın kavramları

Her terim, gövdede ilk geçtiği yerde tanımlanır; burada yalnız nerede olduğunu işaretliyoruz.

Kavram Nerede
Sağlamlaştırma katmanları · SEI CERT Bölüm 1
Girdi doğrulama ilkeleri Bölüm 1
Biçim dizesi açığı Bölüm 2
Serbest bırakılmış bellek (UAF) Bölüm 3
Tanımsız davranış (UB) Bölüm 3
Hata işleme, sinyaller Bölüm 3
Statik analiz · sanitizer · fuzzing Bölüm 4
Derleyici/OS korumaları · CI Bölüm 5
Kod gizleme Bölüm 6
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

İşaretçi (pointer)

  • İşaretçi: bir bellek adresini tutan değişken.
  • p bir adres; *p o adresteki değer.
  • Yanlış adres → çökme ya da yanlış veri.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Derleyici bayrağı (flag)

  • Bayrak: derleyiciye verilen seçenek.
  • Örnek: -O2 (optimizasyon), -Wall (uyarılar), -fsanitize=address.
  • Doğru bayraklar birçok hatayı derleme anında yakalar.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Uyarı (warning) vs hata (error)

  • Hata: derleme durur.
  • Uyarı: derleme sürer ama bir sorun bildirilir.
  • Kural: uyarıları hataya çevir (-Werror) — görmezden gelinen uyarı, gelecekteki açıktır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Demolar nasıl çalışıyor?

  • Demolar code/week-04 altında; Windows (Visual Studio 2022) ve WSL/Linux'ta çalışır.
  • Derle: Windows .\build.ps1 · WSL/Linux ./build.sh
  • Çalıştır: her demo klasöründe Windows .\demo.ps1 · WSL/Linux sh demo.sh
  • Fuzzing (Demo 4) Linux/WSL'de clang ister (sudo apt install -y clang); Windows'ta VS'nin "C++ AddressSanitizer" bileşeni gerekir.

⚠️ Etik: demolar yalnız kendi küçük programlarımızda; başka bir programa/sisteme dokunmaz.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

1. Katmanlar ve SEI CERT

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Üç katman, doğru sıra

Kod sağlamlaştırma üç katmandır. Sıra önemli:

  1. Önce hatasız kod (güvenli kodlama)
  2. Sonra zararı sınırla (derleyici/OS korumaları)
  3. En son okumayı zorlaştır (gizleme)

⚠️ Gizleme, hatayı düzeltmez.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Neden bu sıra?

  • Hatalı koda koruma eklemek, çürük temele boya çekmek gibidir.
  • Önce hatayı kaldır; sonra kaçanı yakala; en son tersine mühendisliği yavaşlat.
  • Bu hafta üçünü de göreceğiz, bu sırayla.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CERT kuralının anatomisi — şema

SEI CERT C/C++: gerçek zafiyetlerden çıkarılan, güvenli kodlamanın kural kitabı.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Üç katman — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Katman 2 · Güvenli kodlama

  • Soru: kodumda hata var mı?
  • Araçlar: CERT kuralları, sanitizer, fuzzing.
  • Amaç: hatayı en baştan yazmamak.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Katman 3 · Derleyici/OS

  • Soru: hata kaçarsa sömürü zor mu?
  • Araçlar: kanarya, FORTIFY, ASLR, NX, RELRO, CFI.
  • Amaç: kalan hatanın istismarını pahalı kılmak.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Katman 4 · Gizleme

  • Soru: kodu okuyan anlıyor mu?
  • Araçlar: sembol/dize gizleme, günlük kaldırma, düzleştirme.
  • Amaç: tersine mühendisliği yavaşlatmak.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sahadan: şema gereksinimleri

Sertifikalı bir üründe:

  • "Yaygın zafiyetler ele alınmalı: hassas veri, enjeksiyon, taşma, dile özgü zayıflıklar"
  • "Savunmacı programlama kodun tamamında tutarlı"
  • "Statik ve dinamik tersine mühendisliğe karşı koruma"

➡️ Yalnız native tarafta 18 sağlamlaştırma önlemi.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

SEI CERT: bir kural neye benzer?

Her CERT kuralının parçaları:

  • Kimlik: STR31-C, MEM50-CPP
  • Başlık: tek cümle
  • Hatalı örnek ve uyumlu çözüm
  • Risk düzeyi (L1/L2/L3) ve CWE bağı
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kural mı, öneri mi?

  • Kural (rule): ihlali bir zafiyettir, denetlenebilir.
  • Öneri (recommendation): iyi uygulama.
  • İncelemeye L1 (en yüksek risk) kurallarından başla.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Risk düzeyi nasıl belirlenir?

Risk = önem × olasılık × düzeltme maliyeti.

  • L1: yüksek risk, önce bunlar.
  • L2 / L3: giderek düşer.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CERT kategorileri (1)

Kısaltma Kategori Örnek
INT Tamsayılar INT32-C: işaretli taşmaya izin verme
ARR/STR Dizi/dize (string) STR31-C: yeterli yer ayır
MEM Bellek MEM30-C: bırakılmış belleğe erişme
FIO Dosya G/Ç FIO30-C: girdiyi biçim dizesinden dışla
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CERT kategorileri (2)

Kısaltma Kategori Örnek
ENV Ortam ENV33-C: system() çağırma
SIG Sinyaller SIG30-C: işleyicide yalnız güvenli fn.
ERR Hata işleme ERR33-C: kütüphane hatasını algıla
CON/MSC Eşzamanlılık/çeşitli CON43-C, MSC32-C

C++: MEM50-CPP, CTR50-CPP, STR50-CPP, EXP53-CPP, ERR50-CPP.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Otomatik CERT denetimi

  • Uyarılar: -Wall -Wextra -Wformat=2 -Wconversion
  • clang-tidy cert-*
  • cppcheck --addon=cert
  • MSVC /analyze

Değerlendirici önce bu taramayı çalıştırır, sonra elle okur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Girdi doğrulama

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Girdi doğrulama — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Girdi nereden gelir?

Sandığınızdan çok yerden. Ve hepsi güvenilmez:

  • Komut satırı, ortam değişkenleri
  • Dosya, ağ
  • IPC (aynı makinedeki başka süreç)
  • Veritabanı, kütüphane arayüzü (JNI)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sık unutulan girdiler

  • argv[0] bile saldırganın olabilir; PATH, LANG.
  • Dosya biçimindeki uzunluk alanları.
  • Ağ: "16 bayt" der, 1 bayt gönderir.
  • "Kendi verimiz" sonradan değişmiş olabilir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Girdi doğrulamanın beş ilkesi

  1. Beyaz liste (izin verilenleri say), kara liste değil.
  2. Önce kanonikleştir, sonra doğrula.
  3. Uzunluk → tür → aralık → biçim sırasıyla.
  4. Güven sınırında, en erken noktada.
  5. Reddet, "temizleyip" kullanma.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

İlke 1 · Beyaz liste

  • Kara liste: "şunlar yasak" — hep bir şey unutulur.
  • Beyaz liste: "yalnız şunlar serbest" — güvenli varsayılan.

Örnek: kullanıcı adı yalnız [a-z0-9_] olsun.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

İlke 2 · Kanonikleştir

  • Aynı şeyin farklı yazımları: /tmp/../etc, %2e%2e/.
  • Önce tek biçime indir (kanonikleştir), sonra denetle.
  • Yoksa denetim atlatılır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

İlke 3 · atoi değil strtol

errno = 0;
long value = strtol(s, &end, 10);
if (end == s)         return -1;  /* no digits */
if (*end != '\0')     return -1;  /* "12abc" */
if (errno == ERANGE)  return -1;  /* overflowed */
if (value < min_val || value > max_val) return -1;  /* business rule */
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Neden atoi tehlikeli?

  • atoi("abc") = 0 (hata sessiz)
  • atoi("99999999999") = tanımsız (taşma)
  • atoi("12abc") = 12 (fazlalık yok sayılır)

strtol her hatayı size bildirir; atoi bildirmez.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

İlke 3 · uzunluk önekli kayıt

if (remaining < 3) return -1;                    /* no header */
uint16_t length = buffer[1] << 8 | buffer[2];
if (length > remaining - 3)       return -1;      /* SOURCE: declared > received */
if (length > sizeof rec->data)    return -1;      /* DEST: doesn't fit */
memcpy(rec->data, buffer + 3, length);
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

İki ayrı denetim, doğru sıra

  • Kaynak denetimi: bildirilen uzunluk, gelen veriden büyük mü?
  • Hedef denetimi: hedef tampona sığıyor mu?
  • Sıra: remaining - 3 sarmasın diye önce remaining < 3.
  • Sahada: JNI'den gelen her dizi native tarafta yeniden doğrulanır.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CERT çifti · STR31-C

strcpy(copy, name);                               /* WRONG */
int n = snprintf(copy, sizeof copy, "%s", name);  /* COMPLIANT */
if (n < 0 || (size_t)n >= sizeof copy) { /* kesildi */ }

strcpy sınır bilmez; snprintf boyutu bilir ve kesilmeyi bildirir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CERT çifti · INT30-C

size_t remaining = total - read_count;   /* WRONG: read_count>total -> gigantic number */
if (read_count > total) return ERROR;    /* COMPLIANT: order checked first */
size_t remaining = total - read_count;

İşaretsiz çıkarma sarar; önce mantığı denetle.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CERT çifti · MEM30-C

for (n = head; n; n = n->next) free(n);              /* WRONG */
while (n) { Node *s = n->next; free(n); n = s; }      /* COMPLIANT */

free(n)'den sonra n->next okumak = bırakılmış belleğe erişim.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CERT çifti · ERR33-C

FILE *f = fopen(path,"rb"); fread(t,1,n,f);        /* WRONG */
if (!f) return ERROR;
if (fread(t,1,n,f) < n && ferror(f)) return ERROR; /* COMPLIANT */

Her dönüş değerini denetle; fopen NULL dönebilir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kural: bulguyu kimliğe bağla

Her bulguyu bir CERT kimliğiyle eşleştir:

"Bu satır MEM30-C ihlali (CWE-416)."

Böylece bulgu nesnel ve aranabilir olur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 1 — kısa sınama

  1. Üç katman ve doğru sıra?
  2. Kural ile öneri farkı?
  3. atoi neden strtol'a göre tehlikeli?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 1 — cevaplar

  1. Sıra: güvenli kod (kaynak) → derleyici/araç korumaları → OS/çalışma zamanı korumaları. Önce doğru yaz, sonra sertleştir, sonra çalışma anında savun.
  2. Kural her zaman uygulanır, ihlali kusurdur; öneri bağlama göre iyi uygulamadır.
  3. atoi hatayı bildirmez (taşma/geçersiz girdide tanımsız/0); strtol endptr+ERANGE ile hatayı ve sınırı kontrol ettirir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

2. Biçim dizesi açığı

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Biçim dizesi açığı — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sorun · printf(girdi)

printf(user_input);        /* WRONG */
printf("%s", user_input);  /* CORRECT */

İlkinde kullanıcı girdisi bir biçim dizesi olarak yorumlanır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Neden tehlikeli?

printf biçim dizesindeki % belirteçlerini komut sayar.

Kullanıcı %x, %s, %n gönderirse programa iş yaptırır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kısa tarihçe · biçim dizesi açıkları

  • 1999–2000 — wu-ftpd gibi yaygın FTP sunucularında gerçek zafiyetler açığı geniş çapta tanıttı.
  • Saldırganlar günlükleme çağrılarına sızan kullanıcı verisini biçim dizesi olarak kullanıp bilgi sızdırdı, hatta uzaktan kod çalıştırdı.
  • Ders: %n gibi "zararsız görünen" bir belirteç aslında bir yazma astarıdır (write primitive).
  • Karşılık: derleyicide -Wformat-security, çalışma anında _FORTIFY_SOURCE.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Belirteç · %x, %p

  • Yığındaki değerleri okur ve yazdırır.
  • → bilgi sızıntısı (adresler, gizli değerler).
  • ASLR'yi zayıflatır (adres sızarsa).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Belirteç · %s

  • Yığındaki bir değeri işaretçi sanar ve o adresteki dizeyi okur.
  • Rastgele adres → çökme ya da bellek okuma.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Belirteç · %n

  • Şimdiye kadar yazılan karakter sayısını bir adrese yazar.
  • → belleğe yazma → bozulma, denetim ele geçirme.
  • En tehlikelisi.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Aynı hata başka yerlerde

Sadece printf değil:

syslog, fprintf, snprintf, err/warn — hepsi biçim dizesi alır.

Kural: biçim dizesi her zaman sabit (FIO30-C).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Demo 1 — biçim dizesi

code/week-04/01-format-string · CWE-134

Adım Ne görülür?
0 GCC -Wformat-security uyarır; MSVC /analyze yakalar
2 %x.%x… Yığın dökülür, gizli (sentetik) değer görünür
3 AAAA%n Linux korumasız çöker; Windows CRT %n'i reddeder
4 _FORTIFY_SOURCE: %n in writable segment
5 Belirteçler yalnız metin olarak görünür
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — %x yığını tarar

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: %n bir sonraki adımda

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Düzeltme · katman katman

  1. Biçim dizesi hep sabit (FIO30-C).
  2. Uyarı: -Wformat -Wformat-security -Werror=format-security.
  3. Kendi fonksiyonunuzu derleyiciye denetlettirin:
void gunluk_yaz(int duzey, const char *bicim, ...)
    __attribute__((format(printf, 2, 3)));
  1. Çalışma anı: _FORTIFY_SOURCE=2; MS CRT %n kapalı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

3. Bellek: use-after-free

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Yığın ve öbek — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Use-after-free — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

UAF nedir? · adım 1

  • Bir nesne öbekte.
  • İki işaretçi aynı nesneyi gösteriyor.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

UAF · adım 2

  • Biri free ediyor.
  • Diğeri hâlâ o adresi tutuyor → askıda (dangling) işaretçi.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

UAF · adım 3

  • Ayırıcı aynı bloğu başka nesneye veriyor.
  • Askıdaki işaretçi artık yabancı veriyi okur/yazar.
  • Nesnede fonksiyon işaretçisi varsa (C++ sanal tablo) risk büyür.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

UAF neden çok yaygın?

Tarayıcı/OS güncellemelerindeki "bellek bozulması düzeltildi" notlarının büyük kısmı bu sınıftır.

Karmaşık sahiplik → askıda işaretçi.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Demo 2 — UAF ve çift bırakma

code/week-04/02-use-after-free · CWE-416/415 · MEM30-C

Adım Ne görülür?
1 Serbest blok dolar → rol user → admin
2 ASan heap-use-after-free + yerler
3 Çift free → tanımsız davranış
4 ASan attempting double-free
5 free + NULL, tek sahip → güvenli
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — küçük bir öbek

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: çift serbest bırakma

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

ASan raporu · üç yığın izi

ERROR: heap-use-after-free
  #0 mode_uaf uaf.c:49   <- 1. KULLANIM
freed here:
  #1 mode_uaf  uaf.c:38   <- 2. SERBEST BIRAKMA
allocated here:
  #1 mode_uaf     uaf.c:32   <- 3. AYIRMA

Düzeltme çoğunlukla 2. konumda: sahiplik kararı orada yanlış.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Çözüm · C tarafı

  • free'den sonra işaretçiyi NULL yap.
  • Tek sahip, tek bırakma noktası belirle.
  • Sahiplik kuralını yaz: "bu belleği kim bırakır?"
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Çözüm · C++ akıllı işaretçiler

İhtiyaç C++
Tek sahip std::unique_ptr
Paylaşılan std::shared_ptr
Sahipsiz gözlem std::weak_ptr → lock()
Dizi std::vector, std::array
if (auto o = cache.lock()) use(*o);  // otherwise stale memory is never accessed

⚠️ get() ham işaretçi; vector büyüyünce yineleyici geçersizleşir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Tamsayılar ve UB

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Tamsayı taşması — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Dört tamsayı hatası

Hata Örnek Sonuç
İşaretsiz sarma 0u - 1 = 4.294.967.295 Mantık hatası
İşaretli taşma INT_MAX + 1 Tanımsız
Dönüşüm kaybı long long→int Kesilme
Kaydırma 1 << 31 Tanımsız
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Neden önemli? · çarpım taşması

uint32_t size = count * 4;   /* count = 0x40000001 → size = 4 */
array = malloc(size);        /* small block */
/* loop writes `count` times → heap overflow */

Küçük ayrılan bloğa çok yazmak = taşma.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

UB · derleyici denetimi silebilir

Tanımsız davranış (UB): C/C++ standardının sonucunu tanımlamadığı işlem (ör. işaretli tamsayı taşması).

if (x + 100 < x)   /* assumes "if it overflows, it gets smaller" */
    return -1;     /* signed overflow is UB → the compiler MAY DELETE this branch */
  • -O0'da "çalışır", -O2'de denetim yok olur.
  • UB'ye güvenilmez.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Doğru: önce denetle

if ((b > 0 && a > INT_MAX - b) ||
    (b < 0 && a < INT_MIN - b)) return false;   /* before the overflow */
if (__builtin_mul_overflow(a, b, &result)) return false;  /* GCC/Clang */
/* C23: <stdckdint.h> ckd_add/ckd_mul · MSVC: <intsafe.h> */

Taşmayı olmadan önce yakala.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Demo 3 — UB ve UBSan

code/week-04/03-undefined-behavior · CWE-190/758

  • İşaretli taşma, geçersiz kaydırma, hizasız erişim
  • x86'da çoğu sessizce yanlış sonuç
  • -fsanitize=undefined → signed integer overflow: 2147483647 + 1 ...
  • Windows: UBSan yok → /RTC, /analyze, CERT

⚠️ -fwrapv mantık hatasını gizler; tanı için kullanma.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — INT_MAX + add

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: güvenli sürüm aynı girdiyi reddediyor

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Hata işleme ve sinyaller

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sinyal işleyici — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Denetlenmeyen dönüş değeri

Çağrı Denetlenmezse
malloc NULL'a yazma
setresuid Yetkili kalır
RAND_bytes "Rastgele" anahtar sıfır
EVP_DecryptFinal_ex Kurcalanmış veri doğrulanmış sanılır
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Hata işleme kuralları

  1. Her dönüşü denetle (ERR33-C); [[nodiscard]].
  2. Hatada güvenli duruma dön (goto temizle) — fail-closed.
  3. İleti ipucu vermesin: "kullanıcı yok" ≠ "parola yanlış".
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sahadan: opak dönüş değerleri

  • Native fonksiyonlar ayrıntılı hata kodu döndürmez.
  • Yalnız başarılı/başarısız, üstelik opak (9. hafta).
  • Ayrıntılı kod = saldırgana "hangi denetimde takıldın" haritası.
  • Tanı için ayrı, güvenli kanal → ödünleşim kaydı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sinyal işleyici · kural

static volatile sig_atomic_t stop = 0;
static void handler(int s){ (void)s; stop = 1; }  /* ONLY a flag */
  • İşleyicide printf, malloc, free yok (SIG30-C).
  • Eşzamansız-güvenli olmayan fonksiyon çağırma.
  • signal() yerine sigaction().
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Gerçek olay: regreSSHion

  • 2024 CVE-2024-6387: zaman aşımı sinyal işleyicisi güvensiz bir günlük fonksiyonu çağırıyordu.
  • Sonuç: uzaktan kod çalıştırma riski.
  • Ders: işleyicide yalnız bayrak set et.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 2–3 — kısa sınama

  1. %n neden en tehlikelisi?
  2. UAF raporundaki üç iz? Düzeltme hangisinde?
  3. if (x+100 < x) neden silinebilir?
  4. Sinyal işleyicide neden printf yok?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 2–3 — cevaplar

  1. %n biçim belirtecinin yazdığı bayt sayısını belleğe YAZAR → saldırgan seçtiği adrese yazıp akışı ele geçirebilir.
  2. allocated-by · freed-by · use-here. Düzeltme freed↔use arasında: free sonrası işaretçiyi NULL yap / yaşam süresini düzelt.
  3. İmzalı taşma tanımsız davranıştır; derleyici "taşma olmaz" varsayar → koşul hep false → siler. Kontrolü __builtin_add_overflow ile yapın.
  4. printf async-signal-safe değil; işleyicide yeniden girişte kilit/durum bozulur → kilitlenme/çökme. Yalnız write gibi güvenli çağrılar.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

4. Statik analiz, sanitizer, fuzzing

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

ASan redzone — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Statik ↔ dinamik — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Statik analiz nedir?

Kodu çalıştırmadan inceleyip hata arama.

Avantaj: çalışmayan yolları da görür.
Dezavantaj: yanlış alarm üretir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Statik analiz · katman katman

Düzey Araç Bulduğu
Uyarılar -Wall -Wextra -Wconversion Dönüşüm, biçim
Analizci -fanalyzer, clang --analyze, /analyze NULL, sızıntı
Kural clang-tidy cert-*, cppcheck CERT ihlali
Anlamsal CodeQL, Semgrep Veri akışı
Ticari Coverity, Klocwork Derin analiz
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kirli veri: kaynak → hedef

Araç, doğrulanmamış verinin tehlikeli bir yere aktığını görür.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Yanlış alarmla yaşamak

  1. Önce yüksek güvenilirlikli kurallar.
  2. Her bastırma gerekçeli: // NOLINT(cert-err33-c): neden.
  3. Yeni kodda sıfır uyarı (CI zorlar).

Değerlendirici geliştiricinin kendi tarama raporunu ister.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sanitizer nedir?

Programı çalıştırırken bellek/UB hatalarını yakalayan araç.

Yanlış alarm neredeyse yok; ama yalnız çalışan yoldaki hatayı bulur.

→ test + fuzzing ile birlikte.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kısa tarihçe · AddressSanitizer

  • 2012 — Google, AddressSanitizer'ı (ASan) yayımladı: derleme anında enstrümantasyon + gölge bellek ile taşma/UAF'ı anında yakalıyor.
  • Öncesinde bu sınıf hata genelde sessizce çöküyor ya da hiç fark edilmiyordu.
  • ASan + fuzzing birlikte kullanılınca, çökmeyen ama belleği bozan girdi de yakalanır (bu haftanın Bölüm 4/11'i).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sanitizer ailesi

Sanitizer Bulduğu Bayrak
ASan Taşma, UAF, çift bırakma -fsanitize=address
LSan Sızıntı ASan ile
UBSan Taşma, kaydırma, NULL -fsanitize=undefined
MSan İlklendirilmemiş okuma -fsanitize=memory
TSan Veri yarışı -fsanitize=thread
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

ASan nasıl çalışır? · gölge bellek

  • Her 8 bayt için 1 gölge bayt: ne kadarı geçerli?
  • Dizilerin önüne/arkasına koruma bölgesi (redzone).
  • Serbest bloklar karantinada bekler.
  • Her erişimden önce gölge denetimi.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

ASan'ın kör noktası

struct { char name[8]; long role; } k;
strcpy(k.name, long_input);   /* name → role overflows */

Aynı yapının içinde alandan alana taşma → arada koruma bölgesi yok → ASan görmez (1. hafta Demo 3).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sanitizer sürüme gitmez

gcc -g -O1 -fno-omit-frame-pointer \
    -fsanitize=address,undefined p.c -o p_test
  • Yavaşlatır (~2×), bellek kullanır.
  • Yalnız test/CI'da; sürümde kapalı.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Fuzzing nedir? · kapsam güdümlü

Fuzzing: bir programı çok sayıda otomatik üretilmiş, çoğu bozuk girdiyle çalıştırıp çökme arama tekniği.

Yeni kod yolu açan girdi saklanır ve üzerinde çalışılır.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Fuzzing ne bulur?

  • Sihirli baytları, doğru uzunluk alanını kendiliğinden bulur.
  • İnsanın düşünmediği girdileri.
  • Araçlar: libFuzzer, AFL++, honggfuzz, OSS-Fuzz (on binlerce hata).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kısa tarihçe · fuzzing

  • 1990 — Barton Miller'ın "Fuzz" çalışması: rastgele girdiyle Unix araçlarının %25-33'ünü çökertti; fuzzing'in akademik başlangıcı.
  • 2013 — AFL (american fuzzy lop): kapsam geri beslemesini pratik ve yaygın hâle getirdi.
  • Ardından libFuzzer (derlemeye gömülü, hızlı) ve OSS-Fuzz (büyük açık kaynak projelerini sürekli fuzzlayan servis).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Fuzz hedefi yazmak

int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    parse_document((const unsigned char *)data, size);
    return 0;
}
clang -g -O1 -fsanitize=fuzzer,address fuzz.c parser.c -o f
./f corpus/ -max_total_time=10
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

İyi fuzz hedefi

Dört özellik:

  • Hızlı (ağ/disk yok)
  • Deterministik (aynı girdi → aynı sonuç)
  • Durumsuz (önceki çağrıdan etkilenmez)
  • Tek iş (bir fonksiyonu sınar)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Demo 4 — fuzzing ile hata bulmak

code/week-04/04-fuzzing · CWE-125/787

Adım Ne olur?
1 seeds/normal.bin sorunsuz
2 libFuzzer ≤ 10 sn → çökerten girdi
3 ASan ile yeniden oynat → tam rapor
4 Düzeltilmiş sürüm → çökme yok
5 crash.bin güvenle reddedilir

"Şu fonksiyon şu süre fuzzlandı" = güçlü kanıt (S16).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — izin listesi ayrıştırıcı

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: hepsi bozuk kayıt

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — kapsam güdümlü fuzzing

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: ilk adayda hemen çökme

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 4 — kısa sınama

  1. Statik ve dinamik analizin farkı?
  2. ASan hangi taşmayı göremez?
  3. İyi fuzz hedefinin dört özelliği?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 4 — cevaplar

  1. Statik: kodu çalıştırmadan tüm yolları inceler (yanlış pozitif olabilir). Dinamik: çalıştırırken yalnız yürütülen yolda gerçek hatayı gözler.
  2. ASan redzone koyduğu yerleri görür; bir nesnenin içindeki alanlar arası taşmayı ve hiç çalışmayan yolları göremez.
  3. Hızlı, deterministik, kendine yeterli (dış duruma bağlı değil), dar bir girdi yüzeyi işleyen; çökmede net başarısızlık veren hedef.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

5. Derleyici ve OS korumaları

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Derleyici/OS korumaları — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Katman 3 · fikir

Hata kaçtı diyelim.

  • Sömürüyü pahalı kılan otomatik korumalar var.
  • Çoğu bir derleme bayrağıyla açılır.
  • Bedava değil ama ucuz.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Yığın kanaryası

  • Dönüş adresinden önce bir nöbetçi değer konur.
  • Taşma bu değeri bozarsa, dönüşten önce fark edilir ve program durur.
  • -fstack-protector-strong / MSVC /GS.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kısa tarihçe · derleyici/OS korumaları

  • 1998 — StackGuard: yığın kanaryası fikrini derleyiciye ilk kez otomatik olarak ekledi.
  • 2001 — PaX projesi, Linux çekirdeğine ASLR'ı (adres uzayı düzeni rastgeleleştirme) getirdi.
  • 2003–2004 — W^X / NX / DEP: bellek sayfaları aynı anda hem yazılabilir hem çalıştırılabilir olamaz.
  • Bu üçü birlikte, günümüz derleyici/OS korumalarının temelini oluşturur.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Yığın taşması ve kanarya — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

_FORTIFY_SOURCE

  • Boyutu bilinen tampona fazla yazan kütüphane çağrılarını yakalar.
  • -D_FORTIFY_SOURCE=2 (+ en az -O1).
  • Kendi döngülerinizi korumaz.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

PIE + ASLR

  • ASLR: adresleri rastgeleleştirir.
  • PIE: programın da rastgele yüklenmesini sağlar.
  • -fPIE -pie / /DYNAMICBASE /HIGHENTROPYVA.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

DEP/NX ve RELRO

  • DEP/NX: veri bölgesini çalıştırılamaz yapar (varsayılan).
  • RELRO: GOT gibi tabloları salt-okunur yapar → -Wl,-z,relro,-z,now.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CFI / CFG ve gölge yığın

  • CFI/CFG: dolaylı çağrıların yalnız geçerli hedeflere gitmesini denetler.
  • -fcf-protection, -fsanitize=cfi / /guard:cf.
  • Gölge yığın: dönüş adreslerinin ikinci kopyası (CET).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Korumalar · tek tablo

Koruma GCC/Clang MSVC
Kanarya -fstack-protector-strong /GS
FORTIFY -D_FORTIFY_SOURCE=2 Güvenli CRT
PIE/ASLR -fPIE -pie /DYNAMICBASE
NX varsayılan /NXCOMPAT
RELRO -Wl,-z,relro,-z,now —
CFI -fcf-protection /guard:cf
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

⚠️ Her koruma sınırlıdır

Koruma Durdurur Durdurmaz
Kanarya Dönüş adresine taşma Öbek taşması, sızan kanarya
FORTIFY Kütüphane çağrısı taşması Kendi döngüleriniz
ASLR Sabit adres varsayımı Adres sızıntısı
NX Veri bölgesinde kod Kod yeniden kullanımı (ROP)
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Ana kural

Her koruma bir tekniği zorlaştırır, bir hata sınıfını kaldırmaz.

Mantık hatasına hiçbiri yetmez → önce güvenli kodlama.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Demo 5 — korumaları açıp kapatmak

code/week-04/05-compiler-protections · CWE-121

  • Aynı taşma: overflow_weak (kapalı) vs overflow_hardened (açık).
  • Sert: *** stack smashing detected *** / Windows 0xC0000409.
  • Zayıf: sessiz bozulma ya da çökme.
readelf -h p | grep Type          # DYN = PIE
readelf -d p | grep BIND_NOW      # tam RELRO
readelf -s p | grep __stack_chk   # kanarya
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — yığın kanaryası

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: aynı taşma, ZAYIF sürümde kanarya yok

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Önerilen sürüm bayrakları

GCC/Clang:

-O2 -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fPIE -pie -Wl,-z,relro,-z,now -fcf-protection -Wall -Wextra -Wformat=2 -Werror=format-security

MSVC:

/O2 /GS /sdl /guard:cf /DYNAMICBASE /HIGHENTROPYVA /NXCOMPAT /CETCOMPAT /W4

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Koruma tablosu = kanıt

  • Değerlendirici her binary ve .so için koruma tablosu çıkarır.
  • Kapalı koruma bir bulgudur; gerekçesi ödünleşim kaydında olmalı.
  • Şema: uygulama, korumaların açık olduğunu kendisi de denetleyebilir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Güvenli derleme hattı (CI)

CI (Continuous Integration): her kod değişikliğinde otomatik derleme + test çalıştıran sistem.

Her hatalı adım birleştirmeyi durdurur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

CI · başarısızlık ölçütü

Aşama Başarısızlık
Derleme Tek uyarı
Sanitizer'lı test Herhangi bir rapor
Fuzzing Yeni çökme (eski corpus = regresyon)
Binary denetimi Günlük dizesi, sembol, kapalı koruma
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Dersin CMake kipleri

Kip Bayraklar
korumasiz -O0
optimize -O2
asan -O1 -fsanitize=address
denetimli -O2 -D_FORTIFY_SOURCE=2
guvenli -O2 + düzeltilmiş kaynak

Koruma bayraklarının çoğu: Demo 5 overflow_hardened.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Derleme ortamı da hedeftir

  • Erişim kaydı; bağımlılık sabitleme (5. hafta SBOM).
  • İmzalı sürüm; yeniden üretilebilir derleme.
  • Derleme makinesi ele geçerse tüm ürün etkilenir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 5 — kısa sınama

  1. Kanarya neyi durdurur, neyi durdurmaz?
  2. ASLR neden bir bilgi sızıntısıyla zayıflar?
  3. Neden "hiçbir koruma mantık hatasına yetmez"?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 5 — cevaplar

  1. Durdurur: dönüş adresini ezen ardışık yığın taşmasını (kanarya bozulur). Durdurmaz: hedefli yazma, heap taşması, bilgi sızıntısı.
  2. Tek bir sızan adres modülün taban adresini açığa çıkarır (offset sabit) → tüm rastgelelik çöker.
  3. Korumalar bellek ihlalini yakalar; yanlış yetkilendirme/iş kuralı geçerli bellek erişimidir → hiçbir koruma tetiklenmez. Doğru tasarım + inceleme gerekir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

6. Kod gizlemeye giriş

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Katman 4 · neden?

  • Beyaz kutu saldırgan: dizeleri okur, fonksiyonları adıyla bulur, denetimi atlar.
  • Gizleme: davranış aynı, anlaşılması zor.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

İki saldırgan modeli — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Gizlemenin amacı

İmkânsız kılmak değil, pahalı kılmak (Cookbook 12.1):

  • maliyet > korunan değer
  • otomasyonu zorlaştır (çeşitlendirme, 14. hafta)
  • diğer katmanlara zaman kazandır

Tek gelişmiş teknik yerine birkaç basit teknik + veri gizleme.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kısa tarihçe · kod gizleme taksonomisi

  • 1997 — Collberg, Thomborson ve Low, gizleme (obfuscation) tekniklerini sistematik bir taksonomiye ayıran çalışmalarını yayımladı: yerleşim (layout), veri (data), kontrol (control) ve önleme (preventive) dönüşümleri.
  • Bu hafta gördüğümüz dize/sembol gizleme = veri dönüşümü; kontrol akışı düzleştirme ve opak yüklem = kontrol dönüşümü.
  • Taksonomi hâlâ akademik ve endüstriyel gizleme literatürünün ortak dilidir.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Gizleme haritası

Aile Neyi gizler? Hafta
Düzen Adlar, yapı 4
Veri Sabit, dize, değişken 4, 9
Kontrol akışı Algoritma yapısı 4, 9
Önleyici Analiz aracı 9
Sanallaştırma Makine kodu 9, 14
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sahadan: native tarafta 18 önlem

Sembol görünürlüğü kapalı · ad anlamsızlaştırma · sabit aritmetik gizleme · dize şifreleme (kullanınca çöz, hemen sil) · opak boolean · kendi kütüphane fonksiyonları · sahte işlem/ölü dal · düzleştirme + rastgele çıkış · sürümde günlük yok.

➡️ Güç birliktelikten ve RASP'tan.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Üç ucuz önlem

Önlem Nasıl?
Sembolleri gizle static, -fvisibility=hidden, strip -s
Günlüğü kaldır Makroyu derlemede boşalt
Dizeleri gizle Derlemede şifrele, kullanınca çöz, hemen sil
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Günlük makrosu

#ifdef LOG_ENABLED
#  define LOG(...) fprintf(stderr, __VA_ARGS__)
#else
#  define LOG(...) ((void)0)   /* neither the string nor the call end up in the binary */
#endif

Sürümde LOG_ENABLED tanımlı değil → günlük hiç derlenmez.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

⚠️ Çalışma anı bayrağı yetmez

if (debug_flag) printf("...");  /* BAD */
  • Dize binary dosyada kalır.
  • Saldırgan bayrağı değiştirip günlüğü yeniden açar.
  • Doğrusu: derleme anında çıkar.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

⚠️ Dize gizleme ≠ anahtar saklama

  • Çözülen dize kullanım anında bellekte açık.
  • Çözme anahtarı programın içinde.
  • Durdurduğu: strings gibi statik taramalar.
  • Çalışırken inceleyene → RASP (6). Gerçek anahtar → whitebox (11).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Demo 6 — sembol ve dize sızıntısı

code/week-04/06-symbol-strings · CWE-200/215

Adım Ne olur?
1 secret_exposed ve secret_hidden aynı sonuç
2 strings Açıkta lisans dizesi ve [LOG]; kapalıda yok
3 nm Açıkta license_verify; kapalıda sembol yok
4 Windows: adlar PDB'de; kapalı PDB üretmez
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — dize + sembol gizleme

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: kötü anahtar seçimi (0x00)

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sembol ve dize gizleme — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kontrol akışı düzleştirme

int state = 1;
for (;;) switch (state) {
  case 1: state = 2; break;
  case 2: state = (condition ? 3 : 4); break;
  case 3: state = 5; break;
  case 4: return FAILURE;
  case 5: return SUCCESS;
}

Blokların doğal komşuluğu kaybolur; sıra yalnız durum değişkeninde.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Düzleştirme: önce/sonra — şema

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Düzleştirmeyi güçlendirenler

  • Durum değerlerini gizle (aritmetik dönüşüm)
  • Sahte/ölü bloklar (hangisi gerçek?)
  • Rastgele çıkış (hata nerede yakalandı, okunmaz)
  • Opak değerler (tek bayt çeviremez)

Tek başına şablon kısa sürede çözülür → 9. hafta derinlik.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Demo 7 — düzleştirme

code/week-04/07-flow-flattening

Adım Ne olur?
1 pin.c ve pin_flattened.c aynı sonuç (PIN sentetik)
2 objdump: düzleştirilmişte çok daha fazla dal
3 Süre: düzleştirmenin maliyeti

➡️ 14. hafta Tigress Flatten ile otomatik; 9. hafta etkinliği ölçmek.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — dağıtıcı durum makinesi

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: hepsi yanlış uzunlukta, anında ret

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — opak yüklem

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Animasyon — uç durum: INT sınırlarına yakın değerler

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Kavram: 9. haftaya bağlanan üç teknik

  • Fonksiyon adı gizleme: dışa açık adlar anlamsız; okunabilirlik makroyla.
  • Bellek ayırma gizleme: "32 bayt = anahtar" izini bulanıklaştır.
  • Dinamik şifreleme: hassas kod binary'de şifreli; DEP/NX ile çatışır, seçici.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 6 — kısa sınama

  1. Gizleme hatayı düzeltir mi?
  2. Günlüğü çalışma anı bayrağıyla susturmak neden yetmez?
  3. Düzleştirmeyi güçlendiren üç teknik?
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bölüm 6 — cevaplar

  1. Hayır. Gizleme yalnız tersine mühendisliği zorlaştırır; açık yerinde durur. Önce düzelt, sonra gizle.
  2. Dize/kod binary dosyada kalır; saldırgan bayrağı çevirir/dizeleri okur. Sürümde log'u derleme zamanında çıkarın (makro/ölü kod eleme).
  3. Opak yüklemler + sahte bloklar/ölü dallar + durum değişkeni şifreleme & rastgele çıkış (ayrıca ad/dize gizleme).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Uçtan uca: bir taşmayı üç katmanda kapatmak

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Hatalı kod

void greet(const char *name) {
    char buffer[16];
    strcpy(buffer, name);          /* no bound */
    printf("Hello %s\n", buffer);
}

name 16 bayttan uzunsa ne olur?

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Ne oluyor? · adım adım

  • buffer yığında 16 bayt.
  • strcpy name'ı sonuna kadar kopyalar, sınıra bakmaz.
  • 16'dan uzun name → komşu bellek (dönüş adresi dahil) bozulur.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Saldırı · sonuç

  • Kısa taşma: komşu değişken bozulur (mantık hatası).
  • Uzun taşma: dönüş adresi bozulur → çökme ya da denetim ele geçirme.
  • Korumasızsa: ciddi açık (CWE-121).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Düzeltme 1 · sınırlı kopyalama

int n = snprintf(buffer, sizeof buffer, "%s", name);
if (n < 0 || (size_t)n >= sizeof buffer) {
    /* truncated: reject or flag it */
}

snprintf boyutu bilir ve kesilmeyi bildirir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Düzeltme 2 · katmanlar

  • Kodlama: snprintf (STR31-C).
  • Derleyici: -fstack-protector-strong (kanarya).
  • FORTIFY: -D_FORTIFY_SOURCE=2 kütüphane çağrısını denetler.
  • Test: ASan uzun girdiyle taşmayı yakalar.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Ders: tek satır, çok katman

  • Bir hata: strcpy.
  • Savunma: doğru fonksiyon + derleyici koruması + sanitizer testi.
  • Ama asıl çözüm ilk satırda: sınırlı kopyalama.
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Klasik hatalar — özet

Hata Bölüm Kural
Uyarıları görmezden gelmek 1 -Werror ile hataya çevir; CERT taraması temiz olsun
Girdiyi "temizleyip" kullanmak 1 Tehlikeli girdiyi reddet; beyaz liste + red en güvenlisi
Dönüş değerini denetlememek 2–3 Her dönüşü denetle (ERR33-C); fopen/malloc NULL dönebilir
-fwrapv ile UB'yi gizlemek 2–3 Taşmayı "tanımlı" yapmak mantık hatasını gizler; UBSan ile tanı koy
Sanitizer'ı sürüme koymak 4 Yalnız test/CI'da; sürüm derlemesinde kapalı
Gizlemeyle hatayı örtmek 6 Gizleme düzeltmez, yalnız saklar; önce düzelt, sonra gizle

Altı hatanın hepsi bu destede işlendi; burada tek bakışta toparlıyoruz.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

7. Proje ve kapanış

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Proje · S9 "Kod sağlamlaştırma" — 1

  • [ ] Önerilen sürüm bayraklarıyla derle; koruma tablosunu ekle (checksec/dumpbin).
  • [ ] clang-tidy/cppcheck ile CERT taraması; ≥ 5 bulguyu düzelt (kural kimliğiyle).
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Proje · S9 — 2

  • [ ] Testleri ASan + UBSan ile çalıştır.
  • [ ] En az bir fuzz hedefi, ≥ 10 dk.
  • [ ] Sürümde günlük yok; hassas dize strings çıktısında yok.
  • [ ] Her dönüş değeri denetli (ERR33-C); -Werror ile derleniyor.

Önlem kartı: Açıklama → Uygulama → Doğrulama → Kalan risk.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Çözümlü kendini sınama

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 1

Üç katmandan hangisi hatayı gerçekten kaldırır?

Cevap: Yalnız güvenli kodlama (katman 2). Derleyici/OS korumaları istismarı zorlaştırır; gizleme okumayı yavaşlatır — ikisi de hatayı kaldırmaz.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 2

printf(girdi)'nin en hafif sonucu nedir?

Cevap: Bilgi sızıntısı (%x/%p ile yığın okuma). En ağırı %n ile belleğe yazma.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 3

UAF raporundaki üç yığın izi? Düzeltme hangisinde?

Cevap: Kullanım, serbest bırakma, ayırma. Düzeltme çoğunlukla serbest bırakma noktasında (sahiplik kararı).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 4

if (x + 100 < x) neden silinebilir?

Cevap: İşaretli tamsayı taşması tanımsız davranıştır; derleyici "taşma olmaz" varsayıp denetimi optimize edip silebilir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 5

Sinyal işleyicide neden printf yok?

Cevap: printf/malloc eşzamansız-güvenli değildir; işleyici bunları kesintiye uğramış bir durumda çağırırsa bozulma olur. Yalnız bir bayrak set edilir (SIG30-C).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 6

ASan hangi taşmayı göremez?

Cevap: Aynı yapının içinde alandan alana taşmayı (aralarında koruma bölgesi yoktur).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 7

İyi bir fuzz hedefinin dört özelliği?

Cevap: Hızlı, deterministik, durumsuz, tek iş.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 8

Kanarya neyi durdurur, neyi durdurmaz?

Cevap: Durdurur: dönüş adresine ulaşan yığın taşması. Durdurmaz: öbek taşması, önceki değişkenlerin bozulması, sızan kanarya.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 9

ASLR neden bir bilgi sızıntısıyla zayıflar?

Cevap: Bir adres sızarsa, saldırgan diğer adresleri ona göre hesaplayabilir; rastgelelik avantajı kaybolur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 10

Günlüğü çalışma anı bayrağıyla susturmak neden yetmez?

Cevap: Dize binary dosyada kalır ve saldırgan bayrağı değiştirip günlüğü yeniden açabilir. Derleme anında çıkarılmalı.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 11

Düzleştirmeyi güçlendiren üç teknik?

Cevap: Durum değerlerini gizleme, sahte/ölü bloklar, rastgele çıkış noktası (ve opak değerler).

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Soru 12

Dize gizleme neden anahtar saklama değildir?

Cevap: Çözülen dize kullanımda bellekte açıktır ve çözme anahtarı programın içindedir; yalnız statik taramayı durdurur.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Özet: bu haftanın tek cümlesi

Önce hatasız kod (CERT + sanitizer + fuzzing), sonra zararı sınırla (derleyici/OS korumaları), en son okumayı zorlaştır (gizleme) — ve hiçbir koruma güvenli kodlamanın yerini tutmaz.

Güvenli kod bir kez yazılmaz; her derlemede araçlarla denetlenir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Sözlük

Terim Anlam
UB Tanımsız davranış
UAF Serbest bırakıldıktan sonra kullanma (use-after-free)
CERT/CWE Kural kitabı / zayıflık kataloğu
Sanitizer Çalışma anı hata dedektörü
Fuzzing Rastgele girdiyle çökme arama
Kanarya/ASLR/NX Derleyici/OS korumaları
RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz
CEN429 Güvenli Programlama · Hafta 4

Bir sonraki hafta

5. hafta — Java ve yorumlanan diller

Bu hafta C/C++'ta elle yönetilen bellek ile derleyici/OS korumalarıyla uğraştık; 5. hafta JVM'in bu hataların (taşma, UAF, UB) çoğunu nasıl ortadan kaldırdığını, ama enjeksiyon (SQL, komut, yol) gibi yeni bir hata sınıfını nasıl açtığını gösterir.

SEI CERT Java kuralları bugünün SEI CERT C/C++ kurallarıyla karşılaştırılacak; ayrıca ProGuard/R8 ile gizleme, bağımlılık güvenliği ve SBOM işlenecek.

Hazırlık: JDK 17+, Maven · code/week-05.

Önce doğru kod, sonra koruma, en son gizleme. Sıra önemlidir.

RTEÜ Bilgisayar Mühendisliği · 2026-2027 Güz

Konuşma notu: Bu hafta kodun kendisini sağlamlaştırıyoruz: önce hatasız kod, sonra hata kaçarsa zararı sınırlayan korumalar, en son okumayı zorlaştıran gizleme.

Konuşma notu: Bu hafta kodun kendisini sağlamlaştırıyoruz: önce hatasız kod, sonra hata kaçarsa zararı sınırlayan korumalar, en son okumayı zorlaştıran gizleme.

Konuşma notu: Bu hafta kodun kendisini sağlamlaştırıyoruz. Öğrenciler C'yi biliyor ama güvenlik terimlerini bilmiyor varsayıyoruz; her terimi tanımlayacağız. Demolar code/week-04 altında.

Konuşma notu: Sonra biçim dizisi açığı.

Konuşma notu: %x'in argüman konumlarını sırayla nasıl taradığını, gizli değere nerede ulaştığını canlı gösterin; seçiciden "%n olsaydı" örneğini de açın.

Konuşma notu: seçiciden "percent-n" ön ayarını açın; %n'in yalnız okumakla kalmayıp yazdığını, bu yüzden "zararsız görünen" bir belirtecin aslında bir yazma astarı (write primitive) olduğunu vurgulayın.

Konuşma notu: serbest listeye (free list) nasıl eklendiğini, bir sonraki malloc'un aynı bloğu nasıl geri verdiğini canlı gösterin; "çift serbest bırakma" örneğine de geçin.

Konuşma notu: seçiciden "double-free" ön ayarını açın; aynı işaretçinin ikinci kez free() edilmesinin, ayırıcının serbest listesini nasıl bozduğunu ve genelde yeni bir öbek taşmasına kapı açtığını canlı gösterin.

Konuşma notu: denetimsiz toplamanın sessizce sardığını, checked_add'in aynı taşmayı toplamadan önce nasıl yakaladığını canlı gösterin.

Konuşma notu: seçiciden "edge-secure" ön ayarını açın; hatalı sürümde UB'ye yol açan AYNI toplama dizisinin, checked_add ile derlenmiş sürümde toplamadan ÖNCE nasıl durdurulduğunu yan yana karşılaştırın.

Konuşma notu: Ara sonrası statik analiz, sanitizer, fuzzing.

Konuşma notu: her kaydın hangi sınırı ihlal ettiğini (ya da etmediğini) canlı gösterin; hatalı sürümde aynı girdilerin nasıl sınır dışına çıktığını vurgulayın.

Konuşma notu: seçiciden "edge-all-bad" ön ayarını açın; hiçbir kaydın geçmediğini, her birinin hangi ilkeyi (uzunluk/tür/aralık/biçim) ihlal ettiği için reddedildiğini tek tek gösterin.

Konuşma notu: her adayın kapsama yeni bir şey katıp katmadığını, çökmenin bulunduğu anda oturumun nasıl durduğunu canlı gösterin.

Konuşma notu: seçiciden "edge-immediate-crash" ön ayarını açın; bazen en değerli girdinin oturumun daha ilk adımında bulunabileceğini, bunun fuzzer'ın "şansı" değil mutasyon stratejisinin bir sonucu olduğunu vurgulayın.

Konuşma notu: Sonra derleyici ve OS korumaları.

Konuşma notu: Bunlar "hata kaçarsa zararı sınırla" katmanı. Hiçbiri hatayı kaldırmaz; istismarı zorlaştırır.

Konuşma notu: strcpy'nin buffer[64]'ü doldurup kanaryaya, sonra çerçeveye ve dönüş adresine nasıl ulaştığını canlı gösterin; sert sürümde kanaryanın yakaladığını vurgulayın.

Konuşma notu: seçiciden "weak-overflow" ön ayarını açın; SERT sürümde birazdan gördüğümüz AYNI 75 karakterlik girdinin, kanarya olmayan sürümde hiç yakalanmadan dönüş adresine kadar ilerlediğini gösterin — koruma açık olmadan CERT/sanitizer/fuzzing dışında hiçbir şeyin bunu durdurmadığını vurgulayın.

Konuşma notu: Sonra kod gizlemeye giriş.

Konuşma notu: Gizlemenin giriş katmanı. Derinlik 9 ve 14. haftada.

Konuşma notu: her baytın anahtarla nasıl XOR'landığını, nm'de görünen sembollerin açık/kapalı sürümde nasıl değiştiğini canlı gösterin.

Konuşma notu: seçiciden "edge-zero-key" ön ayarını açın; XOR anahtarı 0x00 olduğunda her baytın kendisiyle değişmeden kaldığını, yani "gizleme" adımının hiçbir şey yapmadığını canlı gösterin — anahtar seçiminin de tasarımın bir parçası olduğunu vurgulayın.

Konuşma notu: düz sürümün doğrudan if-zincirini, düzleştirilmiş sürümün her tahmin için dağıtıcıyı state=0'dan yeniden dolaştığını canlı gösterin.

Konuşma notu: seçiciden "flat-all-wrong-length" ön ayarını açın; düzleştirilmiş sürümde bile dağıtıcının önce uzunluk denetleyen durumdan geçmek ZORUNDA olduğunu, bu yüzden okumanın hâlâ zorlaştığını ama akışın anlamının değişmediğini vurgulayın.

Konuşma notu: (x*x)%4'ün hiçbir tam sayı için 2 olmadığını deneysel olarak kanıtlayın; yem dalın (decoy_branch) hiç çalışmadığını vurgulayın.

Konuşma notu: seçiciden "edge-extremes" ön ayarını açın; (x*x)%4 özdeşliğinin INT_MAX/INT_MIN gibi uç değerlerde de (işaretli taşma potansiyeline rağmen) hâlâ 2'ye asla eşit olmadığını gösterin — bu haftanın tamsayı taşması konusuyla bağlantı kurun.

Konuşma notu: Sonra proje ve çözümlü sınama.

Konuşma notu: Tek bir taşmayı hatalı koddan saldırıya, oradan düzeltmeye kadar izliyoruz; bu haftanın üç katmanının (kodlama, derleyici/OS, gizleme değil düzeltme) hepsini aynı örnekte görüyoruz. Tahtada yapılabilir.