使用gdb检查字符串

时间:2015-02-23 07:46:35

标签: assembly gdb att

我想知道如何使用gdb查看传递给函数的命令行参数。

为了测试这个,我编译了以下代码

.global main
main:
    pushl %ebp
    movl %esp, %ebp
    movl $1, %eax
    movl $0, %ebx
    int $0x80

gcc -Wall -Wextra -g -m32 args.s

调用汇编程序和链接程序。

我的系统是x86_64 ubuntu(但是为了学习我开始创建32位应用程序)。

我启动了gdb并使用

传递了2个命令行参数
start test 12345

此时我预计堆栈看起来像这样:

  • 地址参数2< - $ ebp + 20
  • 地址参数1< - $ ebp + 16
  • 程序的地址名称< - $ ebp + 12
  • argc< - $ ebp + 8
  • old eip< - $ ebp + 4
  • old ebp< - $ ebp

阅读参数计数器

(gdb) x /d $ebp+8

给出预期的输出:

0xffffd110: 3

现在我尝试检查已传递的命令行参数。我期待

x /x $ebp+16

给出内存中第一个传递参数的第一个字符的地址。输出是:

0xffffd118: 0xb4

但是当我试图访问该区域时

(gdb) x /x 0xb4

我得到了:

0xb4:   Cannot access memory at address 0xb4

这使我得出结论,我试图访问一个与我的命令行参数存储位置不同的位置。

有人能给我一些指向命令行参数真实位置的指示吗?

1 个答案:

答案 0 :(得分:2)

C的主要功能以与Linux加载器的第一个被调用函数不同的方式获取参数。概括C中的main声明:int main(int argc, char *argv[])(如标准中所述)。 main函数将获取一个值和一个指向字符串数组的指针,即一个指向字符串的指针的指针。

铊; DR:

argc: x /d $ebp+8
argv[0]: x /s **(int)($ebp+12)
argv[1]: x /s *(*(int)($ebp+12)+4)
argv[2]: x /s *(*(int)($ebp+12)+8)