2013-10-21 20 views
5

O gdb ile bir bellek adresine int'leri veya Heksadesimalleri yazmak için oldukça basittir:gdb'de belleğe nasıl bir dize yazabilirim?

(gdb) set {int}0x08040000 = 42 
(gdb) set {int}0x08040000 = 0xffffffff 

Ama belleğe benzer basit bir şekilde karakter veya tüm dizeleri yazabilirim nasıl? Şu anda, dizeyi onaltılık heceye çevirmek ve sonra da bunu girmek zorundayım. GDB ile

int main(void){ 
    char[] person = "Bob"; 
    char[] p2 = "Alice"; 

    printf("Hello %s\n"); 
} 

ana bir kesme noktası ayarlamak ve üzeri kullanıcının adını değiştirebilir:

(gdb) set main::person = { 'S', 'a', 'm', 0x00 } 

veya daha fazla susinctly

(gdb) set main::person = "Sam" 

cevap

7

aşağıdaki program var ki

Belleği doğrudan ayarlamak isterseniz:

set {char [4]} 0x08040000 = "Ace" 

Sanırım gdb ile belleğe çalıştığınız için ne yaptığınızı biliyorsunuz, bu nedenle dizeler için boş baytların ayarlanmasını biliyorsunuzdur. Değerleri değiştirmeye çalışıyorsanız bunu unutmayın. dizi ve orijinal olarak tahsis edilmiş olandan daha uzun bir dizeye koymaya çalışırsanız, belleği bozmanız için gerçekten iyi bir şansınız olur. (Örnek ana :: kişiyi ayarlamaya çalışırken "Dilbert" sorunları

+0

Belki biz kullanmak zorunda okul için bir egzersiz için buna ihtiyaç olduğunu burada eklemek gerekir kod ve gdb sadece programın ne yaptığını bulmak için demonte edilmiş, bu yüzden kaynak kodum yok. –

+0

Paul'un cevabı daha kolay ve daha iyi olsa da, cevabımın daha doğru olduğunu söyleyebilirim. kirli işinizi yapmak için - hangi zamanın% 99'u iyidir, ama eğer strcpy işlevinin kendisini tersine çevirmeye çalışıyorsanız ne olur? Eğer bir nedenden dolayı strcpy'e erişiminiz yoksa ne olur? ne olursa olsun . – FuriousGeorge

6

Kullanım neden oluyor için strcpy()

(gdb) p malloc(20) 
$3 = (void *) 0x6ce81808 
(gdb) p strcpy($3, "my string") 
$4 = 1827149832 
(gdb) x/s $3 
0x6ce81808: "my string" 
+1

Bu güzel ve hile olmasına rağmen, strcpy bir gdb komutu değildir. Herhangi bir nedenden dolayı strcpy'ye erişiminiz olmadığında ne olur (kötü amaçlı yazılımları tersine çevirirken, bu geçerli bir varsayımdır). – FuriousGeorge

+1

strcpy komutunu gdb komutu ile yazabilirsiniz "command" –

+0

Kendi komutlarınızı tanımlayabileceğinin farkında değildim. Kendi fonksiyonunuzu yazmak için {char [4]} 0xDEADBEEF = "Sam" ifadesini ayarlamak çok daha kolay olmaz mıydı? Ayrıca, gdb'yi C/C++ (Go, ADA, derleme, vb.) 'Den daha fazla hata ayıklamak için kullanabilirsiniz, bu yüzden strcpy her zaman orada olmayacaktır. – FuriousGeorge

İlgili konular