【问题标题】:Examining strings using gdb使用 gdb 检查字符串
【发布时间】:2015-02-23 07:46:34
【问题描述】:

我想知道如何查看使用 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
  • 地址参数 1
  • 程序的地址名称
  • argc
  • 旧eip
  • 旧的 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

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

谁能告诉我命令行参数的真实位置?

【问题讨论】:

    标签: assembly gdb att


    【解决方案1】:

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

    Tl;博士:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 2021-03-12
      • 2014-11-04
      • 1970-01-01
      • 2023-03-31
      • 2013-07-22
      • 2022-01-12
      相关资源
      最近更新 更多