Почему при вводе точки останова для функции put () GDB не позволяет мне вводить данные? - PullRequest
0 голосов
/ 20 июня 2019

Мне нужно ввести пользовательский ввод, так как я исследую потенциальную уязвимость переполнения буфера.Я установил точку останова, и программа запрашивает ввод пользователя, однако 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 - мой вопрос: почемуэто вызывает проблему?

1 Ответ

0 голосов
/ 20 июня 2019

puts не запрашивает ввод пользователя.Производит вывод.

...