1. 程式人生 > >花式棧溢位技巧----Stack smash

花式棧溢位技巧----Stack smash

學習文獻:https://ctf-wiki.github.io/ctf-wiki/pwn/linux/stackoverflow/others/#stack-smash

以前遇見過一次這種情況,但是是不求甚解的完成了,這次慢慢分析一下原理

棧保護和NX欄位都開啟了,這裡科普一下棧保護,我喜歡叫它金絲雀,連結:https://blog.csdn.net/qq_42192672/article/details/82776113

大概清楚了這個保護的機制以後,顯然如果我們利用棧溢位覆蓋 argv[0] 為我們想要輸出的字串的地址,那麼在 __fortify_fail 函式中就會輸出我們想要的資訊

接下來就是怎麼覆蓋了

_IO_getc(stdin)可以棧溢位

memset中可以看見在while迴圈結束之後執行的語句,如下

但是小型ELF檔案在對映BSS欄位的時候可能會重定位,這是之後遇到的問題,這裡就提前說了,我們可以find一下

先找了一下自己輸入的flag,發現把我們需要的flag覆蓋掉了,但應為重定位,應該還是可以找打flag語句的

為了覆蓋argv[0] ,我們必須要確定 argv[0] 距離讀取的字串的偏移

對main函式設斷點

不難看出0x7fffffffde08存放著argv[0]的地址

接下來我們找我們讀入字串的起始地址

根據彙編程式碼,直接給IO_gets打斷點看rsp好了好了,可以看到是0x7fffffffdbf0,那麼偏移量就是0x218

exp

payload='a'*0x218+p64(0x400d20)
cn.recvuntil('''Hello!\nWhat's your name?''')
cn.sendline(payload)
cn.recvuntil('flag:')
cn.sendline('a')
data=cn.recv()
cn.interactive()