<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>

    pwn題ZJCTF2019 login的分析

    VSole2023-01-05 09:28:01

    題目復現

    文件一開始需要登錄,需要用戶名和密碼。

    先checksec,存在canary。

    主函數如下,一眼可以得到密碼,下面會慢慢分析。

    首先是16行的Admin的構造函數,調用了User的構造函數。

    User構建的結構體,包含0x401170處的get_password函數的指針,傳入的用戶名與密碼,它們的上限大小都是0x50。

    Admin結構體與User的區別在于指針改為了0x401150,但還是get_password指針。

    感覺這個Admin結構體意義不明,但數據結構的構思和我們關系不大就是了

    后續可能存在函數指針的利用。

    接著看主函數25行的User::read_name,讀取輸入的0x49個字符,然后賦值給bss段的login+1處,login是一個全局User結構體,實現了名字讀入。

    接著到了本題的重點,指針v3(實際只被寄存器暫存)存儲函數指針main::{lambda(void)#1}::operator,然后經過password_checker得到二級指針v7。

    查看password_checker,3*8的數組v2中,在v2處存儲了a1(主函數的v3)指針。

    看匯編語言更為直觀,rax存儲了[rbp-0x18]處的地址。

    接著是read_password函數,與read_name函數基本一致。

    get_password函數很簡單。

    在看最后的password_checker()前,我們用正確密碼測試文件,顯示段錯誤。

    查看password_checker,login與admin的密碼比較后,來了個奇葩的有毒打印,接著前面的二級函數終于被調用了。

    我們需要知道報錯原因,gdb調試發現正好是二級指針調用出錯。

    此外題目中有現成后門。

    因此這題的漏洞基本算是送到臉上了,但對匯編不了解的我硬是做了兩天。

    利用思路

    經過上面的初步分析,我們知道程序在password_checker中調用一個二級指針失敗而段錯誤終止,考慮到canary的存在,srop不可能短期實現。即使我們無法利用這個二級指針getshell,它的存在也會讓程序終止。由于存在后門函數,只要能改變這個二級指針,這題就getshell了。

    調試過程

    在網上多位師傅博客的參考下,我學會了用匯編溯源的技巧。c語言代碼雖然易懂,但最硬核與直接的還是匯編。

    調試前我們要明白一個概念:對于一個函數內調用的函數,他們的棧是平行的:由于push rbp; mov rbp, rsp;sub rsp, x子函數的ebp相同,esp根據位移不同而不同。

    因此,子函數的棧空間會存在反復利用的情況;如果父函數中出現了子函數棧空間的指針變量,下一次調用子函數時,這個指針變量指向的值就有可能改變!

    回到調試,我們觀察main函數的匯編,指針存于[rbp-0x130],它來自于password_checker的rax。

    此處與我們初步調試的結果相同,rax的來源是[rbp-0x18]的地址(我原來不明白lea的意思……想了很久)。在最終二級指針調用時,會獲得rbp-0x18的值,再獲得[rbp-0x18]內的地址。我們可以覆蓋后面子函數中[rbp-0x18]的值。

    payload

    from pwn import *context.log_level = 'debug' io = process('./login')#io = remote('node4.buuoj.cn',25895)#pause()#gdb.attach(io, 'b *0x400b42') io.sendlineafter('username: ', 'admin')payload = b'2jctf_pa5sw0rd\x00'.ljust(0x48, b'\x61') + p64(0x400e88)io.sendafter('password', payload)io.interactive()
    
    指針
    本作品采用《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
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类