Kyl*_*ler 17 c linux x86 assembly gdb
我在gdb中调试二进制文件.它是由英特尔IA-32上的gcc编译的C代码.我从中检索了这个输出objdump.我最感兴趣的是这里的最后一行:
08048d9e <func_1>
8048d9e: 55 push %ebp
8048d9f: 89 e5 mov %esp,%ebp
8048da1: 83 ec 18 sub $0x18,%esp
8048da4: c7 44 24 04 88 99 04 movl $0x8049988,0x4(%esp)
8048dab: 08
8048dac: 8b 45 08 mov 0x8(%ebp),%eax
8048daf: 89 04 24 mov %eax,(%esp)
8048db2: e8 54 01 00 00 call 8048f0b <strings_not_equal>
Run Code Online (Sandbox Code Playgroud)
我相信最后一行将比较指定地址的值:8048f0b.我尝试:
(gdb) x 0x8048f0b
Run Code Online (Sandbox Code Playgroud)
并收到:
0x8048f0b <strings_not_equal>: 0x57e58955
Run Code Online (Sandbox Code Playgroud)
我是否错误地解释了装配?这是读取gdb中地址值的正确方法吗?我有点期待找到一个更ascii友好的十六进制值.我有兴趣找到与之比较的存储字符串值.
你还有一个你喜欢用于这种调试的最喜欢的gui工具吗?我一直在考虑尝试ddd.我想找到一种更简单的调试方法.
caf*_*caf 23
您正在读取内存地址处的值0x8048f0b,但该行call 8048f0b <strings_not_equal>表示此地址是函数的开头(称为strings_not_equal()).你不会期望它是ASCII - 你希望它是更多的机器代码.
如果您正在寻找函数参数strings_not_equal(),那么这些参数将被推送到堆栈中.第一个参数是从中复制的0x8(%ebp),这是第一个参数func1().第二个参数是$0x8049988,大概是字符串的地址.
如果要将地址的内容打印为字符串,可以使用以下命令x/s:
x/s 0x8049988
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
49505 次 |
| 最近记录: |