You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pwndbg/tests/utils.py

53 lines
1.5 KiB
Python

import codecs
import os
import re
import subprocess
launched_locally = not (os.environ.get('PWNDBG_GITHUB_ACTIONS_TEST_RUN'))
def run_gdb_with_script(binary='', core='', pybefore=None, pyafter=None, timeout=None):
"""
Runs GDB with given commands launched before and after loading of gdbinit.py
Returns GDB output.
"""
pybefore = ([pybefore] if isinstance(pybefore, str) else pybefore) or []
pyafter = ([pyafter] if isinstance(pyafter, str) else pyafter) or []
command = ['gdb', '--silent', '--nx', '--nh']
for cmd in pybefore:
command += ['--eval-command', cmd]
command += ['--command', 'gdbinit.py']
if binary:
command += [binary]
if core:
command += ['--core', core]
for cmd in pyafter:
command += ['--eval-command', cmd]
command += ['--eval-command', 'quit']
print("Launching command: %s" % command)
output = subprocess.check_output(command, stderr=subprocess.STDOUT, timeout=timeout)
# Python 3 returns bytes-like object so lets have it consistent
output = codecs.decode(output, 'utf8')
# The pwndbg banner shows number of loaded commands, it might differ between
# testing environments, so lets change it to ###
output = re.sub(r'loaded [0-9]+ commands', r'loaded ### commands', output)
return output
def compile_binary(binary_source, binary_out):
assert os.path.isfile(binary_source)
subprocess.check_call(['gcc', binary_source, '-o', binary_out])