Итак, я отлаживаю программу 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.
Итак, как мне узнать, сколько существует аргументов?И если я нашел число или символ, есть ли способ определить, какой это номер?
Спасибо!