如何用GDB拆卸内存范围?

Pat*_*ick 58 gdb disassembly

我正在尝试反汇编程序以查看系统调用汇编指令(我相信INT指令)和GDB处理程序,并编写了一个程序(见下文),用于打开和关闭文件.

我能够跟随调用与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;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*der 97

是的,反汇编不是这里使用的最佳命令.你想要的命令是"x/i"(检查指令):

(gdb) x/i 0xdeadbeef
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用:"(gdb)x/<number> i 0xaddress"打印指令ex <(gdb)x/10i 0xaddress"<打印10指令 (4认同)
  • 谢谢!添加此文本以帮助其他人找到此提示:这是用于反汇编二进制blob,反汇编ROM,检查二进制映像文件中的指令等的指令.编写一个小C程序将fread()二进制blob写入缓冲区.然后在缓冲区上执行'x/i'. (3认同)
  • 您可以使用:x/i $ pc来获取pc的指令,这是当前指令的地址 (2认同)

non*_*ont 45

你只想拆卸你的实际主力?如果是这样试试这个:

(gdb) info line main 
(gdb) disas STARTADDRESS ENDADDRESS
Run Code Online (Sandbox Code Playgroud)

像这样:

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.
Run Code Online (Sandbox Code Playgroud)

但是我没有看到你的系统中断调用.(自从我上次尝试在汇编中进行系统调用以来已经有一段时间了.虽然INT 21h,但最后我还记得

  • 注意:至少在版本gdb 7.7中的`disas 0x401050 0x401075`语法将不起作用.你宁愿把它写成`disas 0x401050,0x401075`.也许你可能想要添加前缀«/ m»来显示源代码:`disas\m 0x401050,0x401075` (5认同)

Fal*_*ina 30

这不是你问题的直接答案,但由于你似乎只是想反汇编二进制文件,也许你可以使用objdump:

objdump -d program
Run Code Online (Sandbox Code Playgroud)

这应该给你它的反汇编.-S如果您想要源注释,可以添加.


小智 7

fopen()是一个C库函数,因此您不会在代码中看到任何系统调用指令,只是常规函数调用.在某些时候,它确实调用open(2),但它通过蹦床实现.只需跳转到VDSO页面,该页面由内核提供给每个进程.然后,VDSO提供用于进行系统调用的代码.在现代处理器上,将使用SYSCALL或SYSENTER指令,但您也可以在x86处理器上使用INT 80h.


小智 6

您可以通过添加-S开关强制gcc直接输出到汇编代码

gcc -S hello.c
Run Code Online (Sandbox Code Playgroud)