Skip to content

Commit

Permalink
- fixed errors in the pie subcommands
Browse files Browse the repository at this point in the history
- added tests for `pie`
  • Loading branch information
hugsy committed Jan 30, 2022
1 parent bab267b commit 0742750
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 12 deletions.
19 changes: 11 additions & 8 deletions gef.py
Original file line number Diff line number Diff line change
Expand Up @@ -4868,14 +4868,15 @@ def do_invoke(self, _: List[str], **kwargs: Any) -> None:
args = kwargs["arguments"]
if args.breakpoints[0] == -1:
# No breakpoint info needed
bps = [gef.session.pie_breakpoints[x] for x in gef.session.pie_breakpoints]
bps = gef.session.pie_breakpoints.values()
else:
bps = [gef.session.pie_breakpoints[x] for x in args.breakpoints]
bps = [gef.session.pie_breakpoints[x]
for x in args.breakpoints
if x in gef.session.pie_breakpoints]

lines = []
lines.append("VNum\tNum\tAddr")
lines = ["{:6s} {:6s} {:18s}".format("VNum","Num","Addr")]
lines += [
f"{x.vbp_num}\t{x.bp_num if x.bp_num else 'N/A'}\t{x.addr}" for x in bps
f"{x.vbp_num:6d} {str(x.bp_num) if x.bp_num else 'N/A':6s} {x.addr:18s}" for x in bps
]
gef_print("\n".join(lines))
return
Expand All @@ -4894,15 +4895,17 @@ def do_invoke(self, _: List[str], **kwargs: Any) -> None:
args = kwargs["arguments"]
if args.breakpoints[0] == -1:
# no arg, delete all
to_delete = [gef.session.pie_breakpoints[x] for x in gef.session.pie_breakpoints]
to_delete = list(gef.session.pie_breakpoints.values())
self.delete_bp(to_delete)
else:
self.delete_bp([gef.session.pie_breakpoints[x] for x in args.breakpoints])
self.delete_bp([gef.session.pie_breakpoints[x]
for x in args.breakpoints
if x in gef.session.pie_breakpoints])
return


@staticmethod
def delete_bp(breakpoints: List) -> None:
def delete_bp(breakpoints: List[PieVirtualBreakpoint]) -> None:
global gef
for bp in breakpoints:
# delete current real breakpoints if exists
Expand Down
48 changes: 45 additions & 3 deletions tests/commands/pie.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,60 @@
`pie` command test module
"""

import random

from tests.utils import GefUnitTestGeneric, gdb_run_cmd
from tests.utils import GefUnitTestGeneric, gdb_run_cmd, removeuntil


class PieCommand(GefUnitTestGeneric):
"""`pie` command test module"""


cmd = "pie"
def setUp(self) -> None:
# we assume `_target` is `default.out` and is (should be) a PIE binary
res = gdb_run_cmd("disassemble main")
start_str = "Dump of assembler code for function main:\n"
end_str = "End of assembler dump.\n"
lines = removeuntil(start_str, res[:res.find(end_str)]).splitlines()
self.assertGreater(len(lines), 1)
idx = random.randint(0, len(lines)-1)
self.pie_offset = int(lines[idx].split()[0], 16)
return super().setUp()


def test_cmd_pie(self):
res = gdb_run_cmd(f"{self.cmd}")
res = gdb_run_cmd("pie")
self.assertNoException(res)
self.assertIn("pie (breakpoint|info|delete|run|attach|remote)", res)
res = gdb_run_cmd("pie info 42")
self.assertNoException(res)
res = gdb_run_cmd("pie delete 42")
self.assertNoException(res)


def test_cmd_pie_breakpoint_check(self):
# breakpoint at a random instruction and check
res = gdb_run_cmd(f"pie breakpoint {self.pie_offset}", after=("pie info"))
self.assertNoException(res)
last_line_addr = res.splitlines()[-1].strip().split()
self.assertEqual(last_line_addr[0], "1")
self.assertEqual(last_line_addr[-1], hex(self.pie_offset))


def test_cmd_pie_breakpoint_delete(self):
res = gdb_run_cmd(f"pie breakpoint {self.pie_offset}", after=("pie delete 1", "pie info"))
self.assertNoException(res)
self.assertNotIn(hex(self.pie_offset), res)


def test_cmd_pie_breakpoint_run(self):
# breakpoint at a random instruction and run
res = gdb_run_cmd("pie run", before=(f"pie breakpoint {self.pie_offset}",))
self.assertNoException(res)
# check we stopped for a breakpoint
res = removeuntil("[#0] Id 1, Name: \"default.out\", stopped ", res).splitlines()[0]
self.assertIn("in main (), reason: BREAKPOINT", res)
# check the mask of the breakpoint address
address = int(res.split()[0], 16)
self.assertEqual(address & self.pie_offset, self.pie_offset)

2 changes: 1 addition & 1 deletion tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -287,4 +287,4 @@ def removeuntil(substring: str, buffer: str, included: bool = False) -> str:
if not included:
idx += len(substring)

return buffer[idx:]
return buffer[idx:]

0 comments on commit 0742750

Please sign in to comment.