GNU Debugger ile Program Akışını İnceleme

Pentester

Özel Üye
8 Eyl 2016
1,646
996
jT3kq6.jpg


Bu konu da basit bir C programının gdb debugger ile incelemesini yapacağım. Programım “test” adında çalıştırılabilir formattadır. Bu konuyu daha iyi kavrayabilmek için register, işlemci mimarisi gibi konular hakkında bilgi sahibi olunması önemlidir. Konumuza geçelim Gdb ile programımı açtım ve main fonksiyonuna break koydum. Yani program main fonksiyonuna geçmeyecek. Run diyerek çalıştırdığımda da görüldüğü gibi main içerisinde yer alan ilk kodu işlemediğini söylüyor.
Şimdi main fonksiyonunu disassemble edip ardından rip instruction hangi adresi gösterdiğine bakacağım. Burada bir parantez açmak gerekirse kullandığım sistem 64 bit olduğu için register ismi rip olarak gözüküyor. 32 bitlik bir sistem de eip olarak, 16 bit ise ip olarak görünür. İşlemci mimarisine göre değişiklik göstermektedir. Instruction pointer, program da bir sonraki çalışacak olan adresi gösterir.


s8XwVt.jpg


Rip register bir sonraki çalışacak komutu tutuyor ve mov komutu ile aynı adresi gösteriyor. Yani bir sonraki çalışacak komut mov. Bu komutun yaptığı şey “DWORD PTR [rbp-0x4],0x0” adresine 1 tane 0 atıyor.


gbv3oi.jpg


Burada rip registerdan 1 byte değer aldığımda mov komutunu işaret ediyor. Yani bir sonraki çalışacak komut. İşaret edilen değerin de hexadecimal karşılığı görüldüğü gibi. "rbp-0x4" bu değer aslında base pointerdan sonra gelen ilk değer, yani bizim programımızda int i = 0 kodunu işaret ediyor. Şimdi bir sonraki instruction’ı çalıştıralım.


MJAkVj.jpg


Bir sonraki instruction çalışınca rip instruction bir sonraki çalışacak komutun adresini tutuyor. Main+15 işaret etmiş. Şimdi disassemble edip bir bakalım bu neymiş.

4rj4m9.jpg


İşaret ettiğim adres cmp instruction’ı gösteriyor, yani bir sonraki çalışacak yer cmp instruction. CMP, “rbp-0x8” değişkenini 4 ile karşılaştırıyor. Peki 4 ne alaka? Şimdi C programımızın kaynak koduna bakalım.


0BbN44.jpg


Bizim i değişkenine atadığımız değer 0, yani 4’den küçük. List komutu ile kaynak kodu gördüm. Burada i değişkeni 5 den küçük olacak yani cmp burada 4 olma durumuna bakıyor. Şimdi nexti deyip diğer kodumuzu işleme alalım yani karşılaştırmayı yapalım, yani i değişkenimizi karşılaştıralım ve rip’yi kontrol edelim nereyi gösteriyor.


pr5PDw.jpg


Rip, “main+19” yani jg komutunun adresini gösteriyor. Jg komutu for döngüsünün koşulunu gerçekleştirecek, çünkü i değişkenimiz for da tanımladığımız şartı sağlıyor. Nexti diyelim ve devam edelim.

EVfzHL.jpg


Şuan da rip instruction, mov komutunu işaret ediyor. Şuan döngüyü gerçekleştirdi. Daha sonra nexti diyorum ve rip nereyi gösteriyor kontrol ediyorum.

dfpheJ.jpg


Şimdi main+33 yani call komutunu gösteriyor.

3rUvee.png


Call komutu da printf yaparak ekrana yazdırma işlemini yapıyor. Program bu şekilde döngüyü devam ettiriyor.

Konumuz bu kadar, bilgisayarım da kendim için hazırlamış olduğum notumu sizlerle paylaştım. Belki çok geniş olmadı, kafanızda oturmayan şeyler de olabilir, ama buradan kendinize bazı şeyler çıkarabilirsiniz. Ayrıca youtube kanalımda çekmiş olduğum intel 8086 assembly serisi de faydalı olabilir.

[ame]https://www.youtube.com/watch?v=ivzHW4n2i98&list=PLRzqj5IrfWN6M2fJXNanxiB93CzFP4jUM[/ame]
 
Son düzenleme:
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.