1. ホーム
  2. c

[解決済み] テスト

2022-01-30 13:33:55

質問内容

以下は私のDISASコードです。

   0x0804844d <+0>:     push   %ebp
   0x0804844e <+1>:     mov    %esp,%ebp
   0x08048450 <+3>:     and    $0xfffffff0,%esp
   0x08048453 <+6>:     sub    $0x20,%esp
   0x08048456 <+9>:     movl   $0x8048540,(%esp)
   0x0804845d <+16>:    call   0x8048310 <puts@plt>
   0x08048462 <+21>:    lea    0x1c(%esp),%eax
   0x08048466 <+25>:    mov    %eax,0x4(%esp)
   0x0804846a <+29>:    movl   $0x8048555,(%esp)
   0x08048471 <+36>:    call   0x8048320 <scanf@plt>
   0x08048476 <+41>:    mov    0x1c(%esp),%eax
   0x0804847a <+45>:    cmp    $0x208c,%eax
   0x0804847f <+50>:    jne    0x804848f <main+66>
   0x08048481 <+52>:    movl   $0x8048558,(%esp)
   0x08048488 <+59>:    call   0x8048310 <puts@plt>
   0x0804848d <+64>:    jmp    0x804849b <main+78>
=> 0x0804848f <+66>:    movl   $0x8048569,(%esp)
   0x08048496 <+73>:    call   0x8048310 <puts@plt>
   0x0804849b <+78>:    mov    $0x0,%eax
   0x080484a0 <+83>:    leave  
   0x080484a1 <+84>:    ret 

私が調べようとしているのは、$0x208cです。x/xw 0x208c と入力すると、Cannot access memory at address 0x208c というエラーが返されます。Info registersとタイプしてeaxを見ると、私が提供した値が表示されます。基本的にこのプログラムは2つの値を比較し、それに応じて何かを出力します。問題は、これが大学からの宿題であり、私はコードを持っていないことです。あなたが助けてくれることを願っています。ありがとうございました。

どのように解決するのですか?

<ブロッククオート

と入力すると x/xw 0x208c というエラーが返されます。 Cannot access memory at address 0x208c

あなたのプログラムの逆アセンブルでは、このようなことが行われているそうです。

puts("some string");
int i;
scanf("%d", &i);  // I don't know what the actual format string is.
                  // You can find out with x/s 0x8048555
if (i == 0x208c) { ... } else { ... }

つまり 0x208c は値( 8332 )は、プログラムがハードコーディングしたものであり ない ポインタです。したがって、GDBがあなたに言うことはまったく正しいのです。 0x208c をポインタとすると、そのポインタは読み取り可能なメモリを指していないことになります。

x/xwの代わりにprintステートメントを使うことがようやくわかりました。

との違いを理解していないようですね。 printexamine コマンドを使用します。この例で考えてみましょう。

int foo = 42;
int *pfoo = &foo;

上記と一緒。 print pfoo を指定すると アドレス foo であり、かつ x pfoo を与えると の値は,そのアドレスに格納されています。 foo ).