CTF Çözümleri
Phemis's notes
Last updated
Was this helpful?
Phemis's notes
Last updated
Was this helpful?
CTF çözümüne geçmeden önce rev100 binary dosyamıza execute Permission'u verelim.
file ./rev100
komudu ile bilgi toplayalım ;
file komudu bize dosyanın 32-bit bir pie executable olduğunu söyledi..
Dosyamızı gdb üzerinde başlatabilmek için ;
gdb ./rev100
komudunu girelim.
br main
Komudu ile programımızın başlangıç yerine breakpoint koyalım.
run
Komudu ile çalıştıralım.
Programımızı çalıştırdıktan sonra gördüğümüz gibi program birinci Breakpoint'e gelmiş oldu. (Zaten bir tane koymuştuk ama sayısını gösterme amaçlı (: )
disassemble main
Komudu ile main'i disassemble edelim yani Assembly kodlarına ulaşalım.
Burada işimize yarar bir şey olmadığından dolayı c ' ye basıp enterladıktan sonra asıl yere gelelim :)
Evet , c ' ye bir kere basıp enterladıktan sonra Assembly kodlarımızın sonuna ulaştığımızın bilgisini bize veriyor. Bizim amacımızda zaten buraya ulaşmaktı :)
En başta gördüğümüz cmp komutu ne işe yarıyor bakalım ;
CMP bir karşılaştırma komutudur deger1 ile deger2 ' yi karşılaştırır.
cmp $0x58f , %eax
Kodu 0x58f ile eax'daki değerin karşılaştırıldığını söylüyor. Karşılaştırdıktan sonra JNE ile atlama yapıyor. JNE : Jump If Not Equal (Eşit değil ise atla)
0x58f buradaki anahtar değerimiz.
GDB üzerinde p 0x58f
kodunu uygularsak bize hexadecimal to decimal halini gösterecektir ; (16'lık tabandan 10'luk tabana geçiş)
Evet anahtarımızın 1423 olduğunu gördük.
CTF çözümüne geçmeden önce rev100 binary dosyamıza execute Permission'u verelim.
Radare2 ' yi debugging modunda başlatalım :
r2 -d ./rev100
Evet başlattıktan sonra karşımıza gelen ekran bu şekilde..
aaa
Kodu ile kodlarımızı analiz ettirelim.
pdf @ main
Kodu ile programımızı disassemble edelim.
Evet yeniden cmp noktasına bakacak olursak yanında comment satırı olarak 1423 ' ün eklendiğini görüyoruz. Bunu nasıl patchleyebiliriz bakalım ;
db <Adress>
Kodunu kullanarak noktaya bir breakpoint koyalım.
dc
Kodunu kullandıktan sonra fake serial vererek devam edelim.
dr eax=0x58f
Kodunu kullanarak eax değerine 0x58f atayalım.
dc
İle devam edelim.
CTF çözümüne geçmeden önce CrackME 2 binary dosyamıza execute Permission'u verelim.
chmod +x crackme
Programımızı radare2 üzerinde debugging modunda başlatalım.
r2 -d ./crackme
aa
Komutu ile programımızı analiz ettirelim.
pdf @ main
Komutu ile programımızın main kısmındaki kodlarını disassemble edelim.
0x004006f1 adresinde JNE komutumuzu gördük hemen üstüne baktığımızda CMP ile eax ve edx ' in karşılaştırıldığını gördük (CMP = Compare). Burada yapmamız gereken şey Karşılaştırılan yere breakpoint koyarak eax'ın register value'sini değiştirmek.
db 0x004006ef
Komutu ile CMP noktasına breakpoint koyalım.
dc
Komutu ile devam ettirdikten sonra fake serial vererek enterladığımızda ;
İstediğimiz noktada durdu gördüğümüz gibi başarısız mesajı vermedi.
dr eax=edx
Komutunu girerek eax ve edx'in valuesini birbirine eşitliyoruz.
dc
Komutu ile devam ettiğimizde mutlu son :))
Programımızı x64dbg ile çalıştıralım.
Symbols kısmından parkour.exe ' ye iki kere tıklayarak içine girelim.
Sağ Tık > Search For > Current Module > String References
Diyerek String ' leri önümüze alalım.
Aslında biz orda flag'ı gördük.Ama devam edeceğiz.
Programı normal olarak başlattığınızda first stage'yi geçtiğini görüyorsunuz.
Amacımız Second stage'deki kontrol yapısını patchlemek.
00000000004015D7 Adresine Breakpoint koyalım
Programı ilerletelim.
Programı bir kere ilerlettiğimizde gördüğümüz gibi breakpoint hitledi.
Ve oynama yok..
JE kısmını JNE olarak değiştirelim.
Patch file diyerek kaydedelim.
Şimdi başlattığımızda Second Stage'yi de atlattığını göreceksiniz.
Şifre sorma ekranında da strings kısmında gördüğümüz flag doğru cevap :))
"flag{th3_cr3d3n14ls_4r3_s4f3}"
Hedef Rev Uygulaması :