精選文章:
硬核二進制安全學習FunctionPrologue and Function Epilogue基礎函式呼叫機制
本文摘錄:
所謂PWN就是利用程式的漏洞控制程式的流程,簡單來說就是需要控制RIP暫存器,因為RIP暫存器會告訴CPU你接下來會做什么那么現在我們就有黑客思維了,竟然我們可以將RIP的address寫為0x6161616161,那么為何不把它改成有用的地址呢?
NTUSTISC Pwn basic 臺灣科技大學
Buffer Overflow:
實體程式:

這里我們只用char型別定義了一個0x10的空間大小
我們使用read指令讀取buf函式0x30地址,這樣就造就了Buffer
Overflow的條件,
首先執行完Function初始化
程式在堆疊中是這樣執行的,如下圖:


如果我們要去往0x10空間里放入資料,如字符a,顯而易見,只能放入16個a,因為0x10=16,
這時會發現stack還保留了old rbp指標開辟的空間,所以,程式讀取0x20也是沒問題的,

這時候程式要完成Base Stack(堆疊底)return address的Function Epilogue函式收尾作業,

#假設
rsp = 0x7fffffffefd8
rbp = 0x7fffffffefe8
rip = 0x40067
0x40067: leave
0x400678: ret
0x40067 : mov rsp,rbp
0x400678 : pop rbp
RIP暫存器即在64bit模式下,intel匯編命令名稱,32bit下稱作EIP,標志當前行程將要執行指令位置,
mov rsp , rbp

pop rbp
push暫存器:將一個暫存器中的資料入堆疊
pop暫存器:出堆疊用一個暫存器接收資料

使用pop指令之后,我們a的值會跳出stack進行執行,即
rbp的值=‘a’=‘0x61’
下一步是將RIP暫存器Return的值pop到RIP
RIP=我們溢位的值=‘0x616161616161616161’
這個時候,CPU會報錯,Segmentation Fault
Segmentation Fault 簡介:參考文章地址:添加鏈接描述
所謂的段錯誤就是指訪問的記憶體超過了系統所給這個程式的記憶體空間,通常這個值是由gdtr來保存的,他是一個48位的暫存器,其中的32位是保存由它指向的gdt表,后13位保存相應于gdt的下標,最后3位包括了程式是否在記憶體中以及程式的在cpu中的運行級別,指向的gdt是由以64位為一個單位的表,在這張表中就保存著程式運行的代碼段以及資料段的起始地址以及相應的斷限和頁面交換還有程式運行級別和記憶體粒度等資訊,一旦一個程式發生了越界訪問,CPU就會產生相應的例外保護,于是segmentation fault就出現了,

程式編譯時發生報錯了,那么就表明我們可以利用這個弱點,竟然我們現在已經可以把程式crash掉,那么如何控制程式流程運行呢?
所謂Pwn就是利用程式的漏洞控制程式的流程,簡單來說就是需要控制RIP暫存器,因為RIP暫存器會告訴CPU你接下來會做什么
那么現在我們就有黑客思維了,竟然我們可以將RIP的address寫為0x6161616161,那么為何不把它改成有用的地址呢?
所以我們利用的第一個技巧稱為Return to Text

Text指的是Text段,參考文章添加鏈接描述


假設我們知道secret_func()函式地址 0x4006e7
里面包含了我們的passwd,
那么我們為什么覆寫a的值呢?所以直接覆寫到地址0x4006e7
rip=0x6004e7

那么現在我們開始Pwn吧!(敬請期待)

CSDN:Hunter網路安全
微信公眾號:Hunter網路安全
關注獲取更多資訊
網站:bbs.kylzrv.com
CTF團隊:Hunter網路安全
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/247156.html
標籤:其他
