C 在给定地址gdb处找到的显示值
我正在调试gdb中的二进制文件。它是由gcc在Intel IA-32上编译的C代码。我从C 在给定地址gdb处找到的显示值,c,linux,assembly,gdb,x86,C,Linux,Assembly,Gdb,X86,我正在调试gdb中的二进制文件。它是由gcc在Intel IA-32上编译的C代码。我从objdump检索到这个输出。我最感兴趣的是最后一行: 08048d9e <func_1> 8048d9e: 55 push %ebp 8048d9f: 89 e5 mov %esp,%ebp 8048da1: 83 ec 18 sub $0x18,%esp
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>
并收到:
0x8048f0b <strings_not_equal>: 0x57e58955
0x8048f0b:0x57e58955
我对大会的解释有误吗?这是读取gdb中地址值的正确方法吗?我有点希望找到一个更为ascii友好的十六进制值。我感兴趣的是找到与之比较的存储字符串值
另外,您是否有最喜欢的gui工具用于此类调试?我一直在考虑尝试ddd。我想找到一种更简单的调试方法。您正在正确读取内存地址
0x8048f0b
处的值,但是call 8048f0b
行指示此地址是函数的开始(称为strings\u not_equal()
)。你不会期望它是ASCII码——你会期望它是更多的机器码
如果您正在查找字符串\u not_equal()
的函数参数,则这些参数将被推送到堆栈上。第一个参数是从0x8(%ebp)
复制的,这是func1()
的第一个参数。第二个参数是$0x8049988
,它可能是字符串的地址
如果要将地址内容打印为字符串,可以使用x/s
:
x/s 0x8049988
因此,在
阶段1
中,第一个参数:0x8(%ebp)
存储在堆栈上的%eax
。这也是传递给字符串\u not_equal
的参数?您如何知道字符串不等于的第二个参数是$0x8049988
?这是因为它被写入到0x4(%esp)
?所以x0x8049988
给出了0x8049988:0x75742049
,x/s0x8049988
给出了一个我所期望的奇怪的长字符串:0x8049988:“我把月亮变成了我喜欢称之为死星的东西。”
我们不需要2个十六进制值来表示每个ascii字符吗?它是如何将0x75742049
中的长字符串翻译过来的?@KyleWeller:func_1()
的第一个参数从0x8(%esp)
复制到%eax
,然后从%eax
复制到堆栈中,在堆栈中它将作为字符串的第一个参数被拾取0x8049988
直接复制到堆栈中,在堆栈中它将作为strings\u not_equal()
的第二个参数<不带任何格式的code>x
将地址的前4个字节显示为32位整数;这4个字节是I(0x49
)、空格(0x20
)、t(0x74
)和u(0x75
)的ASCII码。作为一个整数,读取顺序相反,因为您的机器是小端。
x/s 0x8049988