Отсутствует информация о фреймах стека высокого уровня, использующих gdb с pygdbmi - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь автоматизировать задачу определения строки кода, вызвавшей сбой.У меня есть вывод из AFL, который вызовет простой уязвимый сбой программы, и я хотел бы запустить его с GDB, чтобы найти строку сбоя, через скрипт.

Я использую pygdbmi который основан на интерфейсе GDB / MI.Я могу запустить приложение с аварийным вводом и визуализировать часть трассировки стека, но не последние несколько кадров (включая место в исходном коде приложения, где оно аварийно завершилось).Однако я могу легко получить всю трассировку стека, если я обычно запускаю gdb из командной строки.

Что я получаю с обычным GDB (который включает в себя кадр № 5 в main.c):

(gdb) r < out_inputs/crashes/id:000000,sig:06,src:000003,op:havoc,rep:16
Starting program: ~/projects/project_fuzz/afl-training/quickstart/vulnerable < out_inputs/crashes/id:000000,sig:06,src:000003,op:havoc,rep:16
*** stack smashing detected ***: <unknown> terminated

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff7a24801 in __GI_abort () at abort.c:79
#2  0x00007ffff7a6d897 in __libc_message (action=action@entry=do_abort, 
    fmt=fmt@entry=0x7ffff7b9a988 "*** %s ***: %s terminated\n") at ../sysdeps/posix/libc_fatal.c:181
#3  0x00007ffff7b18cd1 in __GI___fortify_fail_abort (need_backtrace=need_backtrace@entry=false, 
    msg=msg@entry=0x7ffff7b9a966 "stack smashing detected") at fortify_fail.c:33


#4  0x00007ffff7b18c92 in __stack_chk_fail () at stack_chk_fail.c:29
#5  0x00000000004011a1 in main (argc=<optimized out>, argv=<optimized out>) at vulnerable.c:44
(gdb) 

Что я получаю с pygdbmi (где я не могу получить информацию о кадре № 5):

writing: backtrace
{'message': None, 'payload': 'backtrace\\n', 'stream': 'stdout', 'type': 'log'}
{'message': None,
 'payload': '#0  __GI_raise (sig=sig@entry=6) at '
            '../sysdeps/unix/sysv/linux/raise.c:51\\n',
 'stream': 'stdout',
 'type': 'console'}
{'message': None,
 'payload': '#1  0x00007ffff7a24801 in __GI_abort () at abort.c:79\\n',
 'stream': 'stdout',
 'type': 'console'}
{'message': None,
 'payload': '#2  0x00007ffff7a6d897 in __libc_message '
            '(action=action@entry=do_abort, fmt=fmt@entry=0x7ffff7b9a988 '
            '\\"*** %s ***: %s terminated\\\\n\\") at '
            '../sysdeps/posix/libc_fatal.c:181\\n',
 'stream': 'stdout',
 'type': 'console'}
{'message': None,
 'payload': '#3  0x00007ffff7b18cd1 in __GI___fortify_fail_abort '
            '(need_backtrace=need_backtrace@entry=false, '
            'msg=msg@entry=0x7ffff7b9a966 \\"stack smashing detected\\") at '
            'fortify_fail.c:33\\n',
 'stream': 'stdout',
 'type': 'console'}
{'message': None,
 'payload': '#4  0x00007ffff7b18c92 in __stack_chk_fail () at '
            'stack_chk_fail.c:29\\n',
 'stream': 'stdout',
 'type': 'console'}
{'message': None,
 'payload': '#5  0x00000000004011a1 in ?? ()\\n',
 'stream': 'stdout',
 'type': 'console'}
{'message': None,
 'payload': '#6  0x64436d7364616568 in ?? ()\\n',
 'stream': 'stdout',
 'type': 'console'}
{'message': None,
 'payload': '#7  0x0000000000000000 in ?? ()\\n',
 'stream': 'stdout',
 'type': 'console'}
{'message': 'done',
 'payload': None,
 'stream': 'stdout',
 'token': None,
 'type': 'result'}
[{'message': None,
  'payload': 'backtrace\\n',
  'stream': 'stdout',
  'type': 'log'},
 {'message': None,
  'payload': '#0  __GI_raise (sig=sig@entry=6) at '
             '../sysdeps/unix/sysv/linux/raise.c:51\\n',
  'stream': 'stdout',
  'type': 'console'},
 {'message': None,
  'payload': '#1  0x00007ffff7a24801 in __GI_abort () at abort.c:79\\n',
  'stream': 'stdout',
  'type': 'console'},
 {'message': None,
  'payload': '#2  0x00007ffff7a6d897 in __libc_message '
             '(action=action@entry=do_abort, fmt=fmt@entry=0x7ffff7b9a988 '
             '\\"*** %s ***: %s terminated\\\\n\\") at '
             '../sysdeps/posix/libc_fatal.c:181\\n',
  'stream': 'stdout',
  'type': 'console'},
 {'message': None,
  'payload': '#3  0x00007ffff7b18cd1 in __GI___fortify_fail_abort '
             '(need_backtrace=need_backtrace@entry=false, '
             'msg=msg@entry=0x7ffff7b9a966 \\"stack smashing detected\\") at '
             'fortify_fail.c:33\\n',
  'stream': 'stdout',
  'type': 'console'},
 {'message': None,
  'payload': '#4  0x00007ffff7b18c92 in __stack_chk_fail () at '
             'stack_chk_fail.c:29\\n',
  'stream': 'stdout',
  'type': 'console'},
 {'message': None,
  'payload': '#5  0x00000000004011a1 in ?? ()\\n',
  'stream': 'stdout',
  'type': 'console'},
 {'message': None,
  'payload': '#6  0x64436d7364616568 in ?? ()\\n',
  'stream': 'stdout',
  'type': 'console'},
 {'message': None,
  'payload': '#7  0x0000000000000000 in ?? ()\\n',
  'stream': 'stdout',
  'type': 'console'},
 {'message': 'done',
  'payload': None,
  'stream': 'stdout',
  'token': None,
  'type': 'result'}]

Мой очень простой скрипт на python:

from pygdbmi.gdbcontroller import GdbController
from pprint import pprint

gdbmi = GdbController()
print(gdbmi.get_subprocess_cmd())

gdbmi.write('-file-exec-file ./vulnerable')

gdbmi.write('-exec-arguments < ~/projects/project_fuzz/afl-training/quickstart/out_inputs/crashes/id:000000,sig:06,src:000003,op:havoc,rep:16')

gdbmi.write('show args')

gdbmi.write('-exec-run')

response = gdbmi.write('backtrace', verbose=True)
pprint(response)
...