0

我已经在 GDB 和 sscanf 函数内部进行了反汇编,我得到:

    at vfscanf.c:603
_IO_vsscanf (string=string@entry=0x804b760 "1 \\233 200", 
    format=format@entry=0x804a21e "%d %c %d", 
    args=args@entry=0xbffff0a8 "\304\360\377\277\277\360\377\277\300\360\377\277\224\361\377\277\310\360\377\277\201\222\004\\\351") at iovsscanf.c:47

我正在尝试获取 args 中的信息,但我不确定如何将该字符串转换为可读的内容。我真正想要得到的是 sscanf 保存到的地址。我假设这些地址在这个字符串中表示。这是我在查找字符集时得到的:

(gdb) show charset
The host character set is "auto; currently ANSI_X3.4-1968".
The target character set is "auto; currently ANSI_X3.4-1968".
The target wide character set is "auto; currently UTF-32".

我正在使用 Linux,IA-32。

4

2 回答 2

0

args可能是一个va_list(或一个_IO_va_list?)。它是一种不透明的类型,因此让 gcc 告诉您其中的内容可能是一个技巧。您可能可以调用它的访问器来找出 args 是什么。

于 2012-10-10T03:53:56.177 回答
0
echo $'\304\360\377\277\277\360\377\277\300\360\377\277\224\361\377\277\310\360\377\277\201\222\004\\\351'|od -t x4  

0000000 bffff0c4 bffff0bf bffff0c0 bffff194
0000020 bffff0c8 5c049281 00000ae9
0000032

然后您可以通过以下方式检查内容:

print *(int*)(0xbffff0c4)

或使用 gdb 的内部 printf 命令

printf "%s\n", 0xbffff0bf

甚至通过在调试下的程序中调用 printf(如果已链接)

call printf("%8.3f\n",*(float*)(0xbffff194))

同样,直接使用字符串(我将使用 argv[0]):

print argv[0]
"/home/asu..."
// assuming "/hom" was a proper address...
print **(int**)(argv[0]+0)
// assuming "e/as" was a proper address...
print **(int**)(argv[0]+4)
于 2012-10-10T03:59:05.457 回答