如何在gdb中读取文件

时间:2014-01-11 11:44:05

标签: gdb reverse-engineering

当程序从文件中读取时,这在GDB中是怎样的。我知道该文件已被打开等。

也是这样的:

call fopen
...
call fread
...
call fclose

但你能解释一下“从文件到程序存储器的复制字节”动作吗?也许有一个装配的例子。 其中寄存器是存储文件内容的文件/文件存储器的地址。 fopen返回一个句柄。我该如何追踪?

2 个答案:

答案 0 :(得分:2)

好吧,看起来你正在寻求学习装配。 Fopen返回文件的句柄。当您调用Fopen时,基本上许多其他函数的返回值将放在EAX寄存器中,但它也取决于硬件。因此,如果要跟踪文件的句柄,在ASM中调用fopen之后,应该从EAX寄存器中获取它。如果您对更多细节感兴趣,您应该查找一些教程或汇编书籍。例如Assembly Programming tutorial

答案 1 :(得分:2)

只需编写一个小C程序,您就可以轻松地自行检查:

#include <stdio.h>

int main() {
    char c;
    FILE *f = fopen("hello.txt", "r");
    c=fgetc(f);
    fclose(f);
    return 0;
}

然后使用切换到输出程序集来编译它,对于gcc:gcc -S -O0 hello.c-S告诉gcc输出程序集,-O0禁用优化程序)。 然后查看hello.s,您将看到为此代码生成的程序集:

...
subq    $16, %rsp
movl    $.LC0, %esi
movl    $.LC1, %edi
call    fopen
movq    %rax, -8(%rbp)
movq    -8(%rbp), %rax
movq    %rax, %rdi
call    fgetc
movb    %al, -9(%rbp)   <--- here a byte gets moved from a register to variable c
movq    -8(%rbp), %rax
movq    %rax, %rdi
call    fclose
...

基本上调用函数fgetsfgetc并将结果复制回变量。您可以使用编译器和您感兴趣的输入法轻松检查平台上生成的代码。

请注意,如果使用其他库进行输入,可能会有更多可能的程序集变体。

如果在编译程序时使用了优化器,那么程序集可能看起来更奇怪。