protection
aslr
位址隨機化depaddress space layout randomization,程式每次執行時,stack、heap、library的位置都不一樣
$:ldd /bin/lib ldd命令 檢視當前的binary用了哪些library
檢查是否開啟aslr
data execution prevention資料執行保護,又稱為nxpie可寫的不能執行,可執行的不可寫
位址無關可執行檔案stack guard
編譯器對stack overflow的一種保護機制,可以有效的防止緩衝區溢位攻擊rop(return oriented programming)是一種利用現有的程式片段組合出想要功能的技巧
可以使用rop解除dep限制,然後執行shellcode
可以使用rop繞過aslr限制、stackguard和pie
q:如何檢視有哪些保護 gdb checksee.sh
ropgadget:一小段以ret結尾的coderop chain:串聯在一起的gadget,組合出需要的功能
使用rop的關鍵
rop型別
rop查詢rop
我們要找的**是 ①pop eax ②2 把當前棧底的值給eax,即eax=2
執行它ida分析它 或者objdump –d –m intel ./file
ropgadget –binary ./shellcode > shellcode.txt #將gadget輸出到文字
查詢pop eax ; ret ebx/ecx/edx…
read 函式 eax =3 ebx=0 ecx=一段可寫的區域 edx=讀取的大小
如何尋找可寫的區域?
./file &返回後台執行的id
然後cat /proc/id/maps
第一段是讀-執行段
第二段是讀-寫段 獲得080ee000 不要看下面的heap那些
from pwn import *
r = remote('127.0.0.1',4000)
pop_eax_ret = 0x080b90f6
pop_ebx_ret = 0x080481c9
pop_ecx_ret = 0x080595b3
pop_edx_ret = 0x0806e7da
buf = 0x080ee000 - 100
rop = [#堆疊情況
然後找完eax,ebx,ecx,edx後 尋找int 0x80 ; ret
沒有怎麼辦?
獲得0x0806ef00
read函式讀到80edf9c,雙擊這個位址即可看到輸入的/bin/sh
然後寫執行函式
eax=0x0b ebx要執行的命令 放在buf裡的/bin/sh ecx/edx賦值為0
如果不放int_0x80_ret,堆疊排列的再好也不會生效
ropgadget –binary ./shellcode > shell.txt
在gadget查詢有用的,如pop eax ; ret | pop ebx ; ret |int 0x80 ; ret (或者ropgadge –binary rop –opcode cd80c3 )
查詢可寫入的緩衝區:方法是 ./rop & 檢視程序id ,然後cat /proc/id號/maps 獲得可寫段 然後倒著-多少
最後在堆疊的排布上要寫int_0x80_ret 否則程式無法執行
pop edx; pop ecx;pop edx;入棧順序為先寫edx,再寫入ecx,最後寫入ebx
buuoj 第六章 CTF之PWN章 ROP
保護。啥沒有。在除錯過程中發現最後會出問題,然後gdb.attach貼上以後開始調。這個地方卡住是因為沒有棧對齊,你可以看到此時rsp是78,但是他要求16位對齊,最後得是0,所以需要在system位址前面加上個ret。具體的看下面的wp expfrom pwn import context.log...
pwn 練習6 攻防世界 level3
這個題做的蠻久的,老樣子,基本操作來一遍 通過ida分析後,沒有system函式,也沒有 bin sh這樣的字眼,但題目給了乙個動態庫,於是我們可以通過另乙個庫,來調出system bin sh 兩個呼叫的動態函式庫相同,所以write函式和system函式之間的位址差值是相同的,所以我們的目的是求...