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.
- 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:
- Ölçek: binlerce satır veri, milyonlarca olasılık.
- Tekrar: aynı işlem art arda 100 kez yapılır.
- Süre: sunucu "5 saniyede cevapla" der; insan yetişemez, program yetişir.
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:
- Toplama/sayma: bir listedeki değerleri topla, say, filtrele.
- Metin işleme: bir kurala uyan satırları ayıkla, karakterleri değiştir, bir örüntü ara.
- Matematik/algoritma: asal sayılar, Fibonacci, en kısa yol, faktöriyel gibi klasikler.
- 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ı
- Önce küçük test et: tüm girdiyle uğraşmadan önce 2-3 satırlık bir örnekle kodunun doğru çalıştığını gör.
- Ara adımları yazdır: takıldığında
print()ile değişkenlerin içine bak; hatanın nerede olduğunu böyle bulursun. - Tip hatalarına dikkat: metin mi sayı mı olduğunu her zaman kontrol et.
- Kütüphaneleri tanı: Python'un
collections,itertools,remodülleri çok işini kolaylaştırır.
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ı →