1. ホーム
  2. gdb

[解決済み] GDBでメモリ範囲をディスアセンブルする方法は?

2022-03-13 05:09:44

質問

あるプログラムをディスアセンブルして、GDBでシステムコールアセンブリ命令(INT命令だと思います)とハンドラを見ようとしているのですが、そのためにファイルを開いたり閉じたりする小さなプログラム(下記参照)を書きました。

fopenの呼び出しが実行されるまで、GDBで追うことができました。

GDBに "ディスアセンブル 0x..."(呼び出しのアドレス)を伝えようとすると、「指定したアドレスを含む関数がありません」と応答されました。

そのメモリアドレスをGDBに強制的にディスアセンブルさせる(もしくは可能な限りアセンブラで表示させる)ことは可能でしょうか?もしそうなら、どのように?

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE* f;
    f = fopen("main.c", "r");
    if (!f) { 
      perror("open");
      return -1;
    }
    fclose(f);
    return 0;
}

解決方法は?

実際のメインの分解だけでいいのですか?それなら、こうしてみてください。

(gdb) info line main 
(gdb) disas STARTADDRESS ENDADDRESS

こんな感じで。

USER@MACHINE /cygdrive/c/prog/dsa
$ gcc-3.exe -g main.c

USER@MACHINE /cygdrive/c/prog/dsa
$ gdb a.exe
GNU gdb 6.8.0.20080328-cvs (cygwin-special)
...
(gdb) info line main
Line 3 of "main.c" starts at address 0x401050 <main> and ends at 0x401075 <main+
(gdb) disas 0x401050 0x401075
Dump of assembler code from 0x401050 to 0x401075:
0x00401050 <main+0>:    push   %ebp
0x00401051 <main+1>:    mov    %esp,%ebp
0x00401053 <main+3>:    sub    $0x18,%esp
0x00401056 <main+6>:    and    $0xfffffff0,%esp
0x00401059 <main+9>:    mov    $0x0,%eax
0x0040105e <main+14>:   add    $0xf,%eax
0x00401061 <main+17>:   add    $0xf,%eax
0x00401064 <main+20>:   shr    $0x4,%eax
0x00401067 <main+23>:   shl    $0x4,%eax
0x0040106a <main+26>:   mov    %eax,-0xc(%ebp)
0x0040106d <main+29>:   mov    -0xc(%ebp),%eax
0x00401070 <main+32>:   call   0x4010c4 <_alloca>
End of assembler dump.

しかし、システム割り込みの呼び出しが見当たりません。(最後にアセンブリでシステムコールを作ろうとしたのは、しばらく前です。INT 21hだったかな?