计算缓冲区所属的页地址

逆向工程 linux 开发
2021-07-04 12:59:20

我正在尝试 ROP 漏洞——我正在尝试使用 ROP(而不是 libc 调用)进行 mprotect 系统调用,以尝试使缓冲区可执行。我尝试跟踪服务器进程并运行漏洞利用程序,结果发现错误如下:-

mprotect(0xbffdda10, 65536, PROT_READ|PROT_WRITE|PROT_EXEC) = -1 EINVAL(Invalid argument)

后来,我尝试了一个不同的地址0x08048000,我可以看到调用有效(strace 输出和 /proc/pid/maps 确认了这一点)。Given a buffer address how could I guess/find the correct page address that I could use to make a call to mprotect.

我想我找到了发生这种情况的原因。ASLR 已启用并且从 0x08048000 开始的页面不会更改地址。但是,与缓冲区对应的页面会更改地址。缓冲区地址可能会泄漏——因此我尝试检查页面开头和缓冲区地址之间的差异是否保持不变,但事实并非如此。

1个回答

我不确定,但您可能遇到以下问题:通常页面地址按页面大小四舍五入。这取决于您使用的系统中的页面大小。因此,您可以通过对常量进行 AND 运算来计算此地址~(PAGE_SIZE-1)

如果它不起作用,请尝试拨打 callmprotect两次:

  1. 首先不执行读写,
  2. 更改内存,然后调用mprotect执行位但没有写位。