- 8 Eyl 2016
- 1,646
- 999
Merhaba, basitçe GDB yani gnu debugger aracımızı kullanarak basit bir program üzerinden Instruction Pointer üzerinde çeşitli gösterimleri inceleyelim.
Gdb debugger’ı çalıştırıp intel mimarisi ile inceleme yapacağımı tanımladım. echo "set disassembly-flavor intel" > ~/.gdbinit komutu ile intel mimarisinin kalıcılığını sağladım.
Öncelikle main’i disassemble edip içerisindeki instructionları gördüm. Main’e break attım maine gelene kadar çalışacak. Mainden sonrasını işlemeyecek.
Programı çalıştırıp rip register’ını gördüm. Movl instruction ile aynı adresi gösteriyor.
GÖSTERİMLER
o/ octal gösterim
x/ hexadecimal 0-9 A-F 16lık taban
u/ onluk taban
t/ binary
Bu komut ile rip registerımızın hexadecimal adresinin karşılığını görüyoruz. Yani “x” komutu hexadecimal olarak adresi gösterir. Burada yazdığım 0x555… şeklinde olan adres $rip registerını işaret eden adres. “X $rip” komutu kısaca aynı işlevi görür.
“x/o” rip’yi octal gösterimde adres değerini veriyor.
Onluk tabanda gösterir.
Son olarak da binary gösterim.
1 byte 8 bit 1byte = 256
F4 = 1 byte
/b single byte 1 byte
/h halfword, 2bytes, WORD
/w WORD, 4 bytes, DWORD
Şimdi biraz da byte gösterimlerini örnek programımız üzerinden inceleyelim.
Gdb debugger üzerinde çalıştırdığımız programda rip instruction da 1 byte’lık bir değer görelim. Burada "c7" 1 byte değere tekabül ediyor. Hexadecimal 16’lık tabanda 0-9 A-F arası toplamda 16 karakter olduğunu biliyoruz. O yüzden 00, c7 gibi değerler birer byte demek oluyor.
“c7” 1 byte değerdir.
Şimdi rip instructiondan 4 tane birer byte değer getirelim.
C7, 45, fc, 00 her biri birer byte. Bir de DWORD(Double Word) yani 4 byte getirelim.
00, fc, 45, c7 birer byte toplamda 4 byte değer gösterilmiş oluyor. Bir önceki komutta fark ederseniz ayrı ayrı aldığımız 4 tane 1 bytelık değeri bir bütün olarak aldık. Konumuz bu kadar. Okuduğunuz için teşekkür ederim.
Gdb debugger’ı çalıştırıp intel mimarisi ile inceleme yapacağımı tanımladım. echo "set disassembly-flavor intel" > ~/.gdbinit komutu ile intel mimarisinin kalıcılığını sağladım.
Öncelikle main’i disassemble edip içerisindeki instructionları gördüm. Main’e break attım maine gelene kadar çalışacak. Mainden sonrasını işlemeyecek.
Programı çalıştırıp rip register’ını gördüm. Movl instruction ile aynı adresi gösteriyor.
GÖSTERİMLER
o/ octal gösterim
x/ hexadecimal 0-9 A-F 16lık taban
u/ onluk taban
t/ binary
Bu komut ile rip registerımızın hexadecimal adresinin karşılığını görüyoruz. Yani “x” komutu hexadecimal olarak adresi gösterir. Burada yazdığım 0x555… şeklinde olan adres $rip registerını işaret eden adres. “X $rip” komutu kısaca aynı işlevi görür.
“x/o” rip’yi octal gösterimde adres değerini veriyor.
Onluk tabanda gösterir.
Son olarak da binary gösterim.
1 byte 8 bit 1byte = 256
F4 = 1 byte
/b single byte 1 byte
/h halfword, 2bytes, WORD
/w WORD, 4 bytes, DWORD
Şimdi biraz da byte gösterimlerini örnek programımız üzerinden inceleyelim.
Gdb debugger üzerinde çalıştırdığımız programda rip instruction da 1 byte’lık bir değer görelim. Burada "c7" 1 byte değere tekabül ediyor. Hexadecimal 16’lık tabanda 0-9 A-F arası toplamda 16 karakter olduğunu biliyoruz. O yüzden 00, c7 gibi değerler birer byte demek oluyor.
“c7” 1 byte değerdir.
Şimdi rip instructiondan 4 tane birer byte değer getirelim.
C7, 45, fc, 00 her biri birer byte. Bir de DWORD(Double Word) yani 4 byte getirelim.
00, fc, 45, c7 birer byte toplamda 4 byte değer gösterilmiş oluyor. Bir önceki komutta fark ederseniz ayrı ayrı aldığımız 4 tane 1 bytelık değeri bir bütün olarak aldık. Konumuz bu kadar. Okuduğunuz için teşekkür ederim.