2013-10-21 20 views
5

gdbでのメモリアドレスへint型16進数がを書くことは非常に簡単です:gdbでは、文字列をメモリに書き込むにはどうすればよいですか?

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

しかし、私はメモリと同様に簡単な方法で文字や文字列全体を書くことができますか?今は、文字列を16進数に変換して入力する必要があります。これは時間がかかります。

答えて

7

では、次のプログラムがあるとしましょう:GDBで

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

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

あなたがメインにブレークポイントを設定し、を介して人の名前を変更することができます:

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

以上susinctly

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

メモリを直接設定したい場合:

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

gdbでメモリをポックしているので、あなたは何をしているのか分かっているので、文字列のnullバイトを設定することを知っています。あなたが最初に割り当てられたものよりも長い文字列を入れようとすると、あなたはメモリを破壊しようとする本当の良い機会になります。 (例えば、メイン設定しようとしている::人は「ディルバート」の問題

+0

を引き起こすことが起こっているためにたぶん私は、我々が使用する必要があり、学校のための運動のためにこれを必要とすることをここに追加してください逆アセンブルされたコードとgdbだけがプログラムが何であるかを知るために利用できるソースコードはありません –

+0

ポールの答えは簡単ですが、大部分はより良く、私の答えはより正しいと主張します。あなたの汚い仕事をする - 時間の99%は良いですが、strcpy関数自体を逆にしようとするとどうなりますか?何らかの理由でstrcpyにアクセスできない場合はどうすればいいですか?関係なく。 – FuriousGeorge

6

使用strcpy()

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

これは素晴らしいトリックですが、strcpyはgdbコマンドではありません。何らかの理由でstrcpyにアクセスできない場合(マルウェアを取り消す場合、これは正当な前提です)、何が起こりますか? – FuriousGeorge

+1

gdbコマンド "command"でstrcpyを書くことができます –

+0

あなた自身のコマンドを定義することはできませんでした。 set {char [4]} 0xDEADBEEF = "Sam"と言って自分の関数を書く方がずっと簡単でしょうか?また、gdbを使用してC/C++(Go、ADA、アセンブリなど)以上のデバッグを行うことができるので、strcpyは必ずしもそこに存在するとは限りません。 – FuriousGeorge

関連する問題