使用 gdb 检查字符串
Examining strings using gdb
我想知道如何使用 gdb 查看传递给函数的命令行参数。
为了测试这一点,我编译了以下代码
.global main
main:
pushl %ebp
movl %esp, %ebp
movl , %eax
movl [=10=], %ebx
int [=10=]x80
和
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
这让我得出结论,我试图访问一个与我的命令行参数存储位置不同的位置。
任何人都可以告诉我命令行参数的真实位置吗?
C 的主函数获取参数的方式与 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)
我想知道如何使用 gdb 查看传递给函数的命令行参数。
为了测试这一点,我编译了以下代码
.global main
main:
pushl %ebp
movl %esp, %ebp
movl , %eax
movl [=10=], %ebx
int [=10=]x80
和
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
这让我得出结论,我试图访问一个与我的命令行参数存储位置不同的位置。
任何人都可以告诉我命令行参数的真实位置吗?
C 的主函数获取参数的方式与 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)