前几天我在 reddit 上遇到了一个问题:我们如何在 GDB 中使用基于 PAGE_GUARD 的内存断点(而不是硬件断点)?
Ollydbg、x64dbg 和 IDA PRO 都支持这些类型的断点,但我在 GDB 中找不到方法。
如果这不可用,是否可以在 GDB 中手动设置 PAGE_GUARD 位?
前几天我在 reddit 上遇到了一个问题:我们如何在 GDB 中使用基于 PAGE_GUARD 的内存断点(而不是硬件断点)?
Ollydbg、x64dbg 和 IDA PRO 都支持这些类型的断点,但我在 GDB 中找不到方法。
如果这不可用,是否可以在 GDB 中手动设置 PAGE_GUARD 位?
根据 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