GUARD_PAGE 内存断点与 gdb?

逆向工程 艾达 数据库 记忆 断点
2021-07-07 15:21:45

前几天我在 reddit 上遇到了一个问题:我们如何在 GDB 中使用基于 PAGE_GUARD 的内存断点(而不是硬件断点)?

Ollydbg、x64dbg 和 IDA PRO 都支持这些类型的断点,但我在 GDB 中找不到方法。

如果这不可用,是否可以在 GDB 中手动设置 PAGE_GUARD 位?

1个回答

根据 man mmap

  PROT_NONE  The memory cannot be accessed at all.
  PROT_READ  The memory can be read.
  PROT_WRITE The memory can be modified.
  PROT_EXEC  The memory can be executed.

PROT_NONE将通过SIGSEGV在访问时点击 a 来充当保护页面

PROT_NONE运行时地图中的页面如下所示

    0x7ffff7ff7000     0x7ffff7ff8000 ---p     1000 0

gdb允许您在进程空间中调用任意函数。一个简单的解决方案是在 gdb 下运行它

print mprotect($address,0x1000,0)

这将PROT_NONE在页面上设置= 0 权限,它将充当保护页面。如果点击后SIGSEGV您想将页面重新映射为 rw (PROT_READ|PROT_WRITE)

print mprotect($address,0x1000,3)

如果你想添加一个额外的页面映射为保护页面,就像 windows 中的页面堆一样,你可以调用 mmap。

print /a mmap($address+0x1000,0x1000,0,0x22,-1,0)

这里 0x22 是 MAP_PRIVATE|MAP_ANONYMOUS