Мне нужно ввести пользовательский ввод, так как я исследую потенциальную уязвимость переполнения буфера.Я установил точку останова, и программа запрашивает ввод пользователя, однако GDB, похоже, пропускает это.Например, когда я пытаюсь ввести пользовательский ввод, GDB говорит, что это не команда.
Я использовал gdb для отладки моей программы.Я установил точку останова на адрес памяти с помощью break *0x080486a6
, однако GDB, похоже, по-прежнему пропускает это и не позволяет мне вводить пользовательский ввод.Я использовал команды step
, c
и next
, чтобы пройти через точки останова.
Я использовал disass main
, чтобы получить информацию о программе, которая показывает:
Dump of assembler code for function main:
0x0804865d <+0>: lea 0x4(%esp),%ecx
0x08048661 <+4>: and $0xfffffff0,%esp
0x08048664 <+7>: pushl -0x4(%ecx)
0x08048667 <+10>: push %ebp
0x08048668 <+11>: mov %esp,%ebp
0x0804866a <+13>: push %ecx
0x0804866b <+14>: sub $0x14,%esp
0x0804866e <+17>: mov 0x804a03c,%eax
0x08048673 <+22>: push $0x0
0x08048675 <+24>: push $0x2
0x08048677 <+26>: push $0x0
0x08048679 <+28>: push %eax
0x0804867a <+29>: call 0x8048490 <setvbuf@plt>
0x0804867f <+34>: add $0x10,%esp
0x08048682 <+37>: call 0x8048450 <getegid@plt>
0x08048687 <+42>: mov %eax,-0xc(%ebp)
0x0804868a <+45>: sub $0x4,%esp
0x0804868d <+48>: pushl -0xc(%ebp)
0x08048690 <+51>: pushl -0xc(%ebp)
0x08048693 <+54>: pushl -0xc(%ebp)
0x08048696 <+57>: call 0x80484b0 <setresgid@plt>
0x0804869b <+62>: add $0x10,%esp
0x0804869e <+65>: sub $0xc,%esp
0x080486a1 <+68>: push $0x8048810
0x080486a6 <+73>: call 0x8048460 <puts@plt>
0x080486ab <+78>: add $0x10,%esp
0x080486ae <+81>: call 0x804862f <vuln>
0x080486b3 <+86>: mov $0x0,%eax
0x080486b8 <+91>: mov -0x4(%ebp),%ecx
0x080486bb <+94>: leave
0x080486bc <+95>: lea -0x4(%ecx),%esp
Я поставил точку останова на 0x080486a6
и адреса, которые находятся до и после этой функции.Вот что показывает GDB, который не позволяет мне вводить информацию:
Breakpoint 4, 0x080486a6 in main ()
(gdb) c
Continuing.
Please enter your string:
Breakpoint 5, 0x080486ab in main ()
(gdb)
Я ожидаю, что смогу вводить данные, когда GDB попросит меня ввести строку.Фактический результат состоит в том, что он не позволяет мне сделать это и переходит к следующей команде GDB.
ОБНОВЛЕНИЕ: теперь это работает, когда я перезапускаю программу, и это прерывает функцию put, и это запрашивает пользователявход (см. пример ниже)
Breakpoint 1, 0x080486a6 in main ()
(gdb) c
Continuing.
Please enter your string:
test
Однако я все еще хочу получить ответ относительно того, почему он перепрыгнул через это в первую очередь.Если это было из-за того, что путы не позволяют пользователю вводить данные, то почему они сейчас работают?Я выяснил, что эта проблема возникает, если я ставлю точку останова непосредственно после 0x080486a6
, что означает точку останова на операнде add
по адресу памяти 0x080486ab
и точку останова по адресу памяти 0x080486a6
- мой вопрос: почемуэто вызывает проблему?