Исследование стека с использованием GDB (x86) - PullRequest
0 голосов
/ 25 января 2012

Итак, я отлаживаю программу x86, используя GDB.Я нахожусь в определенной функции с именем func1.

Я хотел бы изучить стек и посмотреть передаваемые в него аргументы.Таким образом, делая следующее:

(gdb) info frame 0
Stack frame at 0x7fffffffe1f0:
 rip = 0x400e70 in func4; saved rip 0x40115a
 called by frame at 0x7fffffffe210
 Arglist at 0x7fffffffe1e0, args: 
 Locals at 0x7fffffffe1e0, Previous frame's sp is 0x7fffffffe1f0
 Saved registers:
  rip at 0x7fffffffe1e8

Я знаю, что аргументы в 0x7fffffffe1e0.Делая:

(gdb) x/8x 0x7fffffffe1e0
0x7fffffffe1e0: 0x08    0xe3    0xff    0xff    0xff    0x7f    0x00    0x00

Так почему этот адрес содержит все эти шестнадцатеричные числа?Кто они такие?Кроме того, как я узнаю, сколько аргументов?Выполнение локальных или информационных аргументов говорит, что таблица символов не загружена.

Кроме того, я знаю, что первый аргумент будет в 0x7fffffffe1e0 + 0x8, а второй в 0x7fffffffe1e0 + 0xc и т. Д. Но как я узнаю, сколькоесть аргументы?

Делая:

(gdb) x 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 0x5a
(gdb) x/d 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 90
(gdb) x/c 0x7fffffffe1e0 + 0x8
0x7fffffffe1e8: 90 'Z'

Я знаю, что первый аргумент - это Z или 90. Есть ли способ выяснить, какой это аргумент?

И, выполнив

(gdb) x 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4: -1 '\377'
(gdb) x/s 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4:  "\377\177"
(gdb) x/d 0x7fffffffe1e8 + 0xc
0x7fffffffe1f4: -1

, я знаю, что вторым аргументом может быть -1.

Выполнение

(gdb) x 0x7fffffffe1e8 + 0x10
0x7fffffffe1f8: 10

Я знаю, что третий аргумент "мог" быть 10.

Итак, как мне узнать, сколько существует аргументов?И если я нашел число или символ, есть ли способ определить, какой это номер?

Спасибо!

1 Ответ

3 голосов
/ 25 января 2012

Я хотел бы изучить стек и посмотреть передаваемые в него аргументы.

Вы, очевидно, находитесь на платформе x86_64.

Вы должны изучить используемое соглашение о вызовах. В частности, обратите внимание, что аргументы функции не передаются в стеке (кроме случаев, когда их более 6), поэтому ваш вопрос начинается с неверного предположения.

Вы не можете проверить стек, чтобы увидеть аргументы, поскольку их там нет с самого начала.

...