Rehber › Kategori Rehberleri
Kategori Rehberleri

Coding CTF: Algoritmayla Flag Hesaplama

Coding kategorisi, sana bir girdi verip "bunu işle, sonucu getir" diyen kategoridir. Kalem kâğıt yerine küçük bir program yazmayı öğrenince, dakikalarca uğraşacağın işi saniyede bitirirsin.

Özet
  • Coding CTF = verilen girdiyi bir programla işleyip sonucu (çoğu zaman flag'i) hesaplama.
  • Elle çözme; binlerce satırı veya soruyu ancak kod hızlı ve hatasız yapar.
  • Her çözümün iskeleti aynı: girdiyi oku → döngüyle işle → sonucu yazdır.
  • Python bu iş için en kolay başlangıç dili; birkaç satır yeter.
  • Bazı görevler sunucuya bağlanıp süre sınırı içinde cevap ister; orada otomasyon şart.

Coding CTF tam olarak nedir?

Coding (bazen "programming" ya da "scripting" denir) kategorisinde amaç bir açık bulmak değil, bir işlemi hızlı ve doğru yapmaktır. Sana bir girdi verilir: uzun bir sayı listesi, bir metin dosyası, bir kural seti ya da bir sunucunun sorduğu sorular. Sen bu girdiyi işleyecek küçük bir program yazarsın; programın ürettiği sonuç çoğu zaman doğrudan flag'in kendisidir veya flag'i almak için sunucuya geri gönderilir.

Yani buradaki soru "sistemi nasıl kırarım" değil, "bu veriyi nasıl işlerim" sorusudur. CTF'in genel mantığına yabancıysan önce CTF Nedir? yazısına göz atman iyi olur; burada doğrudan koda odaklanacağız.

Neden elle değil, kodla?

Basit bir örnek düşün: "Şu 5.000 sayının en büyük ikisinin çarpımını bul." Elle yapmaya kalksan saatler sürer, üstüne bir yerde mutlaka hata yaparsın. Aynı işi bir program üç satırda, göz açıp kapayana kadar yapar.

Coding görevleri bilerek "elle imkânsız" ölçekte tasarlanır:

Kısacası kod, senin sabrını ve dikkatini koruyup işi devralır. Coding'in güzel yanı da bu: mantığı bir kez kurunca girdi ne olursa olsun aynı çözüm çalışır.

Her çözümün aynı iskeleti: oku, işle, yazdır

Coding görevlerinin neredeyse tamamı üç adıma iner. Bu iskeleti ezberlersen, işin yarısı biter.

1) Girdiyi oku

Girdi genelde bir dosyadadır. Python'da dosyayı satır satır okumanın en temiz yolu:

with open("girdi.txt") as f:
    satirlar = f.read().splitlines()

print("Kaç satır var:", len(satirlar))

Burada splitlines() dosyayı satırlara böler ve satır sonlarını temizler. Artık satirlar bir liste; üzerinde rahatça dönebilirsin.

2) Döngüyle işle

Girdideki her parçayı tek tek gezmek için for döngüsü kullanırsın. Diyelim ki her satırda bir sayı var ve toplamını istiyoruz:

toplam = 0
for satir in satirlar:
    sayi = int(satir)   # metni sayıya çevir
    toplam = toplam + sayi

print(toplam)

Dikkat et: dosyadan gelen her şey metindir. Matematik yapacaksan int() ya da float() ile sayıya çevirmen gerekir; en sık yapılan başlangıç hatası budur.

3) Sonucu yazdır

Son adım en kolayı: print() ile sonucu ekrana bas. Çıkan değeri kopyalayıp platforma girdiğin flag'i oluşturursun (örneğin AltayCTF{...} biçiminde). Sonuç bir metinse, üzerinde küçük düzenlemeler yapman gerekebilir.

Sık karşılaşacağın görev tipleri

Coding'de kalıplar birkaç başlıkta toplanır. Hangisiyle karşılaştığını tanıman çözümün yarısıdır:

  1. Toplama/sayma: bir listedeki değerleri topla, say, filtrele.
  2. Metin işleme: bir kurala uyan satırları ayıkla, karakterleri değiştir, bir örüntü ara.
  3. Matematik/algoritma: asal sayılar, Fibonacci, en kısa yol, faktöriyel gibi klasikler.
  4. Simülasyon: verilen adımları sırayla uygula, sonunda kalan durumu bul.

Örneğin sadece çift sayıları toplamak istersen döngünün içine tek bir if eklemek yeter:

toplam = 0
for satir in satirlar:
    sayi = int(satir)
    if sayi % 2 == 0:     # 2'ye tam bölünüyorsa çift
        toplam = toplam + sayi
print(toplam)

Gördüğün gibi aynı iskeletin içine küçük bir kural ekleyerek görevi değiştiriyorsun. Bu kalıpları denemek için coding challenge'larına göz atabilir, kolaydan zora doğru ilerleyebilirsin.

Sunucuya bağlanan görevler ve süre sınırı

Bazı coding görevleri dosya vermez; bir adres verir (örneğin nc host 1337) ve sana arka arkaya sorular sorar: "12 ile 47'yi topla", sonra hemen "sonraki soru"... Onlarca soruyu birkaç saniyede cevaplaman istenir. Burada elle yazmak imkânsızdır; bağlantıyı da otomatikleştirmen gerekir.

Yeni başlıyorsan bunu ileri seviyeye bırakabilirsin, ama fikir olarak pwntools kütüphanesi bu iş için standarttır:

from pwn import remote

baglanti = remote("host", 1337)
soru = baglanti.recvline()      # sunucudan gelen satırı oku
# soruyu ayrıştır, hesapla...
baglanti.sendline(b"42")        # cevabı gönder

Mantık yine aynı: oku, işle, gönder. Sadece "yazdır" adımının yerini "sunucuya gönder" alır. Bu tür otomasyonu yalnızca yetkili olduğun eğitim ortamlarında ve CTF sunucularında kullan; başkasının sistemine izinsiz istek yağdırmak Coding çözmek değildir.

Başlarken pratik ipuçları

Coding, CTF'e yeni başlayanlar için en cesaret verici kategoridir çünkü "kıramadım" yok; kodun ya çalışır ya çalışmaz, geri bildirim anındadır. Adım adım ilerlemek istersen Rehber sayfasındaki diğer başlangıç yazılarına da göz atabilirsin. Bir görevi tek başına çözdüğünde "aa, şimdi anladım" anını yaşayacaksın; işte tam o an bu kategoriye ısınmış olacaksın.

Sıkça Sorulan Sorular

Coding CTF için hangi dili öğrenmeliyim?

Yeni başlayanlar için Python en pratik seçenektir çünkü sözdizimi sade ve dosya okuma, döngü, hesap gibi işler birkaç satırda biter. İleride C, Go ya da JavaScript de kullanabilirsin ama başlangıçta tek dile odaklanman yeterli.

Programlama hiç bilmeden coding challenge çözebilir miyim?

Temel düzeyde değişken, döngü ve koşul (if) mantığını öğrenmen gerekir; bu birkaç saatlik bir başlangıçtır. En kolay coding görevleri zaten bu üç kavramla çözülür, yani öğrenirken pratik yapabilirsin.

Sonucu buldum ama flag'i nasıl oluşturacağım?

Çoğu görevde programının ürettiği sayı ya da metin doğrudan flag'in içine yazılır (örneğin AltayCTF{sonuc} biçiminde). Görev açıklaması genelde beklenen biçimi söyler; bulduğun değeri o kalıba yerleştirip gönderirsin.

Sunucu sorularıma yetişemiyorum, ne yapmalıyım?

Süre sınırlı görevlerde soruları elle cevaplamak yerine bağlantıyı da programına yaptırman gerekir. Python'da pwntools kütüphanesi sunucudan gelen soruyu okuyup cevabı otomatik gönderir; böylece onlarca soruyu saniyeler içinde tamamlarsın.

Kodum çalışıyor ama yanlış sonuç veriyor, nasıl bulurum?

Ara adımları print() ile ekrana yazdırarak değişkenlerin içine bak; hata genelde metni sayıya çevirmeyi unutmaktan ya da bir koşulu yanlış yazmaktan gelir. Önce küçük bir örnek girdiyle test edersen sorunu daha çabuk yakalarsın.

Hadi pratiğe dök

Bu rehberdeki teknikleri Kodlama kategorisindeki gerçek challenge’larda dene.

Kodlama Challenge’ları →

Devam et