一、mprotect() 函数
(1)mprotect() 函数简介
在二进制漏洞利用(Pwn)中,mprotect() 函数是一个非常重要的系统调用,它用于修改内存区域的访问权限。这在漏洞利用中很有用,例如当你想要在一段原本不可执行的内存区域中执行 shellcode 时,就可以使用 mprotect() 函数将该区域的权限修改为可执行。
(2)mprotect() 函数的原型
1 |
|
参数说明:
| addr | len | prot |
|---|---|---|
| 修改权限的内存区域的起始地址,该地址必须是系统页大小(通常是 4096 字节)的整数倍 | 修改权限的内存区域的长度,单位是字节 | 指定新的内存访问权限 |
内存访问权限:
| PROT_READ | PROT_WRITE | PROT_EXEC | PROT_NONE |
|---|---|---|---|
| 允许读取该内存区域 | 允许写入该内存区域 | 允许执行该内存区域中的代码 | 禁止对该内存区域进行任何访问 |
注:一般prot直接修改为7,即可读可写可执行
二、例题ctfshow49
(1)思路
我们可以通过栈溢出调用mprotect() 函数,将bss段修改为可读可写可执行,通过read函数将shellcode写入bss段,最后将返回地址改为bss段就可以
但是mprotect函数需要设置三个参数,我们要找到一个含有三个pop一个ret指令的地址,将原有的参数pop走,再写入新的参数
我们使用ROPgadge命令找到三个连续的寄存器 ROPgadget –binary pwn –only “pop|ret”

pop_ebx_esi_ebp_ret = 0x080a019b
第一个参数:addr=0x80d8000
第二个参数:len=0x1000
第三个参数:port=7
同样read函数也需要设置三个参数
在 C 语言里,read 函数的原型如下
1 |
|
参数解释:
fd:文件描述符,用于指定从哪个文件或设备读取数据(0标准输入;1标准输出;2错误输出)
buf:指向用于存储读取数据的缓冲区的指针
count:期望读取的最大字节数
第一个参数:fd=0
第二个参数:buf=0x80d8000(bss段任意一个地址就可以)
第三个参数:count=0x1000
(2)exp
1 | from pwn import* |