2015-02-23 55 views
1

我想知道如何查看传递给使用gdb函数的命令行参数。使用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
  • 老EIP < - $ EBP + 4
  • 老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 

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

任何人都可以给我一些指向命令行参数的真实位置的指针吗?

回答

2

C的主函数以不同于Linux loader的第一个调用函数的方式获取参数。在C: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)