使用gdb检查字符串

最大1

我想知道如何使用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

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

谁能给我一些指向命令行参数真实位置的指针?

kh

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

Tl; 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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用枚举检查字符串

来自分类Dev

检查字符串中使用的特定字符吗?

来自分类Dev

使用指针时检查字符串中的字符

来自分类Dev

检查字符串中字符使用次数的函数

来自分类Dev

Java:使用BufferedReader检查字符串中的更改

来自分类Dev

检查字符串是否是回文(使用方法)

来自分类Dev

如何使用grep检查字符串长度?

来自分类Dev

使用Java检查字符串中的邻居

来自分类Dev

使用Regexp检查字符串是否以辅音开头

来自分类Dev

使用sscanf检查字符串格式

来自分类Dev

使用egrep检查字符串的长度

来自分类Dev

检查字符串包含使用Coldfusion的列表元素

来自分类Dev

使用isEmpty()检查字符串是否为null

来自分类Dev

使用变量检查字符串格式

来自分类Dev

使用 golang 检查字符串中存在的点数

来自分类Dev

检查字符串中的字符

来自分类Dev

检查字符串中的字符

来自分类Dev

如何检查字符串或数字

来自分类Dev

检查字符串格式

来自分类Dev

检查字符串是否是回文

来自分类Dev

尝试/除外检查字符串

来自分类Dev

检查字符串中的辅音

来自分类Dev

检查字符串和对象

来自分类Dev

检查字符串的更好方法?

来自分类Dev

检查字符串的格式/内容

来自分类Dev

C ++:检查字符串的内容

来自分类Dev

检查字符串用户输入

来自分类Dev

检查字符串的结尾

来自分类Dev

检查字符串的格式