Я пытаюсь автоматизировать задачу определения строки кода, вызвавшей сбой.У меня есть вывод из 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)