[Black Watch 入群题]PWN 栈劫持的利用
32位程序,開啟了nx保護
沒有system函數和‘/bin/sh’的字符串,這邊需要我們自己去想辦法構造system(‘/bin/sh’)
思路
第一次輸入的參數s,那邊我們可以寫入很長的數據,我們可以將我們的rop鏈布置在那里, 接著執行第二次輸入,利用站劫持,把程序的執行流程劫持到第一次輸入的位置就可以了
站劫持利用
做棧劫持主要用到的是一個leave;ret指令,一般程序執行完成后都會調用leave;ret來還原現場
payload1=‘a’*0x18+p32(s-4)+p32(leave_ret)
給buf參數賦值的時候,溢出后將ebp覆寫成s-4的地址,函數返回地址覆寫成leave;ret指令的地址
理一下這樣寫程序的執行過程:
首先程序正常結束了,去調用程序本身的leave;ret來還原現場,
根據我們對棧的布局,
mov esp,ebp->將rsp指向了rbp,棧變成了這個樣子
pop ebp->ebp寄存器被我們設置成了參數s-4的地址,指向了我們布置好的棧上方,這邊-4是因為我們第二次執行pop ebp給ebp賦值的時候,會將rsp+4,如果不減去4,esp就在程序一開始的時候指向的不是棧頂,而是棧頂+4的位置,我們之后讀取數據會丟失一開始的4字節,所以需要一開始的時候將指針往上抬4字節,棧變成了這個樣子
ret(pop rip)->去調用leave;ret指令
再次執行leave;ret指令
mov esp,ebp->esp指向了參數s-4的位置,棧布局現在是這樣
pop ebp->彈出棧頂的值給ebp,esp+4 向下一步執行之后棧變成了這樣,我們成功將esp指針劫持到了我們布置好的棧上
ret(pop rip)->將esp指向的輸值彈給rip
接下來它就會去執行我們布置好的泄露libc的步驟,我們去接收它輸出的write函數地址,就知道了libc版本,接下來就能去構造system(’/bin/sh‘)了,接下來在重復一下上述的控制流程,就能拿到shell了
總結
以上是生活随笔為你收集整理的[Black Watch 入群题]PWN 栈劫持的利用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Buuctf(pwn) jarvisoj
- 下一篇: buuctf [GKCTF 2021]你