libc高版本劫持程式流思路學習

sfftlt_發表於2020-11-05

libc高版本劫持程式流思路學習

學習https://kirin-say.top/2020/06/29/0CTF-TCTF-2020-Quals-PWN/ 、 https://fmyy.pro/2020/10/26/Competition/ByteCTF-2020/#gun師傅部落格思路

 

針對2.29及以上版本libc

 

劫持_IO_2_1stderr 的 _chain欄位,即劫持原本是_IO_2_1_stdout的值到可控區域,偽造一個_IO_2_1stdout結構

 


偽造的stdout結構中的要注意過check,結構如下

 

程式在退出時會呼叫exit函式(return退出時也會呼叫exit函式),這樣在_IO_cleanup的時候就會劫持程式流,原理如下:結合高版本的libc中setcontext控制引數為rdx,而之後過程中呼叫malloc前rdx=[rdi+0x28],所以我們將malloc_hook劫持為setcontext+61就可以利用setcontext劫持程式流,效果如下:

    #偽造的_IO_2_1_stdout_結構
    IO = '\0'*0x28
    IO += p64(heap_base+0x360+0xe0)  ----->後面呼叫setcontext時的rdx值
    IO = IO.ljust(0xd8,'\0')
    IO += p64(IO_str_jumps)          ----->過check

相關文章