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/test_loads.py

104 lines
3.3 KiB
Python

import os
import re
import pytest
import tests
from .utils import compile_binary
from .utils import launched_locally
from .utils import run_gdb_with_script
HELLO = [
"pwndbg: loaded ### commands. Type pwndbg [filter] for a list.",
"pwndbg: created $rebase, $ida gdb functions (can be used with print/break)",
]
BINARY_SOURCE = tests.binaries.div_zero_binary.get("binary.c")
BINARY = tests.binaries.div_zero_binary.get("binary")
CORE = tests.binaries.div_zero_binary.get("core")
def test_loads_pure_gdb_without_crashing():
output = run_gdb_with_script().splitlines()
assert output == HELLO
def test_loads_binary_without_crashing():
if not os.path.isfile(BINARY):
compile_binary(BINARY_SOURCE, BINARY)
output = run_gdb_with_script(binary=BINARY).splitlines()
expected = [
"Reading symbols from %s..." % BINARY,
"(No debugging symbols found in %s)" % BINARY,
]
expected += HELLO
assert all(item in output for item in expected)
def test_loads_binary_with_core_without_crashing():
if not os.path.isfile(BINARY):
compile_binary(BINARY_SOURCE, BINARY)
if not os.path.isfile(CORE):
create_coredump = ["run", f"generate-core-file {CORE}"]
run_gdb_with_script(binary=BINARY, pyafter=create_coredump)
assert os.path.isfile(CORE)
output = run_gdb_with_script(binary=BINARY, core=CORE).splitlines()
expected = [
"Reading symbols from %s..." % BINARY,
"(No debugging symbols found in %s)" % BINARY,
"Program terminated with signal SIGFPE, Arithmetic exception.",
]
expected += HELLO
assert all(item in output for item in expected)
lwp_line = re.compile(r"^\[New LWP \d+\]$")
assert any([lwp_line.match(line) for line in output])
binary_line = re.compile("^Core was generated by .+$")
assert any([binary_line.match(line) for line in output])
crash_address_line = re.compile(r"^#0 0x[0-9a-fA-F]+ in main \(\)$")
assert any([crash_address_line.match(line) for line in output])
def test_loads_core_without_crashing():
if not os.path.isfile(BINARY):
compile_binary(BINARY_SOURCE, BINARY)
if not os.path.isfile(CORE):
create_coredump = ["run", f"generate-core-file {CORE}"]
run_gdb_with_script(binary=BINARY, pyafter=create_coredump)
assert os.path.isfile(CORE)
output = run_gdb_with_script(core=CORE).splitlines()
expected = [
"Program terminated with signal SIGFPE, Arithmetic exception.",
]
expected += HELLO
assert all(item in output for item in expected)
lwp_line = re.compile(r"^\[New LWP \d+\]$")
assert any([lwp_line.match(line) for line in output])
binary_line = re.compile("^Core was generated by .+$")
assert any([binary_line.match(line) for line in output])
crash_address_line = re.compile(r"^#0 0x[0-9a-fA-F]+ in \?\? \(\)$")
assert any([crash_address_line.match(line) for line in output])
def test_entry_no_file_loaded():
# This test is just to demonstrate that if gdb fails, all we have left is its stdout/err
output = run_gdb_with_script(binary="not_existing_binary", pyafter="entry").splitlines()
expected = ["not_existing_binary: No such file or directory."]
expected += HELLO
expected += ["entry: There is no file loaded."]
assert all(item in output for item in expected)