- 23 Eyl 2016
- 2,001
- 11
Geçen hafta katılım sağladığım BCACTF'te bir soru için debugger kullanmak gerekiyordu. Önce gdb kullanmayı düşünsem de sonra daha önceden merak saldığım fakat pek kullanım fırsatı bulmadığım radare2'yi bu soruda kullanmak istedim.
radare2 hakkında açtığım ilk konuya ulaşmak için tıklayın.
Benim bu CTF sorusunda kullandığım işlemlere geçmeden önce radare2 ile debugging işleminden biraz bahsedelim.
Öncelikle, bir programı debugging modunda açmak için radare2'yi -d seçeneği ile başlatmanız gerek. Örnek olarak:
Debbugger oturumunu başlattıktan sonra ise bu komutları kullanabilirsiniz:
Şimdi ise bu CTF'te karşıma çıkan soruya bakalım. Verilen programı çalıştırınca aşağıdaki çıktıyı veriyor:
Eğer dediği şeyi yapıyorsa, rastgele bir sayı oluşturup bu 1 ise bize flag'i verdiğini anlayabiliriz. Bunun analizi için dosyamızı debugging modunda radare2 ile açarak başlayalım: r2 -d executable-ubuntu
Önce aaa komutu ile analiz edelim ve ardından pdf @ main komutu ile main fonksiyonunu disassemble edelim.
İşaretlediğim yerde ebx ile 1'in karşılaştırıldığını görebiliyoruz. Yani buraya bir breakpoint koyup burada ebx register'ının değerini 1 yaparsak bu cmp işlemi bizim istediğimiz şekilde olacaktır. Bunun için db ile breakpoint yerleştirip, dc ile programı devap ettirip, breakpoint'e geldiğinde ise dr ebx=0x1 ile ebx'in değerini 1 yapabiliriz.
Gördüğünüz gibi, kazandığımızı söyledi.
radare2 hakkında açtığım ilk konuya ulaşmak için tıklayın.
Benim bu CTF sorusunda kullandığım işlemlere geçmeden önce radare2 ile debugging işleminden biraz bahsedelim.
Öncelikle, bir programı debugging modunda açmak için radare2'yi -d seçeneği ile başlatmanız gerek. Örnek olarak:
Kod:
r2 -d /bin/ls
Debbugger oturumunu başlattıktan sonra ise bu komutları kullanabilirsiniz:
- db flag - flag'e bir breakpoint yerleştirir, bu flag bir fonksiyon adı veya adres olabilir
- db - flag - flag'deki breakpointi kaldırır
- db - breakpointlerin listesini gösterir
- dc - programı çalıştırır
- dr - register'ların değerlerini gösterir
- ds - step into
- dso - step over
- dbt - backtrace'i gösterir (backtrace, programın o an bulunduğu yere nasıl geldiğini gösterir)
- dm - memory map'leri gösterir
- ood - dosyayı yeniden debug modunda açar
Şimdi ise bu CTF'te karşıma çıkan soruya bakalım. Verilen programı çalıştırınca aşağıdaki çıktıyı veriyor:
Kod:
$ ./executable-ubuntu
Welcome to the lottery!
So now we're going to pick a ginormous number!
If it's 1, you win!
Your number is 1804289383!
Try again next time!
Eğer dediği şeyi yapıyorsa, rastgele bir sayı oluşturup bu 1 ise bize flag'i verdiğini anlayabiliriz. Bunun analizi için dosyamızı debugging modunda radare2 ile açarak başlayalım: r2 -d executable-ubuntu
Önce aaa komutu ile analiz edelim ve ardından pdf @ main komutu ile main fonksiyonunu disassemble edelim.
İşaretlediğim yerde ebx ile 1'in karşılaştırıldığını görebiliyoruz. Yani buraya bir breakpoint koyup burada ebx register'ının değerini 1 yaparsak bu cmp işlemi bizim istediğimiz şekilde olacaktır. Bunun için db ile breakpoint yerleştirip, dc ile programı devap ettirip, breakpoint'e geldiğinde ise dr ebx=0x1 ile ebx'in değerini 1 yapabiliriz.
Gördüğünüz gibi, kazandığımızı söyledi.